How to rip an audiobook to iTunes so it has bookmarks

RecallI won’t debate the ethics of ripping and sharing CDs in this post. Suffice it to say that folks who know me know my stand on this issue.

Where I can get audiobooks already in MP3 format I just do that. It saves a LOT of hassle. I even will get them in DRM’d format as I don’t tend to listen to audiobooks more than once.

But there is still a lot of content out there that you can get only on CD that I want to listen to on my iPod (I don’t have a CD player in my car, nor do I intend to get one), so I consider it fair use to purchase the CD and rip it for my own use on my iPod.

Steps:

  • I tend to listen to lengthy audiobooks (ones that I really wouldn’t have the time to read) so they often have many CDs. In iTunes I go to Edit > Preferences…  then click on the “Advanced” tab and then on the importing sub-tab I temporarily set:
  • “On CD Insert” = “Import CD and Eject”,
  • “Import using” = “AAC Encoder”,
  • “Setting” = “High Quality (128 kbps)”  <– personal preference, you can set for “Spoken Podcast” but I like the higher sound quality better.
  • Start putting your CDs in and, with luck, you’ll be offered albums from CDDB that will label your tracks for you. When  there is a conflict (sometimes different CD tracks are uploaded for the same CDs – usually by folks with differing ideas about how the tracks should be labeled), you’ll be offered a choice of available albums. You aren’t given anything more than the album name (no track details) at this stage, so pick one and make sure that you pick the same “style” from now on so that all your tracks will be labeled consistently. I’ll post a subsequent article about how to correct an incorrect choice in a few days.
  • Once you’ve pulled in all of your CDs fire up xnview (a free graphic and photoviewer) and navigate to where your tracks are located. If you don’t know where this is, right-click on the track in iTunes and choose “Show in Windows Explorer” (sorry Mac users). You may find that your tracks have been stored in more than one folder depending on the naming that you got from CDDB. In xnview, select all of the *.m4a files (aac encoded) and right click to select “Rename…”.
  • You’ll be presented with a dialog titled “Batch Rename” (as of xnview version 1.91.6). In the upper right corner check the “Extension” box and type “m4b”. You’ll see all the files you selected with the old name and the proposed new names showing at the bottom of this dialog. Click “Rename”.
  • Back in iTunes, select all of the tracks that you’ve just renamed and delete them (you’ll see little exclamation points appearing beside them as iTunes figures out that it can no longer find the files).
  • Then select File > Add Folder to Library… and choose the folders with the renamed files in them.
  • For ease of listening I create a smart playlist for these audiobooks:
  • I usually use the “Album Name contains” and use some significant part of the audiobook name
  • I also specify that the play count < 1
  • Make sure you sort by the track name. If you end up with a bad sorting order (sometimes happens with > 9 chapters), consider making two smart playlists and then use the Rating to separate them – one star rating for the first 9 chapters, none for the rest and then add this as a criteria for the smarplaylist.

Then, when I’m driving (my most frequent listening venue) all I need to do after I’ve selected the playlist and listened to the playlist starting from the beginning. If, in “settings” on the iPod, I have “Shuffle” set to “songs” then my iPod will stop after each track (my preferred method). I hit the middle button 4 times and I get the next track (the “count” parameter above excludes the one(s) I’ve already listened to). If I have “Shuffle” set to “none” then the iPod will play each track in sequence.  This is different between my older generation iPod (which does not refresh the list dynamically) and my current one (iPod Video – 30 GB) so YMMV.

Hopefully you find this useful.

Want a quiet dinner with just your spouse/friend? Head to Disney World

This Story doesn’t have a lot of meat to it, but what it *does* say speaks volumes.

I have a feeling, since the average American now has WAY TOO MUCH disposable income to help them decide where they should take their kids, that this is only the beginning of such exclusions. Maybe we’ll see kids welcome at normal “family times” and not in the later evening when folks would expect to be able to have a pleasant adult atmosphere. A time when most kids are most certainly getting cranky and restless because *gasp* they’re kids and their moron parents insist on inflicting adult venues and expectations on them.

