Dateien mithilfe einer Playlist sortieren: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: === 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, d...) |
|||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 11: | Zeile 11: | ||
* man kann angeben, mit welcher Nummer begonnen werden soll | * man kann angeben, mit welcher Nummer begonnen werden soll | ||
* Interpret und Titel werden aus den id3-Tags entnommen und im Dateinamen eingefügt | * 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 | * kopiert ausschließlich MP3 Dateien | ||
Zeile 24: | Zeile 25: | ||
# | # | ||
# Die Programme id3info und recode werden benötigt | # Die Programme id3info und recode werden benötigt | ||
+ | # Die letzte Zeile muss eine Lehrzeile sein! | ||
# | # | ||
− | # Version: 0. | + | # Version: 0.10 |
− | # Zuletzt geändert am: | + | # Zuletzt geändert am: 09.01.2008 |
# | # | ||
# Autor: Mathias Rabe | # Autor: Mathias Rabe | ||
Zeile 40: | Zeile 42: | ||
#Nummer mit der angefangen werden soll zu zählen. | #Nummer mit der angefangen werden soll zu zählen. | ||
STARTNUMBER=1; | STARTNUMBER=1; | ||
+ | |||
+ | #sollen alle Leerzeichen mit _ ersetzt werden? | ||
+ | # TODO: vielleicht mache ich das so, dass man das beim Aufruf einstellen kann | ||
+ | UNDERSCORES=0; | ||
#---------------------------------Programm-------------------------------------- | #---------------------------------Programm-------------------------------------- | ||
usage() { | usage() { | ||
− | echo "Usage: $(basename $0) | + | echo "Usage: $(basename $0) PLAYLIST.M3U TARGETDIRECTORY" >&2; |
exit 1; | exit 1; | ||
}; | }; | ||
Zeile 82: | Zeile 88: | ||
read ROW; | read ROW; | ||
while [ $? -eq 0 ] ; do | while [ $? -eq 0 ] ; do | ||
− | + | # fängt die aktuelle Zeile mit # an? | |
− | + | echo $ROW | grep "^#" > /dev/null; | |
− | |||
− | |||
− | |||
− | # fängt die aktuelle Zeile mit # | ||
− | echo $ROW | grep "# | ||
if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
read ROW; | read ROW; | ||
Zeile 115: | Zeile 116: | ||
# Ist es auch eine mp3 Datei? | # Ist es auch eine mp3 Datei? | ||
echo $(file -ib "$ABSOLUTPATHOFFILE") | grep "audio/mpeg" > /dev/null; | echo $(file -ib "$ABSOLUTPATHOFFILE") | grep "audio/mpeg" > /dev/null; | ||
− | if | + | if [ $? -ne 0 ] ; then |
echo "Error: File $ABSOLUTPATHOFFILE is no mp3 file. Trying next one." >&2; | echo "Error: File $ABSOLUTPATHOFFILE is no mp3 file. Trying next one." >&2; | ||
ERRORNUM=$((ERRORNUM+1)); | ERRORNUM=$((ERRORNUM+1)); | ||
Zeile 124: | Zeile 125: | ||
ARTIST=$(id3info "$ABSOLUTPATHOFFILE" | grep "TPE1" | tail --lines=1 | sed "s/=== TPE1 (Lead performer(s)\/Soloist(s)): //" | recode "latin-1.."); | 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.."); | 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"); | + | # Artist und Titel gefunden? |
− | #DESTINATION=${DESTINATION//\ /_} # | + | 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"; | cp -v "$ABSOLUTPATHOFFILE" "$DESTINATION"; | ||
if [ $? -ne 0 ] ; then | if [ $? -ne 0 ] ; then | ||
Zeile 142: | Zeile 152: | ||
exit 0; | exit 0; | ||
</pre> | </pre> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | [[Multimedia|Zurück zu Multimedia]][[Kategorie:Multimedia]] | ||
+ | [[Shellscripte|Zurück zu den Shellscripten]][[Kategorie:Shellscripte]] |
Aktuelle Version vom 9. Januar 2008, 18:41 Uhr
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;