Dateien mithilfe einer Playlist sortieren
playlistcopy.sh
Einleitung
Dieses Script ist entstanden, als ich vor dem Problem stand, geordnet meine MP3s auf eine Daten-CD zu brennen. Ziel war es, dass ein CD-Player die Lieder in der Reihenfolge abspielt, wie ich es wollte. Da ich kein passenden Programm gefunden habe, welches zudem noch die id3-Tags auswertete, um sie in den Namen der Dateien zu schreiben, machte ich mich ans Werk und schuf dieses kleine Script.
Funktionen
- lesen einer m3u Playlist
- bis zu 1000 Dateien werden kopiert und durchnummerriert
- man kann angeben, mit welcher Nummer begonnen werden soll
- Interpret und Titel werden aus den id3-Tags entnommen und im Dateinamen eingefügt
- falls keine id3-Tags vorhanden sind, wird der alte Name benutzt und nur die aktuelle Nummer davor gehängt
- kopiert ausschließlich MP3 Dateien
Das Script playlistcopy.sh
#!/bin/sh # # Dieses Script liest eine m3u Playlist aus, kopiert die darin enthaltenen Dateien # und benennt sie der Reihelfolge um, wie sie in der Playlist stehen. # Bsp: 001-ARTIST-TITLE.mp3, 002-ARTIST-TITLE.mp3, etc. # So können sie dann z.B. auf eine Daten-CD kopiert werden und werden der Reihe nach # von einem CD-Player abgespielt. # # Die Programme id3info und recode werden benötigt # Die letzte Zeile muss eine Lehrzeile sein! # # Version: 0.10 # Zuletzt geändert am: 09.01.2008 # # Autor: Mathias Rabe # # Der Autor übernimmt keinerlei Garantie auf evtl. entstehende Schäden. # # Dieses Script steht unter der GPL. Es gelten daher die dort # vorgeschriebenen Bedingungen für die Verwendung dieses Scriptes. #--------------------------------Einstellungen---------------------------------- #Nummer mit der angefangen werden soll zu zählen. STARTNUMBER=1; #sollen alle Leerzeichen mit _ ersetzt werden? # TODO: vielleicht mache ich das so, dass man das beim Aufruf einstellen kann UNDERSCORES=0; #---------------------------------Programm-------------------------------------- usage() { echo "Usage: $(basename $0) PLAYLIST.M3U TARGETDIRECTORY" >&2; exit 1; }; # Prüfen ob wirklich alles angegeben wurde if test $# -ne 2 ; then usage; fi; if ! test -r $1 ; then echo "Playlist $1 doesn't exist." >&2; usage; fi; if ! test -d $2 ; then echo "Directory $2 doesn't exist. Creating it."; mkdir $2; if [ $? -ne 0 ] ; then exit 1; fi; fi; # existiert das Programm id3tag? if ! test -e /usr/bin/id3info ; then echo "Couldn't find /usr/bin/id3info" >&2; exit 1; fi # existiert das Programm recode? if ! test -e /usr/bin/recode ; then echo "Couldn't find /usr/bin/recode" >&2; exit 1; fi ERRORNUM=0; exec <$1; read ROW; while [ $? -eq 0 ] ; do # fängt die aktuelle Zeile mit # an? echo $ROW | grep "^#" > /dev/null; if [ $? -eq 0 ]; then read ROW; continue; fi; # Leerzeile gefunden? echo $ROW | grep "^$" > /dev/null; if [ $? -eq 0 ]; then echo "Error: Empty line found. Please clean up your playlist." >&2; exit 2; fi; # Ist die Datei wirklich vorhanden, welche in der Playlist steht? if ! test -e "$ROW" ; then #der absolute Pfad ging nicht, also versuchen wir es nochmal mit dem relativen Pfad DIRNAMEOFLIST=$(dirname $1); ABSOLUTPATHOFFILE=$(printf "%s/%s" "$DIRNAMEOFLIST" "$ROW") if ! test -e "$ABSOLUTPATHOFFILE" ; then echo "Error: File $ABSOLUTPATHOFFILE doesn't exist. Trying next one." >&2; # Die Ausgabe ist zwar Müll, aber es funktioniert ERRORNUM=$((ERRORNUM+1)); read ROW; continue; fi; else ABSOLUTPATHOFFILE=$ROW; fi; # Ist es auch eine mp3 Datei? echo $(file -ib "$ABSOLUTPATHOFFILE") | grep "audio/mpeg" > /dev/null; if [ $? -ne 0 ] ; then echo "Error: File $ABSOLUTPATHOFFILE is no mp3 file. Trying next one." >&2; ERRORNUM=$((ERRORNUM+1)); read ROW; continue; fi; # Alles ok? Dann kopier und benenne sie um! ARTIST=$(id3info "$ABSOLUTPATHOFFILE" | grep "TPE1" | tail --lines=1 | sed "s/=== TPE1 (Lead performer(s)\/Soloist(s)): //" | recode "latin-1.."); TITLE=$(id3info "$ABSOLUTPATHOFFILE" | grep "TIT2" | tail --lines=1 | sed "s/=== TIT2 (Title\/songname\/content description): //" | recode "latin-1.."); # Artist und Titel gefunden? if [ -z "$ARTIST" -o -z "$TITLE" ] ; then DESTINATION=$(printf "%s/%03d-%s" $2 $STARTNUMBER "$(basename "$ROW")"); else DESTINATION=$(printf "%s/%03d-%s-%s.mp3" $2 $STARTNUMBER "$ARTIST" "$TITLE"); fi; # Leereichen ersetzen if (( $UNDERSCORES )) ; then DESTINATION=${DESTINATION//\ /_} fi; # und endlich alles kopieren cp -v "$ABSOLUTPATHOFFILE" "$DESTINATION"; if [ $? -ne 0 ] ; then echo "An unexpected error occured. Abort"; exit 1; fi; STARTNUMBER=$((STARTNUMBER+1)); read ROW; done; if [ $ERRORNUM -ne 0 ]; then echo "There where $ERRORNUM errors." >&2; exit 2; fi; exit 0;