dp.cx blog

Posted on

Filed under osx, shell, itunes, and applescript

For the past few years, I've been using the WSP Music System for iTunes to help me listen to things in a better manner. But that means I need to keep my play information in sync.

Occasionally, I listen to music via Pandora. I never really got in to Spotify or some of the others, and Pandora has broadened my musical horizons a great deal.

Pianobar is an awesome console application: it lets you listen to Pandora from a command-line, which means it's very lean. I'm a minimalist at heart, even if I don't always follow "minimalist" trends; this is one situation where I do. Pianobar makes my life so much easier.

The fact that Pianobar has a script that it will run with information about the currently playing song is awesome. It lets me submit those plays to Last.fm, among other things. After getting Pianobar to build on my Mac, I realized that I could update iTunes' play counts with the command script from Pianobar. I've created the following scripts in my ~/.config/pianobar/ directory:

UpdateItunesPlayCount.scpt

on run argv    tell application "iTunes"        set theArtist to (item 1 of argv)        set theTitle to (item 2 of argv)        set results to (every file track of playlist "Library"            whose artist contains theArtist and name contains theTitle)        repeat with t in results            tell t                set playedCount to get played count of t                set played count of t to playedCount + 1                set played date of t to (current date)            end tell        end repeat    end tellend run

UpdateItunesSkipCount.scpt

on run argv    tell application "iTunes"        set theArtist to (item 1 of argv)        set theTitle to (item 2 of argv)        set results to (every file track of playlist "Library"            whose artist contains theArtist and name contains theTitle)        repeat with t in results            tell t                set skippedCount to get skipped count of t                set skipped count of t to skippedCount + 1                set skipped date of t to (current date)            end tell        end repeat    end tellend run

UpdateItunesRating.scpt

on run argv    tell application "iTunes"        set theArtist to (item 1 of argv)        set theTitle to (item 2 of argv)        set results to (every file track of playlist "Library"            whose artist contains theArtist and name contains theTitle)        repeat with t in results            tell t                set trackRating to get rating of t                set rating of t to trackRating + 5            end tell        end repeat    end tellend run

Then, in my pianobar command script, I have the following:

songfinish)    # scrobble if 75% of song have been played, but only if the song hasn't    # been banned    if [ -n "$songDuration" ] && [ "$songDuration" -ne 0 ] &&            [ $(echo "scale=4; ($songPlayed/$songDuration*100)>50" | bc) -eq 1 ] &&            [ "$rating" -ne 2 ]; then        scrobbler-helper -P pia -V 1.0 "$title" "$artist" "$album" "" "" "" "$((songDuration/1000))" &        osascript /Users/gsolsberry/.config/pianobar/UpdateItunesPlayCount.scpt "$artist" "$title"    else        if [ "$songPlayed" -lt 30000 ]; then            osascript /Users/gsolsberry/.config/pianobar/UpdateItunesSkipCount.scpt "$artist" "$title"        fi    fi    ;;songlove)    osascript /Users/gsolsberry/.config/pianobar/UpdateItunesRating.scpt "$artist" "$title"    ;;

If the song played to conclusion, we scrobble it with Last.fm, and update it's play count in iTunes. If we skipped to the next song within the first 30 seconds, we update the skip count. If we marked the song as "loved", we updating the songs rating by 5 points.

In this way, if we ever play a song that's in our iTunes library, the counts are updated properly, which keeps the WSP Music System data accurate.