Friday 30 October 2015

Record Spotify Tracks for Offline listening (OSX El Capitan)

Record Spotify Tracks for Offline listening.
I have attached the Apple Script below that seems to work for me.
I have tested it using Audio Hijack Pro v2.10.6 and latest version of Spotify on OSX El Capitan.


property update_delay : 1.0E-3
property output_folder : "~/Music/iTunes/iTunes Media/Automatically Add to iTunes.localized"

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 output_folder
  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:CBR}
 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 or (has_started is true and player state is not playing)
  -- Changed track
  try
   set current_id to id of current track
  on error number -1728
   set current_id to ""
  end try
  if has_started and current_id 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
   set track_album_artist to album artist of current track
   set track_disc to disc number of current track
   set track_number to track number of current track
   set track_spotify to spotify url 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
    set track number tag of spotify_session to track_number
    set comment tag of spotify_session to track_spotify
    set album artist tag of spotify_session to track_album_artist
    if track_disc is not 0 then set disc number tag of spotify_session to track_disc
    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
 try
  tell application "Audio Hijack Pro" to stop recording spotify_session
 on error number -609
 end try
end tell