Broadcast iTunes AirPlay Tracks to Campfire Chat with TrackFire
June 08, 2011
Update: TrackFire is now on GitHub for your forking pleasure.
TrackFire is an AppleScript "app" that posts iTunes track titles played over an AirPlay device to a Campfire chat room.
In the office we often play music from iTunes over an Airport Express device for the entire floor to hear. Inevitably, someone asks, "What band is this?" Being the avid users of Campfire that we are, we thought it would be perfect if iTunes AirPlay tracks could automatically have their name and album info posted to a Campfire chatroom. And so TrackFire took form.
The AppleScript runs every few seconds checking for a running version of iTunes, then if iTunes is in play mode and broadcasting to a specific AirPlay device, the track information is posted to Campfire.
For the most part, the script runs without issue, but an error is thrown every once in a while. "Can't make «class cFIT» id 10219 of «class cUsP» id 10192 of «class cSrc» id 65 of application 'iTunes' into the expected type." (Still tracking down the cause.) Thanks to the folks over at the Apple Discussion Boards for all their help.
Installation- Paste the script into AppleScript Editor replacing the Campfire variables with your own information.
- Save as an Application with "Stay Open" checked. Double-click your new script and it will run in the background.
- Use iTunes as you normally would and the script does the rest.
(* Begin user defined settings ************) property campfire_token : "1234567" (* Your Campfire API authentication token *) property airplay_device : "Apple TV" (* The name of your AirPlay device *) property campfire_room : "https://yourname.campfirenow.com/room/123456/speak.xml" (* The Campfire room you'd like to post to *) (* End user defined settings *************) global current_track, last_track, current_device on run (* init at runtime*) set current_track to "" set current_device to "" set last_track to "" end run on idle if application "iTunes" is not running then return 10 tell application "iTunes" if (player state is not playing) or (current track is equal to last_track) then return 5 set last_track to current track set minimized of front browser window to false set visible of front browser window to true set current_device to my getDevice() if current_device as string is not equal to airplay_device & " AirPlay" then return 5 set track_info to my mungeText({name, artist, album} of last_track, "", " :: ") set track_info to track_info as string set track_info to my mungeText(track_info, "&", "&") -- Replace ampersands set track_info to my mungeText(track_info, "\"", """) -- Replace quotation marks set track_info to my mungeText(track_info, "'", "'") -- Replace apostrophes set shellCommand to ("curl -u " & campfire_token & ":X -H 'Content-Type: application/xml' -d '' " & campfire_room) set shellCommand to shellCommand as string do shell script shellCommand (*display dialog shellCommand*) (*log "Posting to Campfire:" & shellCommand*) return 5 end tell end idle on getDevice() tell application "System Events" tell process "iTunes" return description of button 8 of window "iTunes" end tell end tell end getDevice on mungeText(itxt, stxt, rtxt) set tid to AppleScript's text item delimiters if class of itxt is text then set AppleScript's text item delimiters to stxt set itxt to text items of itxt end if set AppleScript's text item delimiters to rtxt set otxt to itxt as text set AppleScript's text item delimiters to tid return otxt end mungeText TextMessage " & track_info & "