I feel for the kids, but more, I feel for everybody else who paid to sit next to them…

Near Relativistic Travel Question

I was listening to The Skeptic’s Guide to the Universe episode #128 where they discussed the realities of near relativistic speed travel. One thing I was not clear on was, what happens if you need to have a fleet of ships exploring all of them traveling to the same destination from the same destination?

2 scenarios:

1) You travel some tiny percentage of light faster than your companion ships.  Do you arrive, and now that you’re not traveling at the same speed as the other ships, have to wait potentially thousands of years for your fellow ships?

2) You’re all accelerating at exactly the same rate and traveling at exactly the same speed. But because of relativity, all other ships experience thousands or even millions of years for your journey and you, likewise experience such for their journeys? So, in effect, you’d all vanish relative to each other and you’d never see each other again?

I’ve sent them an email with this question but I’m sure they get so many that they won’t be able to respond (ah, the problems of popularity…).

Prediction: Within 2 years it will be pretty common for thieves to be using RFID

RecallI heard recently about thieves who were using handheld RFID scanners to determine the contents of tractor trailer trucks to see which ones would be worth breaking into.

Such a double-edged sword can be these devices which offer so much convenience for retailers to maintain their inventory.

One of the practices that keep shoppers safe, especially at Christmas when the buying frenzy is at its peak, is to keep purchases out of sight. The trunk of your car is usually good for this. It’s pretty risky to break into a car, especially if a thief doesn’t know that he’ll be rewarded for his efforts.

But picture someone walking through the mall parking lot, a small scanner in hand (or up sleeve) surreptitiously reading the RFID tags for everything within each vehicle. Heck, with the right technology, I’m sure you can do this from within a moving car so one can pretend they are simply slowly looking for a parking spot. Then, once recorded and evaluated against increasingly available RFID tag databases, all the thief needs to do is go directly to the vehicle(s) in question and surgically extract the items of value.

I suppose the next step will be the “Shopper’s Package” that will be offered on vehicles much like you can get a “Sports Package” today. This “Shopper’s Package” will have some kind of stealthing or interference technology that will prevent exactly the scenario above.

There is never a shortage of possibilities…

Sorry about the website this past weekend

Lunarpages elected to relocate my site to a new server which promptly messed it up.

I had two tickets open with them neither of which got very quick action.

I originally chose Lunarpages because they are rated VERY highly by sites that rate such things but so far I’ve received no help at all. My response to the original notification indicating that my website was messed up appears to have been logged but no action was taken (my email to them was sent about 15 minutes after they notified me).

I called on Friday and was told that they’d look at it and get back to me in a couple of hours (thanks for efficiently getting me off of the phone James).

I reworked this post a bit because I wanted to place it on my blog while I was still having problems (thought I might be able to find a way to do this) but no go.

But, they eventually switched me back to my original server sometime this morning and apologized for the inconvenience.

So the site was down for 80+ hours. 🙁

This is the first real issue I’ve had with them so I’ll assume this is a fluke this time..

Autoresponder LotusScript

Below is code to create an automated response whenever someone sends a message to a now obsolete mail file.

It can also be used for a “live” mailbox to indicate something like “We’ve received your message and will respond in 24 hours.”

The only requirements are that the Person document (or mail-in document) must still be present in the directory and a valid name is used in the “Run on Behalf of” field of the agent properties.

Usually this is done for someone who is no longer with the company and so is already in the “Deny Access” groups so using the mailfile owner’s name is often not an option.

It is set up to respond to EVERY message sent to it (unlike the Out of Office Agent) to assure the sender that there message HAS been received.

This particular variation was developed after someone with an autoresponder sent a message to one of our autoresponder  mailboxes and ended up with an endless loop. Messages with identical sender and subject will receive only 1 response per day.

