2011-10-04 11 views
5

Sto cercando di capire il modo migliore tramite la libreria Applescript di Spotify per rilevare un cambio di traccia. Finora, ho provato a controllare la posizione del giocatore - se è uguale a 0 è una nuova traccia e la notifica Growl appare di nuovo. (Questo non ha funzionato principalmente se qualcuno ha iniziato un brano, ecc.)Monitorare il cambio di traccia di Spotify in Applescript?

Mi chiedo se il metodo più plausibile è avere uno script di iTunes inattivo in esecuzione e il controllo del nome della traccia corrente per la modifica ogni due secondi. Sono preoccupato che questo potrebbe essere un po 'di memoria del maiale. Nemmeno io riesco a far funzionare questo codice.

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 

Questo potrebbe essere un po 'complicato ma qualsiasi aiuto è apprezzato.

risposta

1

Vale la pena menzionare questo aspetto è irrilevante in quanto Spotify ha corretto le patch in un recente aggiornamento.

3

Ho lavorato su un piccolo script, poiché Spotify non supporta Growl 1.3.

La programmazione non è molto buona, ma credo che, le comunicazioni sono molto di fantasia;)

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 
+0

Quale versione di Growl fa supporto Spotify? – ryryan

1

Ho utilizzato questo script di seguito. Credo che abbia la risposta alla tua domanda. Questo codice è stato trovato: http://joonix.se/post/25716608379/spotify-offline-playlist

property update_delay : 0.1 

tell application "Audio Hijack Pro" 
    activate 
    -- Create a new session "Spotify" if it doesn't already exist 
    try 
     set spotify_session to first session whose name is "Spotify" 
     if output name format of spotify_session is not "%tag_artist - %tag_title" then 
      display dialog "The existing profile for \"Spotify\" does not utilize %tag_artist and %tag_title in the output name format option. Please add this if you want your files to be named automatically or delete/rename your existing \"Spotify\" session." 
     end if 
    on error number -1719 
     tell application "Finder" 
      set spotify_path to POSIX path of (application file id "spty" as alias) 
     end tell 
     set spotify_session to make new application session at end of sessions 
     set targeted application of spotify_session to spotify_path 
     set output folder of spotify_session to "~/Desktop" 
     set output name format of spotify_session to "%tag_artist - %tag_title" 
     set recording format of spotify_session to {encoding:MP3, bit rate:320, channels:Stereo, style:VBR} 
    end try 
    set name of spotify_session to "Spotify" 

    -- (Re-)start hijacking and recording on the spotify session 
    if hijacked of spotify_session is true then 
     stop hijacking spotify_session 
    end if 
    start hijacking spotify_session relaunch yes 
end tell 

tell application "Spotify" 
    if not running then activate 
    if player state is playing then pause 

    display dialog "Start playing the tracks that you want to rip with Audio Hijack, quit spotify when done." 
    if repeating then display dialog "Please notice that you have repeating enabled in Spotify!" 

    set has_started to false -- Whether spotify have been playing yet 

    -- Check for changes to current track until spotify exits 
    repeat until application "Spotify" is not running 
     -- Changed track 
     if has_started and id of current track is not recording_id then 
      tell application "Audio Hijack Pro" to stop recording spotify_session 
      set has_started to false 
     end if 

     -- Started playing 
     if has_started is not true and player state is playing then 
      set has_started to true 
      set recording_id to id of current track 

      -- Get the metadata 
      set track_name to name of current track 
      set track_artist to artist of current track 
      set track_album to album of current track 

      tell application "Audio Hijack Pro" 
       set title tag of spotify_session to track_name 
       set artist tag of spotify_session to track_artist 
       set album tag of spotify_session to track_album 

       start recording spotify_session 
      end tell 
     end if 

     -- Stopped playing 
     if has_started and player state is not playing then 
      tell application "Audio Hijack Pro" to stop recording spotify_session 
      set has_started to false 
     end if 

     delay update_delay 
    end repeat 

    tell application "Audio Hijack Pro" to stop recording spotify_session 
end tell 
Problemi correlati