• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Skript um i-Tunes Bibliothek auf USB-Stick zu kopieren

nick-tech

Erdapfel
Registriert
11.05.09
Beiträge
4
Hallo Zusammen,

ich bin auf der Suche nach einer Möglichkeit meine iTunes Bibliothek auf einen USB-Stick zu kopieren.

Das ganze soll über ein VW-Autoradio (RCD 310) abgespielt werden. Um eine halbwegs sinnvolle Navigation zu ermöglichen (das ganze ist ein Workaround für die katastrophale iPodschnittstelle), ist es notwendig die einzelnen Interpreten noch mal vorzusortieren.

Das Ergebnis sollte so sein:

Usb-stick:
Ordner A: Unterordner: ABBA, ACDC....
Ordner B: Unterordner: Beatsteaks, Blues Brothers...

In den Unterordner sind dann die Albenordner und darin die Audiodateien.
Natürlich möche ich nicht jedes mal wieder 30 GB auf den Stick kopieren, es sollte also eine Erkennung geben ob ein Ordner/Album schon mal kopiert wurde oder nicht

Eine Software die sowas tut konnte ich bisher nicht finden.

Leider hab ich keine Ahnung von der Apple Skript Syntax.


In Pseudocode müsste das etwa so aussehen:

for each %Ordner% in %iTunesMusik% do
for each %Buchstabe% from a to z do #kopiere alle noch nicht kopierten Ordner
if etikett=%keines% AND erster Buchstabe.%Ordner% in %iTunesMusik%=%Buchstabe% then
copy %Ordner% from %iTunesMusik% to %USB-Stick%/A
set etikett.%Ordner%=%grün% #markiere kopiere ordner
endif
if etikett=%keines% then #kopiere sonderzeichen und zahlen
copy %ordner% from %iTunesMusik% to %USB-Stick%/0-9
set etikett.%Ordner%=%grün%
endif
endfor
endfor


Das ist natürlich noch nicht perfekt, aber so in etwa. Kann mir jemand helfen?

Herzlichen Dank!
 

Darkspy

Bismarckapfel
Registriert
09.09.08
Beiträge
75
Theoretisch geht das mit einem kleinen Shell-Script.
"cp" wäre hier der passende Befehl, jedoch bin ich mir grad nicht sicher, wie man vorhandene Dateien überspringt.

Hast du schon mal den Automator probiert?
Da kannste dir den Workflow auch als Drop-Icon oder als Dienst speichern.
Das wäre doch ganz praktisch! :)
 

toc-rox

Weigelts Zinszahler (Rotfranch)
Registriert
15.11.09
Beiträge
247
Das dürfte wohl eher ein Fall für die Shell-Experten sein. Ich würde mal vermuten, daß sich die Aufgabenstellung mit einer Zeile Shellcode erledigen läßt.
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Ich würd's so machen:

Code:
set src to "$HOME/Music/iTunes/iTunes Music/"
set dest to "/Volumes/DEINSTICK"

set src to do shell script "echo " & src --um das $HOME aufzulösen

tell application "Finder"
	set artistFolders to (items of (POSIX file src as alias)) as alias list
	
	repeat with aArtistFolder in artistFolders
		set fName to name of aArtistFolder
		
		set sortFoldername to my getFirstChar(fName)
		
		set rsync to (do shell script "rsync -Pahv " & quoted form of (POSIX path of aArtistFolder) & space & quoted form of (dest & "/" & sortFoldername & "/"))
	end repeat
end tell


on getFirstChar(fName)
	repeat with aChar in (characters of fName)
		if "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" contains aChar then
			set aChar to makeUpper(aChar)
			return aChar
		end if
	end repeat
	
	return "0"
end getFirstChar


on makeUpper(aLetter)
	--von hier: http://macscripter.net/viewtopic.php?id=24753
	--see if the letter is in list of lower case letters
	considering case
		set myChar to offset of aLetter in "abcdefghijklmnopqrstuvwxyz"
		--if so, then return the upper case version
		if myChar > 0 then
			return character myChar of "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		else
			--else return the original character (it might be a number!)
			return aLetter
		end if
	end considering
end makeUpper

Die übertragung mit rsync, weil dann bereits vorhandene und nicht geänderte Dateien nicht erneut übertragen werden.
 

nick-tech

Erdapfel
Registriert
11.05.09
Beiträge
4
Hey das ging ja schnell!

Ich habe das Skript heute nacht mal laufen lassen, leider ist es noch nicht ganz perfekt.

Momentan werden in die A,B,C-Ordner direkt die Albenordner kopiert, die Zwischenstufe der Interpretenordner fehlt noch.

Also im Ordner A sind alle Alben der Interpreten die mit A beginnen, aber nicht noch mal vorsortiert in die Interpreten

Ausserdem wäre es schön wenn man 0-9 und alle Sonderzeichen zusammenfassen könnte, das sind ja nicht so viele Interpreten.

