Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monitoring Spotify track change in Applescript?

I'm trying to figure out the best way via Spotify's Applescript library to detect a track change. So far, I've tried checking player position -- if it equals 0 it is a new track and the Growl notification appears again. (This didn't work mostly if someone started a song over, etc.)

I'm wondering if the more plausible method is having an idle iTunes script running and checking the current track name for change every couple seconds. I'm worried this might be a bit of a hog memory-wise. I can't get this code to function either.

tell application "System Events"
    -- checks for instance of Growl and Spotify, does not run if both programs are not active
    set isRunning to ¬
        (count of (every process whose name is "Growl")) > 0
    (count of (every process whose name is "Spotify")) > 0
end tell

--establish empty variable to be filled by song title later
global latest_song
set latest_song to ""

on idle
    tell application "Spotify"
        if player state is playing then
            copy name of current track to current_tracks_name
            -- runs match between last and current song titles
            if current_tracks_name is not latest_song then
                copy current_tracks_name to latest_song
                set who to artist of current track
                set onwhat to album of current track
                tell application "Growl"
                    -- Make a list of all the notification types 
                    -- that this script will ever send:
                    set the allNotificationsList to ¬
                        {"SpotifyNewTrack"}

                    -- Make a list of the notifications 
                    -- that will be enabled by default.      
                    -- Those not enabled by default can be enabled later 
                    -- in the 'Applications' tab of the growl prefpane.
                    set the enabledNotificationsList to ¬
                        {"SpotifyNewTrack"}

                    -- Register our script with growl.
                    -- You can optionally (as here) set a default icon 
                    -- for this script's notifications.
                    register as application ¬
                        "Spotify" all notifications allNotificationsList ¬
                        default notifications enabledNotificationsList ¬
                        icon of application "Spotify"

                    --  Send a Notification...
                    notify with name ¬
                        "SpotifyNewTrack" title ¬
                        current_tracks_name description ¬
                        who application name "Spotify"
                end tell
            end if
            return 5
        end if
    end tell
end idle

This might be a little complicated but any help is appreciated.

like image 697
Kristian Avatar asked Oct 04 '11 01:10

Kristian


2 Answers

I've worked on a little script, since Spotify does not support Growl 1.3.

Programming is not very good, but I think, the Notifications are very fancy ;)

set delay_time to 1

-- register growl
tell application "Growl"
set the allNotificationsList to {"SpotifyNewTrack"}
set the enabledNotificationsList to {"SpotifyNewTrack"}
register as application ¬
    "Spotify" all notifications allNotificationsList ¬
    default notifications enabledNotificationsList ¬
    icon of application "Spotify"
end tell

set myspace to " "
set myspace2 to myspace & myspace
set myspace3 to myspace & myspace & myspace

set old_track_id to ""
set old_state to ""

repeat
try

    set boolStarted to false
    set boolPaused to false

    -- main code        
    tell application "Spotify" to set track_id to id of current track
    tell application "Spotify" to set theState to player state as string


    if ((old_state is "stopped") or (old_state is "paused")) and theState is "playing" then set boolStarted to true
    if (old_state is "playing") and theState is "paused" then set boolPaused to true

    set old_state to theState

    if (old_track_id is not track_id) or boolStarted or boolPaused then

        tell application "Spotify"
            set theTitle to name of the current track
            set theArtist to artist of the current track
            set theAlbum to album of the current track
            set theDuration to duration of the current track
            set theCount to played count of the current track
            set theStarred to starred of the current track
            set thePopularity to popularity of the current track
            set theCover to artwork of the current track
            set thePosition to player position
        end tell


        if theStarred then
            set stringStarred to "♥" & myspace
        else
            set stringStarred to ""
        end if

        set stringPopularity to ""
        repeat (thePopularity / 20 as integer) times
            set stringPopularity to stringPopularity & "✭"
        end repeat
        repeat (5 - (thePopularity / 20 as integer)) times
            set stringPopularity to stringPopularity & "✩"
        end repeat

        set theMinutes to round (theDuration / 60) rounding down
        set theSeconds to round (theDuration - (theMinutes * 60))
        if theSeconds < 10 then set theSeconds to "0" & theSeconds

        set thePosMinutes to round (thePosition / 60) rounding down
        set thePosSeconds to thePosition - (thePosMinutes * 60) as integer
        if thePosSeconds < 10 then set thePosSeconds to "0" & thePosSeconds
        set stringPos to thePosMinutes & ":" & thePosSeconds



        if boolStarted or boolPaused then
            set thePosMinutes to round (thePosition / 60) rounding down
            set thePosSeconds to thePosition - (thePosMinutes * 60) as integer
            if thePosSeconds < 10 then set thePosSeconds to "0" & thePosSeconds
            set stringPos to thePosMinutes & ":" & thePosSeconds
        end if


        set growlTitle to theArtist & ":" & myspace2 & theTitle
        set growlMessage to theAlbum & myspace & "||" & myspace & theMinutes & ":" & theSeconds & ¬
            myspace & stringStarred & stringPopularity & " (" & thePopularity & ")" & myspace & theCount & "x"

        if boolStarted then set growlTitle to growlTitle & myspace3 & "▶"
        if boolPaused then set growlTitle to growlTitle & myspace3 & "❚❚"


        -- save cover art
        set f to open for access "Macintosh HD:tmp:spotify-artwork.tiff" with write permission
        set eof of f to 0
        write theCover to f
        close access f


        set thePercentage to (20 * thePosition / theDuration) as integer

        set stringPercentage to ""

        repeat (thePercentage - 1) times
            set stringPercentage to stringPercentage & "·"
        end repeat

        set stringPercentage to stringPercentage & "◆"

        if thePercentage is 0 then
            repeat (19 - thePercentage) times
                set stringPercentage to stringPercentage & "·"
            end repeat
        else
            repeat (20 - thePercentage) times
                set stringPercentage to stringPercentage & "·"
            end repeat
        end if

        if boolStarted or boolPaused then
            set growlTitle to growlTitle & myspace3 & stringPos & myspace3 & stringPercentage
        end if


        tell application "Growl" to notify with name ¬
            "SpotifyNewTrack" title growlTitle description growlMessage ¬
            application name ¬
            "Spotify" image from location "/tmp/spotify-artwork.tiff"


    end if

    set old_track_id to track_id


end try
delay delay_time
end repeat
like image 87
Christian Avatar answered Oct 13 '22 09:10

Christian


Worth mentioning this is irrelevant as Spotify has patched this in a recent update.

like image 20
Kristian Avatar answered Oct 13 '22 10:10

Kristian