Sie möchten Ex Falso, den im Quod Libet-Projekt enthaltenen Tag-Editor. Picard (der MusicBrainz-Tagger) verwendet möglicherweise dieselbe Tagging-Bibliothek, aber QL hat sie entwickelt.
Insbesondere möchten Sie die Mutagen-Tagging-Bibliothek, die id3v2.4 unterstützt (und mit "unterstützen" meine ich "durchsetzen" ... militärisch ...). Es eignet sich auch hervorragend für Zeichencodierungen und enthält einen einfachen skriptfähigen Befehlszeilen-Tagger (mid3v2
). Soweit Ihr Normalisierungsschritt geht, Mutagen nur speichert Tags in ID3v2.4. Es ist sicherlich in der Lage, den gesamten Text in UTF-8 zu konvertieren, aber Sie müssen das möglicherweise selbst skripten (ich glaube, dass die mid3v2
Die Standardeinstellungen des Tools bestehen darin, die aktuelle Codierung nach Möglichkeit beizubehalten, und ich weiß nicht, ob es angewiesen werden kann, alles in einer bestimmten Codierung zu speichern). Mutagen ist in Python geschrieben.
Ex Falso ist eine schöne, saubere GUI und unterstützt die meisten wichtigen Retag-Multiple-Files-Funktionen, die Sie erwarten würden. Ich glaube nicht, dass es bei Internet-Suchen viel bringt, und ich weiß nicht, wie es mit Album-Artwork ist – Quod Libet könnte das unterstützen; Ex Falso kann tun Sie es mit einem Plugin, falls eines vorhanden ist, obwohl eines möglicherweise nicht vorhanden ist. Ich habe diese Funktionalität nie benötigt – ich verwende EF und mid3v2
zusammen, um meine Retagging-Anforderungen zu erfüllen.
Ich glaube nicht, dass Sie eine eigenständige Anwendung finden werden, die Ihre spezielle Auswahl an falsch gekennzeichneten Kodierungen korrigiert. Eine Mischung aus cp1252, UTF-16 und GB-18030 zu haben ist ziemlich ungewöhnlich und ich glaube nicht, dass existierende Software das automatisch lösen kann.
Also würde ich Mutagen herunterladen und ein benutzerdefiniertes Python-Skript schreiben, um Ihre eigenen Entscheidungen zum Korrigieren unbekannter Codierungen zu automatisieren. Zum Beispiel:
musicroot= ur'C:\music\wonky'
tryencodings= 'gb18030', 'cp1252'
import os
import mutagen.id3
def findMP3s(path):
for child in os.listdir(path):
child= os.path.join(path, child)
if os.path.isdir(child):
for mp3 in findMP3s(child):
yield mp3
elif child.lower().endswith(u'.mp3'):
yield child
for path in findMP3s(musicroot):
id3= mutagen.id3.ID3(path)
for key, value in id3.items():
if value.encoding!=3 and isinstance(getattr(value, 'text', [None])[0], unicode):
if value.encoding==0:
bytes= '\n'.join(value.text).encode('iso-8859-1')
for encoding in tryencodings:
try:
bytes.decode(encoding)
except UnicodeError:
pass
else:
break
else:
raise ValueError('None of the tryencodings work for %r key %r' % (path, key))
for i in range(len(value.text)):
value.text[i]= value.text[i].encode('iso-8859-1').decode(encoding)
value.encoding= 3
id3.save()
Das obige Skript geht von einigen Annahmen aus:
-
Nur die Tags, die als in Codierung 0 gekennzeichnet sind, sind falsch. (Anscheinend ist die Codierung 0 ISO-8859-1, aber in der Praxis ist es oft eine Windows-Standard-Codepage.)
-
Wenn ein Tag als UTF-8- oder UTF-16-kodiert gekennzeichnet ist, wird davon ausgegangen, dass es korrekt ist, und es wird einfach in UTF-8 konvertiert, falls dies noch nicht der Fall ist. Persönlich habe ich noch nie ID3s gesehen, die irrtümlicherweise als UTF (Codierungen 1-3) markiert wurden. Glücklicherweise lässt sich 0 leicht in seine ursprünglichen Bytes zurückverwandeln, da ISO-8859-1 eine direkte 1-zu-1-Zuordnung der ordinalen Bytewerte ist.
Wenn ein Codierungs-0-Tag erfüllt wird, versucht das Skript, es zuerst als GB18030 umzuwandeln, und wenn es nicht gültig ist, greift es auf Codepage 1252 zurück. Einzelbyte-Codierungen wie cp1252 passen tendenziell zu den meisten Byte-Sequenzen, daher ist es am besten, sie zu setzen am Ende der Liste der zu versuchenden Kodierungen.
Wenn Sie andere Codierungen wie cp1251 Cyrillic oder viele cp1252-Dateinamen mit mehreren Zeichen mit Akzent hintereinander haben, die mit GB18030 verwechselt werden, benötigen Sie einen clevereren Ratealgorithmus. Sehen Sie sich vielleicht den Dateinamen an, um zu erraten, welche Art von Zeichen wahrscheinlich vorhanden sind?