Darkraziel
Anmeldungsdatum: 14. September 2008
Beiträge: 69
|
Hallo allerseits Ich bin im momment an einem bash-Script welches mir meine Musiksammlung nach ID3-Tags sortiert und die Ordnerstruktur und Titelnahmen mit den Ausgelesenen Informationen erstellt.
Nun habe ich das Problem das mir das Programm id3info die Umlaute falsch ausliest. als Beispiel: ü → � Nun kann ich aber in der bash ganz normal umlaute schreiben und auch mit Echo ausgeben.
Was muss ich tun damit mir das Symbol auch richtig angezeigt wird? Im Amarok wird mir der Titel auch mit umlauten angezeigt, daher kann ich sicher sein, das dieser auch richtig abgespeichert ist.
Kann ich in meinen Script irgendwie temporär den Zeichensatz ändern und am ende wieder zurksetzen?
Und wie finde ich überhaupt heraus welchen Zeichensatz ich dafür benutzen muss, wenn dieser überhaupt das Problem ist. Gruss
|
schusch
Anmeldungsdatum: 2. September 2008
Beiträge: 324
Wohnort: Berlin
|
Die bash wertet die LC-Umgebungsvariablen aus. Welchen Zeichensatz die bash nimmt, sagt dir
locale Nun musst du entweder der Bash sagen, das Sie einen anderen Zeichensatz nimmt, z.B.
export LC_ALL=de_DE.<anderer Zeichensatz> oder du sagst id3info (ich kenne das Programm nicht, daher weiß ich nicht, ob das von id3info unterstützt wird),
dass es den in der bash eingestellten Zeichensatz nehmen soll. Die dritte Variante ist, dass der Zeichensatz in deiner Konsole (gnome-terminal?) falsch eingestellt ist.
|
Darkraziel
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 69
|
Danke für Deine Antwort. Ich habe nun in Kate bereits einige Zeichensätze durchgeswitcht um eventuell erkennen zu können mit welchem das Zeichen richtig angezeigt wird, leider ohne sichtbaren Erfolg.
Gibt es eine Möglichkeit den Zeichensatz des Betreffenden Zeichens herauszufinden?
Mit id3info kann ich den Zeichensatz scheinbar nicht ändern. Oder falls auch dies nicht geht, kann ich irgendwie die Zeichen in dem String ersetzen? Ich habe nun auch ein zweites tool (id3tool) gefunden mit welchem ich ID3-Tags auslesen kann, jedoch kann dies bei einigen Dateien gar keine Tags mehr auslesen.
Kennt jemand noch ein ganz gutes mit welchem es gehen könnte? Ich möchte ungerne wegen ein paar Zeichen mein bereits funktionierendes Script aufgeben müssen...Als Alternative kann ich das dann noch in C++ versuchen, aber auch da habe ich nur knapp die Basics. Ne Bibliothek dafür würde es sicher geben. Gruss
|
JaiBee
Anmeldungsdatum: 8. Juni 2007
Beiträge: 1469
|
Schau dir mal EyeD3 an, welches auch in den Paketquellen enthalten ist. Es ist primär dafür gedacht, die ID3-Tags neu zu schreiben, kann aber auch die vorhandenen Tags auslesen und die Dateien mit --rename umbenennen. Gruß JaiBee EDIT: Titel:
eyeD3 *.mp3 | grep title | cut -f1 | cut -d: -f2
Interpret:
eyeD3 *.mp3 | grep title | cut -f3 | cut -d: -f2
Album:
eyeD3 *.mp3 | grep album | cut -f1 | cut -d: -f2
Jahr:
eyeD3 *.mp3 | grep album | cut -f3 | cut -d: -f2
Jetzt müssen nur noch die Leerzeichen am Anfang weg (geht vermutlich mit sed ). Vielleicht geht's aber auch noch einfacher 😉. nochmal EDIT: Wenn aber ein Tag fehlt ändert sich logischerweise die Ausgabe von eyeD3 und das Herausschneiden des gewünschten Strings mit cut (s.o.) kann fehlschlagen! Besser ist es, wenn man z.B. die Wörter nach title: , artist: etc. ausliest und auf cut verzichtet. Weiß aber selbst nicht wie das geht (nur, dass es prinzipiell möglich ist).
|
Darkraziel
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 69
|
Danke viel mal 😊 Mit diesem Programm werden auch die Umlaute richtig angezeigt. Den Dateinamen werde ich wohl trotzdem mit meinem Script ändern, es funktioniert bereits und macht mir die Ordnerstruktur wie ich es gerne hätte.
Ich suche mir dann auch noch eine Möglichkeit ein Fehlendes Tag zu umgehen, mal schauen was mir dazu noch einfällt. EDIT:
Nach einem kurzen test scheint es so das sich die Tags nicht verschieben wenn sie leer sind, zum test habe ich einfach ein Tag leer gesetzt. Danke noch mal Gruss
|
JaiBee
Anmeldungsdatum: 8. Juni 2007
Beiträge: 1469
|
Darkraziel schrieb: EDIT:
Nach einem kurzen test scheint es so das sich die Tags nicht verschieben wenn sie leer sind, zum test habe ich einfach ein Tag leer gesetzt.
Ok, das klingt gut. Ansonsten hättest du auch die Option -v verwenden können, bei der pro Zeile bloß 1 Wert steht:
eyeD3 -v *.mp3 | grep Title | cut -d: -f2- | sed 's/^ //' | sed 's/>$//'
oder etwas kürzer:
eyeD3 -v *.mp3 | grep Title | cut -d: -f2- | sed 's/^ //;s/>$//'
Mit dem ersten sed-Kommando scheidest du das Leerzeichen am Anfang weg, mit dem zweiten das > am Ende. Gruß PS: Du kannst natürlich auch die erste Variante nehmen, wenn die wirklich keine Probleme bereitet.
EDIT: Du musst bei cut unbedingt alles nach dem : ausgeben (-f2-), sonst gibt es Fehler, wenn ein Tag einen Doppelpunkt enthält (dieser würde dann nach dem Doppelpunkt abgeschnitten werden). Bei der ersten Variante von heute Mittag ist das jedoch nicht möglich, weshalb du lieber auf diese hier zurückgreifen solltest. Teste aber lieber nochmals alles, falls ich noch etwas vergessen haben sollte 😉.
|
Darkraziel
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 69
|
Danke noch mal, damit sollte es nun ganz gut gehen. Das mit dem -v habe ich noch nicht gewusst, es ist auf jeden Fall um einiges einfacher ☺
Und noch danke für das sed-dingens. Ich hab mir das gestern etwas um die Ohren geschlagen, aber ich kam nicht so recht weiter.
Das mit dem Doppelpunkt habe ich mir schon gedacht da ich tatächlich Interpreten mit Doppelpunkt im Namen habe, aber ich habe nicht gewusst wie ich das umgehen kann. Deswegen habe ich versucht, den File-seperator zu ändern, eyeD3 sollte das mit dem Parameter -F können, leider hat sich nichts geändert wenn ich dort ein anderes Zeichen gesetzt habe. Noch etwas:
Gibt es eigentlich ne Möglichkeit das ich eyeD3 nur einmal Aufrufe, die Ausgabe in eine Variable leite und erst dann das ganze auseinander nehmen? Ich habe nämlich gemerkt das es z.B für ogg schneller geht da es ein anderes Programm ist, da ist ein dreimaliger Programmaufruf natürlich um einiges langsamer. Gruss
|
JaiBee
Anmeldungsdatum: 8. Juni 2007
Beiträge: 1469
|
Darkraziel schrieb: Noch etwas:
Gibt es eigentlich ne Möglichkeit das ich eyeD3 nur einmal Aufrufe, die Ausgabe in eine Variable leite und erst dann das ganze auseinander nehmen? Ich habe nämlich gemerkt das es z.B für ogg schneller geht da es ein anderes Programm ist, da ist ein dreimaliger Programmaufruf natürlich um einiges langsamer.
Du könntest die Ausgabe evtl. erst in eine Datei umleiten und dann diese zur weiteren Verarbeitung einlesen: 1
2
3
4
5
6
7
8
9
10
11
12
13 | temp=$(mktemp)
cd "/multimedia/<user>/Musik/Rock/Die Ärzte (2003) - Geräusch/CD 1/"
eyeD3 -v "01 Als ich den Punk erfand.mp3" > $temp
title=$(grep Title $temp | cut -d: -f2- | sed 's/^ //;s/>$//')
artist=$(grep performer $temp | cut -d: -f2- | sed 's/^ //;s/>$//')
album=$(grep Album $temp | cut -d: -f2- | sed 's/^ //;s/>$//')
year=$(grep Year $temp | cut -d: -f2- | sed 's/^ //;s/>$//')
echo "\"$title\" von \"$artist\" auf \"$album\" ($year)"
rm $temp
|
$ ~/skripte/test
"Als ich den Punk erfand" von "Die Ärzte" auf "Geräusch - CD 1" (2003) Ich bin aber auch kein Bash-Experte, weshalb ich vermute, dass es noch eine schönere Varianten gibt. Damit dir, Darkraziel, vielleicht jemand anderes noch helfen kann, poste ich hier mal eine Beispielausgabe von eyeD3, die verarbeitet werden soll:
$ eyeD3 -v "01 Als ich den Punk erfand.mp3"
01 Als ich den Punk erfand.mp3 [ 2.59 MB ]
-------------------------------------------------------------------------------
Time: 01:53 MPEG1, Layer III [ 192 kb/s @ 44100 Hz - Joint stereo ]
-------------------------------------------------------------------------------
ID3 v2.3:
title: Als ich den Punk erfand artist: Die Ärzte
album: Geräusch - CD 1 year: 2003
track: 1/13 genre: Rock (id 17)
UserTextFrame: [Description: Tagging time]
2009-10-07T13:37:02
-------------------------------------------------------------------------------
ID3 Frames:
<Title/songname/content description (TIT2): Als ich den Punk erfand>
<Lead performer(s)/Soloist(s) (TPE1): Die Ärzte>
<Album/Movie/Show title (TALB): Geräusch - CD 1>
<Part of a set (TPOS): 1>
<Year (TYER): 2003>
<Track number/Position in set (TRCK): 01/13>
<Content type (TCON): (17)>
<User defined text information frame (TXXX): {Desc: Tagging time} 2009-10-07T13:37:02> Gruß JaiBee
|
Darkraziel
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 69
|
Ich habe nun die Ausgabe in eine Datei umgeleitet und danach so weiter gearbeitet, das ganze würde so auch gehen.
Nun habe ich aber doch noch eine Möglichkeit gefunden wie ich das ganze in einem rutsch machen kann:
eyeD3 -v "$name" | grep -a "TIT2\|TALB\|TPE1" |
while read tag; do
arr[$i]=`echo $tag | cut -d: -f2- | sed 's/^ //;s/>$//'`;
i=$[$i+1];
echo ${arr[0]}; #mark 1
done;
echo ${arr[0]}; # mark 2
ich mache ein grepp nach dem eyeD3 in dem die drei Begriffe gesucht und die entsprechenden Zeilen ausgegeben werden.
Diese werden dann in das Array arr[] gespeichert. Nun aber ein grosses Problem: in der Schleife ist alles wunderbar, bei mark 1, also dem echo wird alles schön ausgegeben.
Nach dem 'done;' bei mark 2 ist die Variable aber leer und ich habe keine Ahnung wie ich das hin kriege.
Ich habe bereits versucht arr0, 1 und 2 über der Schleife zu setzen, hat leider nichts gebracht. Irgendeine Idee? Gruss
|
JaiBee
Anmeldungsdatum: 8. Juni 2007
Beiträge: 1469
|
Darkraziel schrieb: Nun habe ich aber doch noch eine Möglichkeit gefunden wie ich das ganze in einem rutsch machen kann:
👍 *wieder was gelernt*
Nun aber ein grosses Problem: in der Schleife ist alles wunderbar, bei mark 1, also dem echo wird alles schön ausgegeben.
Nach dem 'done;' bei mark 2 ist die Variable aber leer und ich habe keine Ahnung wie ich das hin kriege.
Die Pipes sind die Fehlerursache, da damit eine Subshell gestartet wird. Die müssten also irgendwie weg. Wie das geht, weiß ich nicht, da müsstest du also mal googeln 😉. Gruß
|