Make sure you customize everything in the agent below that has been bolded.

Agent Information
Name:    Autoresponder – Ensure Unique
Last Modification:    01/03/2008 04:39:40 PM
Comment:    [Not Assigned]
Shared Agent:    Yes
Type:    LotusScript
State:    Disabled
Trigger:    Before New Mail Arrives
Acts On:    Each incoming mail document
LotusScript Code:

Option Public
Option Declare

‘This autoresponder will protect against responses from *other* autoresponders by
‘checking to see if we’ve already received a message from them with the same subject already that day.
‘see the “IsMessageUnique” logic for details
‘Also checks for $AssistMail field which indicates that the message was sent by some
‘automated process. This comes from the case where someone sent a message FROM
‘this inbox TO this inbox and started an endless loop.
‘Note also that there is a name in the “Run on Behalf of” field on the security tab.
‘If this field is populated it *must* be represented in the ACL (At least Reader, probably author is safer) or you
‘will get weird errors when the agent runs.

Sub Initialize
    Dim sess As New NotesSession
    Dim docNotify As NotesDocument
    Dim docCur As NotesDocument
    Dim sPrintText As String
    Dim sMessage As String
    Dim sSendTo As String
    On Error Goto ErrGeneral
    On Error 4294 Goto ErrBadAddress
    Set docCur = sess.DocumentContext
    If Not docCur Is Nothing Then
        If Not Lcase$(docCur.Form(0)) = “nondelivery report” Then  ‘Don’t bother for failed delivery reports
            ‘Only internet messages
        ‘    If docCur.hasitem(“SMTPOriginator”)  Or docCur.hasitem(“MIME_Version”) Or docCur.hasitem(“$MIMETrack”) Then
            If Not docCur.HasItem(“$AssistMail”) Then ‘isn’t sent by another agent
                If IsMessageUnique(docCur) Then
                    Gosub ResponseMessage
                End If
            End If
        ‘    End If
        End If
    End If
LeaveSub:
    Exit Sub

ResponseMessage:
    Gosub SetupMessage
    Set docNotify = sess.CurrentDatabase.CreateDocument
    docNotify.SaveMessageOnSend = False
    docNotify.Form = “Memo”
    If Not docCur.ReplyTo(0)=”” Then
        sSendTo = docCur.ReplyTo(0)
    Else
        sSendTo = docCur.From(0)       
    End If
    docNotify.SendTo = sSendTo
‘Do not need the following fields since this is to be signed by the database owner.
‘if we ever change the signer to “Automail” then these should be set up properly
‘    docNotify.Principal=
‘    docNotify.ReplyTo=
    docNotify.Subject = “re: ” & docCur.subject(0)
    docNotify.Body = sMessage
    Call docNotify.Send(False)
    docCur.EFXResponded= Now
    Call docCur.Save(True,False)
    Return

SetupMessage:
    sMessage= “This is no longer a valid email address for John Doe.  ” &_
    “If you would like you may contact him at john.doe@gmail.com, phone – 555-555-5555.“& Chr$(13) & Chr$(13)
    Return

ErrBadAddress:
    Resume LeaveSub

ErrGeneral:
    sPrintText=    “Error: ” + Cstr(Err) + ” defn: ” + Error$ +  “.  Aborting Agent”
    Call ProblemNotify(sPrintText)   
    Resume LeaveSub
End Sub

