Probleme mit Zeichensatz und externen Programmen

13/03/2010 - 13:33 von Florian Lindner | Report spam
Hallo,

ich habe ein Skript, welches FLAC in MP3 konvertiert. Dabei müssen auch die
Metadaten ausgelesen und in die mp3 geschrieben werden. Das ganze làuft auf
einen OpenSuse 11.2 mit LANG=de_DE.UTF-8. Die relevanten Codeteile schauen
so aus:

auslesen:

cmd = 'metaflac --show-tag="%s" "%s"' % (tag, path)
p = Popen(['metaflac','--show-tag=%s' % tag, path], stdout=PIPE)
tagVal = p.stdout.readline().decode("utf-8")

darauf mit eine map erstellt. schreiben:

setGenre = setGenreCommand % (map, target.decode("utf-8"))
Popen(setGenre.encode("utf-8"), shell=True)

das hat zwar soweit problemlos funktioniert, auch für deutsche Umlaute,
allerdings ist mir jetzt eine spanische Band names 'Héroes Del Silencio'
untergekommen. Der Dateiname wird zwar problemlos verarbeitet, nicht jedoch
der Artist Tag.

- Easytag zeigt ein Symbol für das Zeichen mit dem Akzent an.
- Amarok stolpert drüber und liest den Tag zwar korrekt aus, ordnet ihn aber
einen anderen Feld zu.
- id3v2 ignoriert die Akzente einfach: Heroes...

Jetzt weiß ich nicht genau, ob das ein Python Problem ist, oder irgendwo
anders in der Tool-Chain sitzt. Bin auf jeden Fall für alle Tipps dankbar.

Solltet Ihr ein ganz anderes Programm (CLI oder grafisch) zum automatischen
Konvertieren von flacs in mp3s empfehlen können, dann auch gerne...

Grüße,

Florian
 

Lesen sie die antworten

#1 Thomas Rachel
13/03/2010 - 14:39 | Warnen spam
Am 13.03.2010 13:33, schrieb Florian Lindner:

cmd = 'metaflac --show-tag="%s" "%s"' % (tag, path)
p = Popen(['metaflac','--show-tag=%s' % tag, path], stdout=PIPE)
tagVal = p.stdout.readline().decode("utf-8")



Das cmd scheint mir an dieser Stelle überflüssig zu sein. Zumindest ist
a) nicht erkennbar, daß Du es irgendwo verwendest, und b) ist der
Popen-Aufruf in dieser Form auch besser, so daß DU es eigentlich nicht
benötigen solltest.


darauf mit eine map erstellt. schreiben:



Ich glaub, da fe lt was...

setGenre = setGenreCommand % (map, target.decode("utf-8"))
Popen(setGenre.encode("utf-8"), shell=True)



Das da sieht aus, als könnte man es besser machen, insbesondere wegen
shell=True.

Ich würde die Aufrufe, die Du da vornimmst, erstmal in Funktionen kapseln.

So etwa:


def getflactag(tag, path):
"""Returns FLAC tag as unicode string."""
p = Popen(['metaflac','--show-tag=%s' % tag, path], stdout=PIPE)
tagVal = p.stdout.readline().decode("utf-8")
return tagVal

def id3v2(path, command, data):
"""Sets MP3 tag as unicode string."""
# keine Ahnung, was Du da machst - ich würde so vorgehen:
p = Popen(['id3v2','--%s=%s' % (command, data.encode("utf-8"))])
return p.wait()

(ungetestet!)


Das ist sicherlich noch verbesserungswürdig. Unter anderem sollte man
"utf-8" nicht hart kodieren, sondern ersetzen durch encoding, was vorher
so gesetzt wurde:

import locale
locale.setlocale(locale.LC_ALL, '')
encoding=locale.getpreferredencoding()


das hat zwar soweit problemlos funktioniert, auch für deutsche Umlaute,
allerdings ist mir jetzt eine spanische Band names 'Héroes Del Silencio'
untergekommen. Der Dateiname wird zwar problemlos verarbeitet, nicht jedoch
der Artist Tag.



Wenn Umlaute grundsàtzlich funktionieren, würde ich vermuten, daß die
Vorgehensweise grundsàtzlich korrekt ist. Du kannst ja, bevor Du den Tag
setzen làßt, den betreffenden String mal ausgeben, und zwar in Form
seiner repr(), und zwar sowohl in unicode als auch utf8.

Folgendes sollte dabei korrekt sein:

a='Héroes Del Silencio'
a






'H\xc3\xa9roes Del Silencio'
a.decode("utf8")






u'H\xe9roes Del Silencio'

Grundsàtzlich vorstellen könnte ich mir, daß die Information decomposed
statt precomposed in dem Tag liegt. Statt u'\xe9' steht also u'e\u0301'
drin, was gleich aussieht, aber eben anders kodiert ist:

a=u'He\u0301roes Del Silencio'
a






u'He\u0301roes Del Silencio'
print a






Héroes Del Silencio
print repr(a.encode("utf8"))






'He\xcc\x81roes Del Silencio'

Kommt die Datei evtl. von einem Mac?


- id3v2 ignoriert die Akzente einfach: Heroes...



-> das deutet zumindest darauf hin, daß es daran liegen könnte...


Thomas

Ähnliche fragen