Playlist-Generator

Ich habe meine mp3/ogg-Datein in einem Verzichnisbaum in der Form /<pfad zum Verzeichnis>/<Anfangsbuchstabe der Band>/<Band>/<Album>[/<CD1,2,...>]
In einem anderen Verzeichnis sollen Playslists der Form <Band> - <Album>[ - CD1,2,..].m3u erstellt werden.

Dazu lasse ich eine Schleife über alle Verzeichnisse laufen, wobei ich Leerzeichen substituieren muss, da die for-Schleife das Leerzeichen als Seperator benutzt. In der Schleife müssen dann die Leerzeichen zurücksubstituiert werden.
Dann wird gecheckt, ob dieses Verzeichnis mp3 oder ogg-Files enthält und eine Playlist erstellt. Dann wird geprüft, ob alles geklappt hat.
Zum Schluss wird eine kleine Statistik ausgegeben.


Vorraussetzungen: keine ungewöhnlichen (bash, find, sed)

  1. Das find, das die Playlist erstellt, muss durch einen sort gepiped werden, da for ... `find ....` nicht sortiert ist. Die Dateinamen müssen also sortierbar sein, ohne dass die Struktur des Albums zerstört wird, dh. die Dateinamen müssen am Anfang durchnummeriert sein, was allerdings Standard ist.
  2. Wer eine andere Struktur verwendet, muss ein paar Sachen anpassen.
    In Zeile 26 wird der Dateiname der m3u-Datei erzeugt. Wer Dateibäume der Form <pfad>/<band>/<album> hat (und nicht wie ich <pfad>/<anfangsbuchstabe>/<band>/<album>), muss beim ersten sed das /. rausnehmen (der Punkt steht für ein beliebiges Zeichen, also hier den Anfangsbuchstaben).
  3. Die erste Bedingung (Zeile 18 ) siebt Verzeichnisse aus, die man nicht berücksichtigen will, bei mir solche die mit einem Leerzeichen anfangen - wers nicht braucht kanns auch rausschmeissen
  4. Als Seperator für sed habe ich den Doppelpunkt verwendet, da ich einfach mal angenommen habe, dass der am seltensten vorkommt. Falls doch, habt ihr ein Problem ;)

 


#!/bin/bash

# search and output path
media_path=/media/Mp3
m3u_path=.

# init some counters
c_error=0
c_m3u=0
c_m3udamag=0
c_lost=0
c_all=0
c_ok=0
c_dirs=0

for i in `find $media_path -type d | sed "s/ /%%blank%%/g"`; do
path=`echo $i | sed "s/%%blank%%/ /g"`;
[ `echo $path | grep -c "$media_path/ "` -eq 1 ] &&
{
echo "omitting $path..."
} || {
files=`find "$path" -maxdepth 1 -iname '*.mp3' -o -iname '*.ogg' | grep -c ""`
[ $files -gt 0 ] &&
{
echo "found $files files in $path..."
filename=`echo $path | sed "s:$media_path/./::" | sed "s:/: - :g" | sed "s:_: :g"` &&
{
filename="$m3u_path/$filename.m3u"
echo ">>> creating $filename..."
echo "#EXTM3U" > "$filename"
find "$path" -maxdepth 1 -iname '*.mp3' -o -iname '*.ogg' | sort >> "$filename"
c_m3u=$(($c_m3u+1))
echo -n ">>> checking file..."
c_count=1
for j in `cat "$filename" | grep -v -e "^#" | sed "s/ /%%blank%%/g"`; do
file=`echo $j | sed "s/%%blank%%/ /g"`
[ -e "$file" ] &&
{
echo -n "$c_count "
c_ok=$(($c_ok+1))
} || {
echo -e "nLOST FILE: $file"
c_lost=$(($c_lost+1))
}
c_count=$(($c_count+1))
c_all=$(($c_all+1))
done
echo
} || {
echo "FAILED: could not parse $path!"
c_error=$(($c_error+1))
}
} || {

echo "omitting empty path $path..."
}
}
c_dirs=$(($c_dirs+1))
done

echo "done - processed $c_dirs directories, created $c_m3u m3u-files, linked $c_all files, $c_lost files lost, $c_ok files ok, $c_error strange errors"

eingereicht durch BlackStar


Letzte Aktualisierung 18.01.2008 von HazardEvil