Function IsMessageUnique(docCur As NotesDocument) As Boolean
    ‘Check to see if document is the only one with this sender and subject. If so return True
    ‘Otherwise, return false. We expect that multiple messages in a day from the same source with the same subject are probably
    ‘automated responses.
    ‘We only look at the most recent day’s worth of documents, if this doc is for a new day, great,
    ‘or if no match is found for the current day, also great
    Dim sess As New notessession
    Dim viewInbox As NotesView
    Dim docChk  As NotesDocument
    Dim docComp As notesdocument
    Dim bAscending As Boolean
    Dim datRcvd As  Notesdatetime
    Dim datDoc As NotesDateTime
    Dim datComp As NotesDateTime
    IsMessageUnique=True
    Set viewInbox =sess.CurrentDatabase.GetView(“($Inbox)”)
    If viewInbox Is Nothing Then  ‘Returns false
        IsMessageUnique=False
        Exit Function   
    End If
    Set docChk = viewInbox.GetFirstDocument
    Set datDoc = New NotesDateTime(docChk.Created)
    Set docComp= viewInbox.GetLastDocument
    Set datComp = New NotesDateTime(doccomp.Created)
    If datDoc.TimeDifference(datComp) > 0 Then ‘First Document is older than last document, sorted in Descending order
        bAscending = False
    Else
        bAscending = True
    End If
    Set datRcvd = New NotesDateTime(docCur.Created)  ‘get created date from newly received document
    Call datRcvd.SetAnyTime
    If bAscending Then
        Set docChk = viewInbox.GetLastDocument
    Else
        Set docChk = viewInbox.GetFirstDocument
    End If
    While Not docChk Is Nothing
        Set datDoc = New NotesDateTime(docChk.Created)
        Call datDoc.SetAnyTime
        If Not datDoc.TimeDifference(datRcvd) = 0 Then ‘not sent on same date – either new day or have reached previous day
            IsMessageUnique=True
            Exit Function
        End If
        If docChk.From(0) = docCur.From(0) Then ‘Match, might not be not unique, check subject.
            If docChk.Subject(0) = docCur.Subject(0) Then ‘Match, definitely not unique, end now.
                IsMessageUnique=False
                Exit Function
            End If
        End If
        If viewInbox Is Nothing Then  ‘Returns false
            IsMessageUnique=False
            Exit Function   
        End If
        If bAscending Then
            Set docChk = viewInbox.GetPrevDocument(docChk)
        Else
            Set docChk = viewInbox.GetNextDocument(docChk)
        End If
    Wend
End Function
Sub ProblemNotify(sPrintText As String)
    Dim sess As New NotesSession
    Dim db As NotesDatabase
    Dim docProblem As NotesDocument
    Dim item As NotesItem
    If sess.isonserver Then ‘send an e-mail or print to Log   
        Set db = sess.currentdatabase
        Set docProblem = db.CreateDocument       
        Set Item = docProblem.ReplaceItemValue(“Form”,”Memo”)
        Set Item = docProblem.ReplaceItemValue(“SendTo”,”Your Default Notification Mailbox“)
        Set Item = docProblem.ReplaceItemValue(“Principal”,sess.currentagent.name & ” Agent”)
        Set Item = docProblem.ReplaceItemValue(“Subject”,”Error: ” & db.Title & ” DB – ” & sess.currentagent.name & ” Agent”)       
        Set Item = docProblem.ReplaceItemValue(“Body”,”On ” & db.server & “!!” &db.filepath & Chr$(13) & Chr$(13) & sPrintText)
        Call docProblem.Send(False)
    Else
        Print sPrintText
        Messagebox sPrintText,0,”Problem with ” & sess.currentagent.name & ” Agent”
    End If
End Sub

Powered by ScribeFire.

*Sniff* Gate House takes it in the shorts

RecallAs someone who was in residence in Gate House for two years (I had the great two level corner room all to myself for that second year) I read this with both some alarm and some amusement. This article was forwarded to me by another Gate House Alum whom I won’t name in case he doesn’t want to be associated with the Gate House legacy…

I have to admit to feeling somewhat proud to find out that Gate House may have inspired aspects of “Animal House“. Things didn’t seem quite so wild when I was there although I clearly remember one of the guys running down the hallway during one of the year’s false fire alarms and expertly leaping and ripping the offending bell clean off the wall. That cost us all our security deposits.