Aber schon mal ganz herzlichen Dank!
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Ausserdem wäre es schön wenn man 0-9 und alle Sonderzeichen zusammenfassen könnte, das sind ja nicht so viele Interpreten.

Dann musst du das so ändern:
Code:
on getFirstChar(fName)
	repeat with aChar in (characters of fName)
		if "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" contains aChar then
			set aChar to makeUpper(aChar)
			return aChar
		end if
	end repeat
	
	return "0" -- <-- da den namen des ordners eintragen, bei dem alle sonderzeichen und zahlen auftauchen sollen
end getFirstChar

Momentan werden in die A,B,C-Ordner direkt die Albenordner kopiert, die Zwischenstufe der Interpretenordner fehlt noch.
Lässt du deine Library durch iTunes verwalten? Dann müsstest du unter "$HOME/Music/iTunes/iTunes Music/" folgenden Aufbau haben:
INTERPRET/ALBUM/

D.h. voraussetzung dafür, dass es deine Erwartungen erfüllt, ist die Verwaltung der Library durch iTunes.

Für ACDC - Highway to Hell müsstest du dann in "$HOME/Music/iTunes/iTunes Music/ACDC/Highway To Hell" finden.

Der generierte rsync-befehl würde dann lauten:
Code:
rsync -Pahv "$HOME/Music/iTunes/iTunes Music/ACDC" "/Volumes/DEINSTICK/A/"

d.h. du würdest dann auf die Platte unter "/Volumes/DEINSTICK/A/ACDC/Highway To Hell" finden.
 
Zuletzt bearbeitet:

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Halt, du hast Recht. Mein Fehler - mir ist da was entgangen.
Hier, so sollte es funktionieren:

Code:
set src to "$HOME/Music/iTunes/iTunes Music/"
set dest to "/Volumes/DEINSTICK"
set numSpecialdest to "0" -- <-- da den namen des ordners eintragen, bei dem alle sonderzeichen und zahlen auftauchen sollen

set src to do shell script "echo " & src --um das $HOME aufzulösen

tell application "Finder"
	set artistFolders to (items of (POSIX file src as alias))
	repeat with aArtistFolder in artistFolders
		set fName to name of aArtistFolder
		
		set sortFoldername to my getFirstChar(fName)
		
		if (class of aArtistFolder) = folder then
			set syncSrc to (text 1 thru -2 of (POSIX path of (aArtistFolder as alias)))
			set syncDest to dest & "/" & sortFoldername & "/" -- & fName
		else
			set syncSrc to (POSIX path of (aArtistFolder as alias))
			set syncDest to dest & "/" & numSpecialdest & "/"
		end if
		
		tell me to set rsync to (do shell script "rsync -Pahv " & quoted form of (syncSrc) & space & quoted form of (syncDest))
		
	end repeat
end tell


on getFirstChar(fName)
	repeat with aChar in (characters of fName)
		if "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" contains aChar then
			if "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" does not contain aChar then return my numSpecialdest
			set aChar to makeUpper(aChar)
			return aChar
		end if
	end repeat
	
	return my numSpecialdest
end getFirstChar


on makeUpper(aLetter)
	--von hier: http://macscripter.net/viewtopic.php?id=24753
	--see if the letter is in list of lower case letters
	considering case
		set myChar to offset of aLetter in "abcdefghijklmnopqrstuvwxyz"
		--if so, then return the upper case version
		if myChar > 0 then
			return character myChar of "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		else
			--else return the original character (it might be a number!)
			return aLetter
		end if
	end considering
end makeUpper
 

nick-tech

Erdapfel
Registriert
11.05.09
Beiträge
4
Danke noch mal!

Ich lasse das ganze gerade mal laufen, mal sehen was passiert. Das dauert ein zwei Stündchen.

Wäre es eigentlich irgendwie möglich sowas wie einen Fortschrittsbalken einzubauen oder irgendwas wo man sieht ob das Skript noch arbeitet? Momentan werkelt es ja vor sich hin ohne dass man irgend eine Information hat.

Aber mach dir keinen Stress, wenn das alles mal kopiert ist, sollte es ja schneller gehn.
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Wäre es eigentlich irgendwie möglich sowas wie einen Fortschrittsbalken einzubauen oder irgendwas wo man sieht ob das Skript noch arbeitet? Momentan werkelt es ja vor sich hin ohne dass man irgend eine Information hat.
Nicht mit applescript.

Man könnte ne growl-message für jeden Artist anzeigen lassen. Oder wenn es fertig ist... oder sowas. Wie das geht kannste bei Growl direkt in der Hilfe nachlesen.
 

nick-tech

Erdapfel
Registriert
11.05.09
Beiträge
4
Das mit den Growl-Messages probier ich noch.

Aber so funktioniert es jetzt prima, genau so wie ich das wollte.

Herzlichen Dank! Allein wär ich da wohl nie drauf gekommen...