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 'TextMessage " & track_info & " ' " & 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