2011-10-04 14 views
5

Estoy tratando de averiguar la mejor manera a través de la biblioteca Applescript de Spotify para detectar un cambio de ruta. Hasta ahora, he intentado verificar la posición del jugador: si es igual a 0, es una nueva pista y la notificación Growl aparece nuevamente. (Esto no funcionó principalmente si alguien comenzó una canción, etc.)¿Monitorea el cambio de pista de Spotify en Applescript?

Me pregunto si el método más plausible es ejecutar un script de iTunes inactivo y verificar el nombre de la pista actual para cambiar cada dos segundos. Me preocupa que esto sea un poco sabio para la memoria. No puedo hacer que este código funcione tampoco.

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 

Esto puede ser un poco complicado, pero se agradece cualquier ayuda.

Respuesta

1

Vale la pena mencionar que esto es irrelevante ya que Spotify ha parchado esto en una actualización reciente.

3

He trabajado en una pequeña secuencia de comandos, ya que Spotify no es compatible con Growl 1.3.

La programación no es muy buena, pero creo que, las notificaciones son muy elegante;)

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

¿Qué versión de Growl ¿son compatibles con Spotify? – ryryan

1

He estado usando este script a continuación. Creo que tiene la respuesta a tu pregunta. Este código fue encontrado en: 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 
Cuestiones relacionadas