- Listing d
This script will copy the selected iTunes tracks from the local user's iTunes Music folder to a remote user's iTunes Music folder and add them to the remote user's iTunes
Note: passwordless ssh login, as described here, must be set up among each user in order for this script to work.
Any of the extant comments or logged items are for debugging and so on. They can be removed.
-- == allocate globals global remUserName, remHostIPAddr, remAddr, locMusicLibrary, remMusicLibrary -- == selection? tell application "iTunes" set sel to selection if sel is {} then display dialog "No tracks selected." buttons {"Cancel"} default button 1 with icon 0 return end if end tell -- == init variables set remUserName to "cleanuser" -- use your remote username set remHostIPAddr to "192.168.1.206" -- use your remote IP address set remAddr to (remUserName & "@" & remHostIPAddr) as text -- == check if remote iTunes is running if my are_you_logged_in() is false then tell application "iTunes" display dialog ("\"" & remUserName & "\" is not logged in and running iTunes.") ¬ buttons {"Cancel"} default button 1 with icon 0 return end tell end if -- == get mx folder loc's via handlers set locMusicLibrary to my get_local_music_folder() set remMusicLibrary to my get_remote_music_folder() -- == process track selection tell application "iTunes" repeat with t in sel if (get class of t is file track) then try set loc to t's location if loc is not missing value then my process_this_file(POSIX path of (loc as text)) end if on error m log "ERROR: " & m end try end if end repeat end tell -- == end run -- == handlers = == == == == == == == -- copy to remote iTunes and add to process_this_file(posixLoc) -- == init some variables set fileFolderHeirarchy to text ((length of locMusicLibrary) + 1) thru -1 of (posixLoc as text) set remLoc to (remMusicLibrary & fileFolderHeirarchy) as text set remContainer to (my list_to_text(items 1 thru -2 of my text_to_list(remLoc, "/"), "/") & "/") as text -- == copy and add the file only if it doesn't already exist on the remote side if not my rem_file_exists(remLoc) then -- == == containing folder exists? if not, create set mkdirCom to quoted form of ("mkdir -p " & my escape_for_unix(remContainer)) as text try set x to do shell script "ssh " & remAddr & space & mkdirCom log x on error m log ("mkdir err: " & m) end try -- -- == copy the file set scpCom to ("scp" & space & quoted form of posixLoc & space & ¬ remAddr & ":\"" & my escape_for_unix(remContainer) & "\"") as text set rezList to do shell script scpCom log rezList -- this result not needed; observation only -- == == add the newly copied file to remote iTunes set fileToAdd to my fix_single_quotes(remLoc) try with timeout of (1 * days) seconds set osaCom to quoted form of ¬ ("osascript -e 'tell application\"iTunes\" to add POSIX file \"" & fileToAdd & "\"'") do shell script ("ssh " & remAddr & space & osaCom) end timeout on error m number n log m log n end try else log "EXISTS - SKIP" end if end process_this_file on are_you_logged_in() set whoCom to quoted form of ("who -q | grep \"" & remUserName & "\"") try set rez to (do shell script ("ssh " & remAddr & space & whoCom)) set osaCom to quoted form of ("osascript -e 'tell application\"iTunes\" to launch'") do shell script ("ssh " & remAddr & space & osaCom) return true on error return false end try end are_you_logged_in on rem_file_exists(remF) set testCom to quoted form of ("test -e \"" & remF & "\"") try set x to (do shell script ("ssh " & remAddr & space & testCom)) if x is "" then return true return false on error return false end try end rem_file_exists to escape_for_unix(n) set n1 to my replace_chars(n, " ", "\\ ") return my replace_chars(n1, "'", "\\'") end escape_for_unix to fix_single_quotes(x) return my replace_chars(x, "'", "'\\''") as text end fix_single_quotes to get_local_music_folder() set o to (do shell script "defaults read com.apple.iApps iTunesRecentDatabasePaths") as text set xm to text ((offset of "\"" in o) + 1) through ((offset of ".xml" in o) + 3) of o set xml to (my replace_chars(xm, " ", "\\ ")) as text -- based on unix script by Dave Taylor return (do shell script "head -n 14 " & xml & ¬ "| grep '>Music Folder<' | cut -d/ -f4- | sed 's/localhost//g' | \\cut -d\\< -f1 | sed 's/%20/ /g'") end get_local_music_folder to get_remote_music_folder() set dCom to quoted form of ("defaults read com.apple.iApps iTunesRecentDatabasePaths") set o to (do shell script ("ssh " & remAddr & space & dCom)) set xm to text ((offset of "\"" in o) + 1) through ((offset of ".xml" in o) + 3) of o set xml to (my replace_chars(xm, " ", "\\ ")) as text -- again, based on unix script by Dave Taylor set hCom to quoted form of ("head -n 14 " & xml & ¬ "| grep '>Music Folder<' | cut -d/ -f4- | sed 's/localhost//g' | \\cut -d\\< -f1 | sed 's/%20/ /g'") return (do shell script ("ssh " & remAddr & space & hCom)) end get_remote_music_folder on replace_chars(txt, srch, repl) set AppleScript's text item delimiters to the srch set the item_list to every text item of txt set AppleScript's text item delimiters to the repl set txt to the item_list as string set AppleScript's text item delimiters to "" return txt end replace_chars on text_to_list(txt, delim) set saveD to AppleScript's text item delimiters try set AppleScript's text item delimiters to {delim} set theList to every text item of txt on error errStr number errNum set AppleScript's text item delimiters to saveD error errStr number errNum end try set AppleScript's text item delimiters to saveD return (theList) end text_to_list on list_to_text(theList, delim) set saveD to AppleScript's text item delimiters try set AppleScript's text item delimiters to {delim} set txt to theList as text on error errStr number errNum set AppleScript's text item delimiters to saveD error errStr number errNum end try set AppleScript's text item delimiters to saveD return (txt) end list_to_text