Dateien mithilfe einer Playlist sortieren

Aus Linupedia
Wechseln zu: Navigation, Suche

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;

Zurück zu MultimediaZurück zu den Shellscripten