quicksilver and itunes

I’m generally a big fan of the Unix axiom of applications doing one thing and doing it well, but when each of those applications is running all the time and takes up 20MB of active memory I tend to make an exception and Quicksilver is providing an excellent alternative to several smalls apps I use.

I originally used MenuTunes, and most recently Synergy to provide global “hotkeys” to do some simple things like play/pause iTunes, skip to next or previous track, and display some information about the current track. Quicksilver’s triggers are ideal for this — it allows you to create keyboard shortcuts to perform any Quicksilver action. This let me setup keys for play/pause and next/previous track.

Additionally I setup the iTunes Quicksilver plugin to display track notifications and to send those notifications to Growl, however the plugin only displays notifications when something happens like the track changes. I want to be able to display track info at any time so I whipped up this simple Applescript, saved it to my scripts folder, and assigned it to a Quicksilver trigger. This will display the exact same as the built-in iTunes notification in Quicksilver with the addition of track time, current position, and ratings stars. It’s a very simple matter of displaying more or less info for the track.

iTunes notification

[updated 09 Aug 2005 to work when no artwork is present]

tell application "iTunes"
  set currentTrack to current track
  set theArtworks to artworks of currentTrack

  if ((count of theArtworks) > 0) then
    set theArtworkData to data of item 1 of theArtworks
  else
    set theArtworkData to null
  end if

  set theArtist to artist of currentTrack
  set theAlbum to album of currentTrack
  set theTime to time of currentTrack

  -- set the rating stars
  set theStars to ""
  set theRating to rating of currentTrack
  set bStar to «data utxt2605» as Unicode text
  set wStar to «data utxt2606» as Unicode text
  repeat 5 times
    if (theRating > 0) then
      set theStars to theStars & bStar
      set theRating to (theRating - 20)
    else
      set theStars to theStars & wStar
    end if
  end repeat

  -- get player position and format to MM:SS
  set positionMinutes to (player position div 60)
  if (positionMinutes < 10) then ¬
    set positionMinutes to "0" & positionMinutes
  set positionSeconds to (player position mod 60)
  if (positionSeconds < 10) then ¬
    set positionSeconds to "0" & positionSeconds
  set thePosition to positionMinutes & ":" & positionSeconds
end tell

tell application "GrowlHelperApp"
  if (theArtworkData is not null) then
    notify with name ¬
      "iTunes Notification" title ¬
      name of currentTrack description ¬
      theArtist & return & theAlbum & return & thePosition ¬
        & " / " & theTime & "     " & theStars application name ¬
      "Quicksilver" pictImage theArtworkData
  else
    notify with name ¬
      "iTunes Notification" title ¬
      name of currentTrack description ¬
      theArtist & return & theAlbum & return & thePosition ¬
      & " / " & theTime & "     " & theStars application name ¬
      "Quicksilver" icon of application "iTunes"
  end if
end tell