Dateien mithilfe einer Playlist sortieren
Version vom 3. Januar 2008, 12:32 Uhr von K4m1K4tz3 (Diskussion | Beiträge)
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
- 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 # # Version: 0.8 # Zuletzt geändert am: 03.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; #---------------------------------Programm-------------------------------------- usage() { echo "Usage: $(basename $0) EXTENDED.M3U DIRECTORY" >&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 # steht in der Zeile #EXTM3U ? if [ "$ROW" == "#EXTM3U" ] ; then read ROW; continue; fi; # fängt die aktuelle Zeile mit #EXTINF an? echo $ROW | grep "#EXTINF" > /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 ! [ $? -eq 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.."); DESTINATION=$(printf "%s/%03d-%s-%s.mp3" $2 $STARTNUMBER "$ARTIST" "$TITLE"); #DESTINATION=${DESTINATION//\ /_} # Dadurch können alle Lehrzeichen durch _ ersetzt werden. 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;