Album art with GeekTool

After a few weeks of pretty constant work and overwork, today has been something of a goof-off day. For reasons I can’t quite remember, I came across this post on Mac OSX Hints, which describes a way of taking the iTunes album cover art of the currently playing song and putting on your desktop through GeekTool. I already had GeekTool set up to display the name, artist, and album of the current track--described here--but this seemed like a fun addition. The lower right corner of my desktop now looks like this:

The text comes from my previous GeekTool arrangement, and the album art is from today’s additions.

The setup is basically that described in the OSX Hints article, but I made a few changes:

My version of the AppleScript, called “iTunesArtwork.scpt,” is kept in my ~/Library/Scripts folder and looks like this:

-- Paths and stuff
set ArtworkFromiTunes to ((path to home folder) as text) & ¬
  "Pictures:iTunes Artwork:From iTunes:albumArt.pict" as alias
set iTunesArtwork to ((path to home folder) as text) & ¬
  "Pictures:iTunes Artwork:From iTunes:albumArt.pict"
set DefaultArtwork to ((path to home folder) as text) & ¬
  "Pictures:iTunes Artwork:Default:albumArt.pict"
set displayArtwork to ((path to home folder) as text) & ¬
  "Pictures:iTunes Artwork:albumArt.pict"

-- Unix versions of the above path strings
set unixITunesArtwork to the quoted form of POSIX path of iTunesArtwork
set unixDefaultArtwork to the quoted form of POSIX path of DefaultArtwork
set unixDisplayArtwork to the quoted form of POSIX path of displayArtwork

set whichArt to "blank"
tell application "System Events"
  if exists process "iTunes" then -- iTunes is running
    tell application "iTunes"
      if player state is playing then -- iTunes is playing
        set aLibrary to name of current playlist -- Name of Current Playlist
        set aTrack to current track
        set aTrackArtwork to null
        if (count of artwork of aTrack) ≥ 1 then -- there's an album cover
          "Running and playing and art"
          set aTrackArtwork to data of artwork 1 of aTrack
          set fileRef to ¬
            (open for access ArtworkFromiTunes with write permission)
            set eof fileRef to 512
            write aTrackArtwork to fileRef starting at 513
            close access fileRef
          on error errorMsg
              close access fileRef
            end try
            error errorMsg
          end try

          tell application "Finder" to ¬ 
            set creator type of ArtworkFromiTunes to "????"
          set whichArt to "iTunes"
        end if
      end if
    end tell
  end if
end tell

if whichArt is "iTunes" then
  do shell script "ditto -rsrc " & unixITunesArtwork & space & unixDisplayArtwork
  do shell script "ditto -rsrc " & unixDefaultArtwork & space & unixDisplayArtwork
end if

Update 9/16/09
I just updated the script to work with Snow Leopard. The line that sets the variable ArtworkFromiTunes used to end as file specification; now it ends as alias. I think as alias will work in Leopard, too, but I don’t have a good way to check right now.

I created a new “Shell” GeekTool entry to call this script every 10 seconds. The command is

osascript ~/Library/Scripts/iTunesArtwork.scpt

It doesn’t produce any output, so the location, size, font, color, etc. of the output area doesn’t matter.

In my ~/Pictures folder, I have a folder called “iTunes Artwork,” and its contents look like this:

The “albumArt.pict” file in the “Default” folder is the single-pixel PICT I mentioned before. If you want to use my version of the script unchanged, you’ll have to replicate this directory stucture and make a “blank art” file to match your desktop. Don’t worry about the other two “albumArt.pict” files; they’re created by the script when it runs.

I created a new “Picture” GeekTool entry to display the picture at Source URL


every 10 seconds (you’ll have to change the user name, of course). The script makes that file a copy of the album cover art if a track is playing (and has cover art) and a copy of the single-pixel “blank art” otherwise. The display area is 150×150 pixels and the Picture Style is set to display Proportionally in the lower right corner of the display area.

Because the text and the artwork are controlled by three separate GeekTool entries that don’t necessarily run simultaneously, it’s not uncommon for the text and artwork to be out of sync for a few seconds when a new track begins playing. I could make them more closely synced by reducing the time between GeekTool calls, but the delay isn’t annoying enough to bother.

Update (5/11/09)
The scripts described in this post may lead GeekTool to eat up more memory the longer it runs. You may want to also run my GeekTool memory monitor script so you can track GeekTool’s memory use and restart it when necessary.