-- Record Spotify using Hijack Pro
-- script version: 1.0
-- author : rbg
-- Global variables
global track_name
global track_artist
global track_album
global track_nr
global track_disc
global track_year
global track_artwork
global track
global changed
global album_changed
global spotify_up
global spotify_ad
global spotify_stopped
global hijack_recording
global hijack_dir
global hijack_base_dir
global posix_hijack_dir
global state
global script_just_started
-- configuration:
property polling_interval : 1
property create_folders : false
property save_artwork : false
-- Function to check if an application is running
on isRunning(appName)
tell application "System Events" to (name of processes) contains appName
end isRunning
-- Init
on run
set script_just_started to true
set changed to false
set album_changed to false
set spotify_ad to false
set spotify_stopped to missing value
set hijack_recording to false
set hijack_dir to missing value
set hijack_base_dir to hijack_dir
set posix_hijack_dir to missing value
set track_name to missing value
set track_artist to missing value
set track_album to missing value
set track_nr to missing value
set track_disc to missing value
set track_year to missing value
set track_artwork to missing value
-- Check if Spotify and HiJack are running
if isRunning("Audio Hijack Pro") then
-- TODO Run Audio Hijack first
log "Audio Hijack Pro is running."
tell application "Audio Hijack Pro"
--start hijacking
try
set Spotify to first session whose hijacked is true
on error errorMsg
log "ERROR: No Hijack Pro session is hijacking. Exiting."
return "ERROR: No Hijack Pro session is hijacking. Exiting."
end try
tell Spotify
set hijack_dir to output folder
set hijack_base_dir to output folder
set posix_hijack_dir to POSIX file hijack_base_dir
log "Hijack Pro is writing to: " & hijack_base_dir
end tell
end tell
end if
if isRunning("Spotify") then
log "Spotify is running."
tell application "Spotify"
if sound volume is less than 100 then
log "Setting volume in Spotify"
set sound volume to 100
end if
if shuffling is true then
log "WARNING: shuffle is enabled."
end if
if repeating is true then
log "Disaling repeating"
set repeating to false
end if
end tell
end if
repeat
idle
delay polling_interval
end repeat
end run
-- Infinite Loop One
on idle
-- Check if Spotify and Skype are running
if isRunning("Audio Hijack Pro") then
if isRunning("Spotify") then
--log "checking …"
-- Get track from Spotify
tell application "Spotify"
if player state is stopped then
set spotify_stopped to true
else
set spotify_stopped to false
end if
-- sanity check
if player state is not stopped and class of current track is track then
set album_folder to artist of current track & " - " & album of current track
-- is current track Spotify ad?
if artist of current track is "Spotify" then
set spotify_ad to true
else
set spotify_ad to false
end if
if album_changed is true and spotify_ad is false then
-- save artwork to file in next polling step
if save_artwork then
set album_art_file to hijack_dir & "/albumArt.tiff"
set pos_file to POSIX file album_art_file
set fileRef to (open for access pos_file with write permission)
try
write track_artwork to fileRef
close access fileRef
on error errorMsg
try
close access fileRef
end try
error errorMsg
end try
end if
end if
-- check if album has changed:
if track_artist is not artist of current track or track_album is not album of current track then
log "Album changed to " & album_folder
set album_changed to true
-- need to create new folder?
if create_folders and spotify_ad is not true then
log "Creating new folder " & album_folder & " in " & hijack_base_dir
tell application "Finder" to make new folder at folder posix_hijack_dir with properties {name:album_folder as text}
set hijack_dir to hijack_base_dir & "/" & album_folder
end if
else
set album_changed to false
end if
-- Check if track has changed:
if track_name is not name of current track or track_artist is not artist of current track then
set changed to true
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_nr to track number of current track
set track_disc to disc number of current track
--not supported by hijack:
set track_artwork to artwork of current track
--not supported by spotify: set track_year to year of current track
log "track changed to [" & track_nr & "] " & track_artist & " - " & track_name
set surl to id of current track
log surl
else
set changed to false
end if
else
-- should i stop hijack?
log "Spotify playback stopped."
set state to "stopped"
end if
end tell
-- Send track info to Hijack if track has changed
if changed then
tell application "Audio Hijack Pro"
set Spotify to first session whose hijacked is true
tell Spotify
set title tag to track_name
set artist tag to track_artist
set album tag to track_album
set track number tag to track_nr
set disc number tag to track_disc
set year tag to track_year
-- not supported: set artwork to track_artwork
if create_folders then
set output folder to hijack_dir
end if
end tell
-- stop recording on Spotify ad
if spotify_ad is true or spotify_stopped is true then
log "Stopping recording in HiJack Pro"
stop recording Spotify
set hijack_recording to false
else
-- resume recording after ad
if hijack_recording is false then
log "Starting/resuming recording in HiJack Pro"
start recording Spotify
set hijack_recording to true
else
-- do not split in 1st loop run
if script_just_started is not true then
log "Sending split command to Hijack Pro."
split recording Spotify
end if
end if
end if
end tell
end if
set spotify_up to true
--log "spotify_up = true"
-- If Spotify was just quit:
else if spotify_up then
-- do anything?
set changed to false
set spotify_up to false
log "spotify_up = false"
end if
end if
set script_just_started to false
return polling_interval
end idle
-- Install exit handler
on quit
-- restore output folder
tell application "Audio Hijack Pro"
set Spotify to first session whose hijacked is true
tell Spotify
set output folder to hijack_base_dir
end tell
end tell
continue quit
end quit