【问题标题】:Monitoring Spotify track change in Applescript?监控 Applescript 中的 Spotify 曲目变化?
【发布时间】:2011-11-30 08:16:30
【问题描述】:

我正在尝试通过 Spotify 的 Applescript 库找出检测曲目变化的最佳方法。到目前为止,我已经尝试检查播放器位置——如果它等于 0,它是一个新轨道,并且 Growl 通知再次出现。 (如果有人重新开始一首歌等,这通常不起作用。)

我想知道是否更合理的方法是运行一个空闲的 iTunes 脚本并每隔几秒钟检查一次当前曲目名称是否更改。我担心这可能有点记忆力强。我也无法让这段代码发挥作用。

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

这可能有点复杂,但感谢您的帮助。

【问题讨论】:

    标签: applescript growl spotify


    【解决方案1】:

    我编写了一个小脚本,因为 Spotify 不支持 Growl 1.3。

    编程不是很好,但我认为,通知很花哨;)

    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
    

    【讨论】:

    • Spotify 支持什么版本的 Growl?
    【解决方案2】:

    值得一提的是,这无关紧要,因为 Spotify 已在最近的更新中对此进行了修补。

    【讨论】:

      【解决方案3】:

      我一直在使用下面的这个脚本。我相信它已经回答了你的问题。 此代码位于: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
      

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 1970-01-01
        • 2016-11-16
        • 2020-12-11
        • 2010-10-05
        • 2012-02-12
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多