iTunes-Mediatheken synchronisieren
Schon seit längerem bastle ich ja immer wieder an der Problematik herum, zwei Macs synchron zu halten. Von der Idee, sämtliche Daten und Applikationen ständig synchron auf meinem Mini zu haben, um im Fall der Fälle nahtlos dort weiterarbeiten zu können, habe ich mich allerdings schon seit längerem verabschiedet. Sollte sich mein Notebook verabschieden, könnte ich ja immernoch die Platte ausbauen, oder via Time-Machine auf dem Mini einen Restore fahren. Allerdings ist der Mini ja meine Medien-Zentrale, vor allem für Musik, und auch um mal eben ein paar Fotos via Fernseher vorführen zu können.
Fotos und Musik landen prinzipiell aber immer erstmal auf dem Notebook, da ich dort die Kamera anschließe oder neue Musik in iTunes importiere. Meine iTunes-Mediathek, wie auch die iPhoto-Datenbank muss also mit dem Mini synchronisiert werden. Dafür hatte ich schon seit längerem ein rsync-Skript laufen, welches sich stündlich im Hintergrund auf dem Mini einloggt und geänderte Daten rüberschiebt. Bedient wurde die Jukebox via Fernseher (Frontrow) oder über den in Leopard eingebauten VNC-Server.
Jetzt habe ich ja aber ein iPhone und damit natürlich die wunderbare Applikation Remote, mit der ich nun iTunes auf dem Mini steuere. Dazu muss jedoch iTunes bereits laufen, ich habe es also als Autostart eingerichtet. Läuft jedoch iTunes und gleichzeitig läuft der rsync-Job, so bekommt iTunes von evtl. neuen Musikdateien nichts mit. Schlimmer noch, beim Schließen von iTunes, überschreibt es die nun geänderte Datenbank mit dem bisherigen Stand, der beim Starten von iTunes vorhanden war. Die neuen Musikdateien sind damit zwar auf den Mini kopiert, iTunes weiss jedoch nichts davon. Der Sync darf also nur laufen, wenn iTunes gerade nicht läuft.
Somit musste ich mich von einem automatisierten Sync verabschieden, was jedoch nicht weiter schlimm ist, da ich ja nicht täglich neue Musik oder neue Fotos habe. Den Job kann ich jetzt auch einfach über Quicksilver mit wenigen Tastenanschlägen anwerfen. Aber der Reihe nach:
Die Idee war zunächst, mein Shell-Skript, welches den rsync beinhaltet dahingehend zu ergänzen, dass die Prozess-ID vom laufenden iTunes ermittelt wird, und dieser Prozess dann gekillt wird. Damit habe ich mich dann längere Zeit abgemüht, schließlich bin ich ja ein Unixer der alles mit der Shell machen kann. Naja, nach einigen erfolglosen Versuchen habe ich dann meine “Was der Bauer nicht kennt…”-Haltung doch über Bord geworfen, und mal kurz nach Applescript gegooglt…da war doch was. Und richtig, dann war da was. Auf einmal war es ganz einfach. Das Tolle ist vor allem, dass man diese Skripte ganz einfach als Applikation abspeichern kann. Wenn schon nicht mehr automatisch, dann sollte es ja zumindest komfortabel – ohne ein Terminal öffnen zu müssen – startbar sein. Quicksilver lässt grüßen. Letztlich dabei heraus kamen jetzt 3 Applescript-Programme und das bisherige Shellskript mit dem rsync. Das ganze läuft folgendermaßen ab:
Per Quicksilver starte ich das Haupt-Programm, ein Applescript, welches nichts anderes macht, als das Shellskript zu starten:
do shell script "/Users/thomas/Library/Scripts/sync/sync.sh"
In diesem wird zunächst auf dem Notebook, und dann auf dem Mini ein Applescript aufgerufen, welches iTunes (und natürlich auch iPhoto) schließt:
tell application "iTunes" quit end tell tell application "iPhoto" quit end tell
Anschließend läuft der rsync, und dann wird iTunes wieder gestartet.
tell application "iTunes" run end tell
Eigentlich ganz einfach, und es funktioniert auch einwandfrei. Einzig wenn gerade in Upgrade von iTunes installiert wurde (so wie heute), und man die neue Lizenzvereinbarung abnicken muss, ist etwas Handarbeit gefragt, damit das automatische Schließen von iTunes funktioniert. Aber das kommt ja auch nicht allzu häufig vor. Der Vollständigkeit halber hier auch noch das Shell-Skript:
#!/bin/bash cd /Users/thomas/Library/Scripts/sync ping -c 3 mini.local > /dev/null if [ "$?" = "0" ]; then /Users/thomas/Library/Scripts/sync/quit.app ssh thomas@mini.local /Users/thomas/Library/Scripts/sync/quit.app sleep 10 rsync -Eavz --delete /Users/thomas/Music mini.local:/Users/thomas/ >> log/sync.log rsync -Eavz --delete /Users/thomas/Pictures mini.local:/Users/thomas/ >> log/sync.log rsync -Eavz /Users/thomas/Movies mini.local:/Users/thomas/ >> log/sync.log rsync -Eavz --delete /Users/thomas/Library/Scripts mini.local:/Users/thomas/Library >> log/sync.log sleep 5 ssh thomas@mini.local /Users/thomas/Library/Scripts/sync/run.app /Users/thomas/Library/Scripts/sync/run.app mv log/sync.log log/sync_`date "+%Y-%m-%d_%H:%M:%S"`.log find log -mtime +60 | /usr/bin/xargs rm -rf else echo "Host mini is down. No sync possible." > log/sync_`date "+%Y-%m-%d_%H:%M:%S"`.log find log -mtime +60 | /usr/bin/xargs rm -rf fi
Damit der rsync ohne Eingabe eines Passworts funktioniert, muss natürlich der ssh-Key des Notebook-Users dem Mini-User bekannt sein. Bevor man dafür lange rumpfuscht, kann man auch einfach folgendes Skript nehmen, was ich mal irgendwo gefunden habe, und was mir schon oft gute Dienste geleistet hat:
#!/bin/sh
echo
echo This script will help you setup ssh public key authentication.
host=dummy
while [ -n "$host" ]; do
echo -n "SSH server: "
read host
if [ -n "$host" ]; then
echo -n "user[$USER]: "
read usr
if [ -z "$usr" ]; then
usr=$USER
fi
echo "Setting up RSA authentication for ${usr}@${host}..."
if [ -f ~/.ssh/id_rsa.pub ]; then
echo "RSA public key OK."
else
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
fi
scp ~/.ssh/id_rsa.pub ${usr}@${host}:~/
ssh ${usr}@${host} "if [ ! -d ~/.ssh ]; then
mkdir ~/.ssh
fi
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub"
echo
echo "You should see the following message without being prompted for anything now..."
echo
ssh ${usr}@${host} "echo !!! Congratulations, you are now logged in as ${usr}@${host} !!!"
echo
echo "If you were prompted, public key authentication could not be configured..."
echo
echo "Enter a blank servername when done."
echo
fi
done
echo "End of configuration"
Hi. Klasse Arbeit. Leider verstehe ich vom ganzen Programmiertext nicht so viel, daher sind solche Menschen, die das können, sehr wichtig. Ich habe mir auch die Anschaffung eines Mac Mini erdacht. Und dafür wäre eine Synchronisation sehr praktisch. Ich hoffe ich komme mit Deinen Angaben klar und es funktioniert dann auch so, aber noch habe ich den Mini ja nicht. Grüße, winni
Hallo Winni,
kannst dich gerne wieder melden, wenn das konkret wird. Ich weiss, die skripte sind nicht unbedingt besonders schön geschrieben, das war eher der “it-works-so-forget-it”-approach ;-) Aber der Mini ist klasse als Media Center! Allerdings kommen Anfang 2009 evtl. neue, also wenn du nicht einen gebrauchten bei ebay holen willst, solltest du evtl. noch etwas warten.
Hi,
Ich habe über das Apfeltalk-Forum (http://www.apfeltalk.de/forum/itunes-iphoto-zwischen-t14976.html) zu deiner Seite gefunden.
Ich habe eine ähnliche Problematik, die du hier löst.
Allerdings habe ich wie der Vorposter ziemlich wenig Ahnung von Apple-Script und weiß daher nicht genau ob ich deine Lösung auf mein Problem anwenden kann. Ich beschreibe es mal ganz kurz:
Ich besitze eine MacBook und eine Festplatte die an meiner Airport Extreme angeschlossen ist. Derzeit habe ich auf beiden “Systemen” eine Mediathek angelegt. Eine “große” mit allen Daten auf der Airport-Festplatte und eine kleine abgespeckte zum Mitnehmen auf dem MacBook. Wenn ich jetzt neue Musik habe muss ich diese immer manuell auf die Airport-Platte ziehen und in die Mediathek importieren. Ich hatte jetzt überlegt, mit einem Programm wie Chronosynk die MP3s zu syncen. Allerdings werden diese dann nicht in die XML von iTunes geschrieben. Als zusätzlicher Haken kommt wie gesagt, die Tatsache, dass ich auf dem MacBook gerne eine abgespeckte Version haben möchte und auf der Festplatte die gesamte Mediathek – es darf also nur vom MacBook auf die Festplatte gesynct werden und nicht umgekehrt.
Ist dies möglich, wenn ja wie? Über eine Antwort und oder Hilfe würde ich mich sehr freuen.
Philipp
Hi Philipp,
Das mit der XML ist eben genau das Problem, wie du auch schon richtig erkannt hast. Um dein Problem zu lösen, müsste man auch automatisiert die XML editieren. Wie gross ist denn deine Mediathek? Festplatten sind ja nicht mehr so teuer und lassen sich im MacBook problemlos austauschen ;-)
Das mit der Festplatte ist richtig, allerdings wär das ja keine richtige Problemlösung, sondern eher ein umgehen des Problems ;).
Die Mediathek ist derzeit (noch ohne meine digitalsierten Dvds von Filmen und Serien) 50GB groß. Sprich es wäre nur eine kurze Zeit bis eine größere Festplatte wieder gesprengt wird :(.
Hallo, ich habe mal ein Problem, vielleicht kann mir ja jemand helfen wäre schön ! Ich bin kein Mac User haben Windows XP und 2 Standorte an den ich mich in unregelmäßigen Zeiten aufhalte, auf jeden Rechner ist iTunes, habe 1 externe Western Digital Festplatte mit 500 GB, benutzt ca. 180 GB, nur Musik, jedesmal, wenn ich mich wo anders aufhalte und die Festplatte anschließe, wird die Bibliothek neu syncronisiert(dauert extrem lange) , aber wenn ich auf ein Titel klicke, sagt iTunes ich finde ihn nicht, wo ist er und jedesmal muß ich von vorne anfangen und iTunes sagen, wo die Lieder sich befinden, was aber langsam kein Spaß mer macht. Wie kann ich es fertig kriegen das sich dieses “Spiel” nicht mehr wiederholt ? Ich habe schon überlegt auf jeden PC eine große Festplatte (1-2 GB) einzubauen und eine separate für meinen Notebook und dann die Musik zu sync. so das die neue Musik sich auch auf den anderen PC sich befindet. Wer kann mir helfen ? Ich habe schon an einen Mac gedacht, aber ich finde Mac sehr teuer? Oder es gibt wie ich höre kaum Spiele ? Wer kann mir helfen?
Gruß bis bald
Ach, ich habe was vergessesn, welches Audioformat könnt Ihr mir empfehlen, ich wollte meine Musikbibliothek neu einscannen. Zur Zeit benutze ich AAC 256-320.
Hallo Eike,
mit deinem derzeitigen Setup habe ich keine Erfahrung und kann dir deshalb dazu leider auch keine Tipps geben. Aber wegen Mac kaufen: Macs sind auf den ersten Blick zwar teuer, machen dies aber durch sehr durchdachte und qualitativ hochwertige Hard- und Software wieder wett. Und spielen kannst du darauf auch, via Bootcamp lässt sich heute auch Windows installieren, alles kein Problem.
Ich hoffe ich finde hier eine Lösung/Antwort.
habe ein Macbook Pro, eine Time Capsule (500GB) und einen PC (Xp). Auf beiden System ist iTunes installiert.
Meine Musik habe ich via iTunes (Macbook) auf die TC gespielt (Speicherort des Itunes-Musikordners auf die TC gelegt). Das ganze funktioniert und ich kann Musik/Filme ohne Probleme mit dem Macbook gucken.
Jedoch soll auch auf dem PC alles so funktionieren. Das heißt, das ich auf die TC zugreife und alle Musik/Filme angucken kann und das alles synchronisiert wird!
Bisher kann ich von beiden Geräten auf die TC zugreifen und Musik hören, doch sobald ich neue Musik hinzufüge, wird es auf einem System nicht synchronisiert und das nervt gewaltig!
Gibt es da irgendeine Möglichkeit das ich auf eine Mediathek zugreife und das auf beiden System alles synchronisiert wird/bleibt/ist?
Hallo Freetagger,
Du hast nur die Bibliothek auf die TC kopiert, nicht aber die XML-Datei, in der iTunes all seine bekannten Titel verwaltet, die liegt noch immer auf jedem Rechner extra. Ich weiss aber nicht, ob sich Win-iTunes und Mac-iTunes diese Datei teilen können. Vor allem hast du ein Problem, wenn du am Mac Dateien hinzufügst, Win aber auch läuft und du später das Win-iTunes wieder zumachst. Dann schreibt Win die Datei neu, hat noch keine Ahnung von den neuen Titeln, und somit findet sie der Mac das nächste Mal auch wieder nicht….
Habe gerade mal versucht das Ganze nach zu bauen. Die quit.app wird aber leider nicht ausgeführt.
Fehlermeldung: /Users/kozi/scripts/quit.app: is a directory
Was mache ich da falsch? Mit einem Doppelklick kann man die Applikation ausführen beim Aufruf durch das Skript kommt oben genannte Fehlermeldung.
kozi
open /Users/thomas/Library/Scripts/sync/quit.appssh thomas@mini.local open /Users/thomas/Library/Scripts/sync/quit.app
...
...
ssh thomas@mini.local open /Users/thomas/Library/Scripts/sync/run.app
open /Users/thomas/Library/Scripts/sync/run.app
Wenn man die Zeilen um das Kommando open ergänzt funktioniert es jetzt auch bei mir.