arrow-left arrow-right brightness-2 chevron-left chevron-right facebook-box facebook loader magnify menu-down rss-box star twitter-box twitter white-balance-sunny window-close
Use AppleScript to determine which media app is currently playing something (or was last paused), and have your PowerMate act accordingly
3 min read

Use AppleScript to determine which media app is currently playing something (or was last paused), and have your PowerMate act accordingly

I earlier described how I configured my PowerMate to provide system-wide control of Spotify, and noted the ability of the PowerMate software to now run AppleScripts that can communicate with other apps, thus obviating the need for third-party bridges.

A problem I ran into almost immediately with the setup described in the aforelinked post was that Spotify would start playing a track when I bopped my PowerMate to pause iTunes; you see, even though I’m now getting the majority of my music via Spotify, I’m still using iTunes for podcasts.

Because I wanted the PowerMate to control all media on my computer, I needed to give the AppleScripts some intelligence with respect to which app they should affect, depending on a few variables. Let’s start with what ended up being the most involved script, the one for play/pause.

--Define the lastPaused property and give it a default value
property lastPaused : 

--Get current states of iTunes and Spotify
tell application iTunes to set itunesState to (player state as text)
tell application Spotify to set spotifyState to (player state as text)

--Pause the active app; play the last-paused app
if itunesState is equal to playing then
    tell application iTunes to playpause
    set lastPaused to iTunes
else if spotifyState is equal to playing then
    tell application Spotify to playpause
    set lastPaused to Spotify
else if ((itunesState is equal to paused) and (lastPaused is equal to iTunes)) then
    tell application iTunes to playpause
else if ((spotifyState is equal to paused) and (lastPaused is equal to Spotify)) then
    tell application Spotify to playpause
end if

The reason this script is slightly more complicated than those for next track and 30-second skip (described below) is because it requires the maintenance of a variable across invocations of the script. Specifically, when playing a paused track we must determine which app–iTunes or Spotify–was last paused, so we know which app to tell to start playing again.

I struggled a bit with how to track this last paused descriptor, and ultimately resigned myself to maintaining it via a file. Though I got that solution working, I wasn’t completely happy with it and asked my Twitter followers if there was a better way. @elasticthreads mentioned AppleScript’s property construct and indeed it was exactly what I needed (and I was more than a little embarrassed I hadn’t remembered it myself). (From the AppleScript Language Guide: The value set by a property definition is not reset each time the script is run; instead, it persists until the script is recompiled. Perfect.)

The script first defines, and gives a default value to, the lastPaused property. (This value is set just once for each compilation of the script, which means, in practice, it likely will occur only during the script’s initial run after a reboot.) Next, the script grabs the player states (e.g., paused, playing, stopped, etc.) of iTunes and Spotify so that we can work with them later.

Finally, the script determines if either app is currently playing a track; if so, it pauses that app and sets lastPaused to note that the app was paused. If neither app is currently playing, the script checks to see if either app is currently paused (as opposed to stopped) and currently owns lastPaused; if these two things are true for either app, it issues the play command to that app.

The next track script is similar, except that we don’t need to remember the state of anything; all we need to do is determine which of the two apps is currently playing something (and one must be, else we wouldn’t have reached for the PowerMate). With that in mind, the script doesn’t involve iTunes at all if Spotify is active; I wrote it that way because 90% of the time I’m listening to music at my computer, not podcasts.

tell application Spotify
    if player state is equal to playing then
        next track
    else
        tell application iTunes to next track
    end if
end tell

The script logic for 30-second skip is the same as that for next track.

tell application Spotify
    if player state is equal to playing then
        set player position to (player position + 30)
    else
        tell application iTunes to set player position to (player position + 30)
    end if
end tell
You've successfully subscribed to Justin Blanton.
Success! Your account is fully activated, you now have access to all content.