I have very little to recount on the misogyny front, most of the antics were of the more wholesome Animal House toga party kind.

I *do* recall being a barkeep for a brief stint at one such event where I stumbled in on my room mate obviously on the make with someone who was NOT his girlfriend. Ever glib in such situations I blurted out “YOU’RE not RUTH?!” after which my roomie helped usher me out of the room. I found myself waking up the following morning in the shower which was known for going from a pleasant temperature to scaldingly hot to freezing cold over the course of any toilet flush.

I hope the move to coed is a positive one. I know from talking to other coed and non-coed residents that the co-ed houses were dramatically more civilized than the others (both male and female), but the rawer nature of the non co-ed residences surely is an experience that one is unlikely ever to find again in “real life”.

Make the NotesURL property usable

I wanted to be able to get the url for the current document(s) in my mail database so I could paste them in another application and then click on the URLs to access the original messages directly from within that other app as needed.

I cobbled together a little LotusScript agent that grabs the NotesURL from each document and then scrubs out that junk that Lotus includes for no discernible reason.

So

notes://NotesServer@mydomain/__85256EDA00695075.nsf/0/EEF8D00A7E50A458852573BE0069A402?OpenDocument

becomes

notes://NotesServer/85256EDA00695075/0/EEF8D00A7E50A458852573BE0069A402?OpenDocument

This script will show the result in a messagebox. I also have it insert the URL into the clipboard for me but I’ve scraped that out so as not to confuse the issue.

It’s not as pretty as I’d like, but this should help others trying to get a useful URL out of Lotus’ terrible implementation.

Dim sess As New NotesSession
Dim doc As NotesDocument
Dim coll As NotesDocumentCollection
Dim sTempURL As String
Dim sURL As String
Dim iPosAT As Integer
Dim iPosSlashUnderscores As Integer
Dim iPosNSF As Integer

Set coll = sess.CurrentDatabase.UnprocessedDocuments
Set doc = coll.GetFirstDocument

sURL = “”
While Not doc Is Nothing
    sTempURL = doc.NotesURL
    iPosAT=Instr(sTempURL,”@”)
    iPosSlashUnderscores = Instr(sTempURL,”/__”)
    iPosNSF = Instr(iPosSlashUnderscores+1,sTempURL,”.nsf/”)
    If sess.CurrentDatabase.Server=”” Then
        sTempURL = Left$(sTempURL,8) & “/” & Mid$(sTempURL,iPosSlashUnderscores+3,iPosNSF-iPosSlashUnderscores-3) & Mid$(sTempURL,iPosNSF+4)
    Else
        sTempURL = Left$(sTempURL,iPosAT-1) & “/” &    Mid$(sTempURL,iPosSlashUnderscores+3,iPosNSF-iPosSlashUnderscores-3) & Mid$(sTempURL,iPosNSF+4)
    End If

    sURL = sURL & sTempURL
    Set doc = coll.GetNextDocument(doc)
    If Not doc Is Nothing Then
        sURL = sURL & Chr$(13)
    End If
Wend
If sURL = “” Then
    Messagebox “No Documents Selected”,0,”Nothing to do”
Else
    Messagebox sURL,0,”URL(s) for selected docs”
End If

(also posted in http://www-10.lotus.com/ldd/nd6forum.nsf/ShowMyTopicsAllFlatweb/9324f9e90784fbd5852573be0071f311?OpenDocument)

Marc-a-Day on Flickr

day001I’m trying out something a little different. I’ve enjoyed looking at other folks’ “365” pictures enough that I thought I’d do something similar, so I’ve created “Marc-a-Day” on Flickr.  Mostly for my own amusement, it will feature some highlight from each day from now until whenever I decide it should end. I’m aiming for AT LEAST a year. I suppose it all hinges on how interesting my life is after all 🙂

Being somewhat paranoid with respect to the longevity of web companies, I’m also duplicating these (for now) in my own Gallery.
3236