Vous voulez Ex Falso, l'éditeur de tags inclus dans le projet Quod Libet. Picard (le tagueur MusicBrainz) utilise peut-être la même bibliothèque de tags, mais QL en est à l'origine.
En particulier, vous voulez la bibliothèque de marquage Mutagen, qui prend en charge id3v2.4 (et par "soutenir", je veux dire "appliquer" ... militairement ...). Il est également excellent avec les encodages de caractères et inclut un tagueur de ligne de commande scriptable de base (mid3v2
). En ce qui concerne votre étape de normalisation, Mutagen uniquement enregistre les balises dans ID3v2.4. Il est certainement capable de convertir tout le texte en UTF-8, mais vous devrez peut-être le scripter vous-même (je crois que le mid3v2
les valeurs par défaut de l'outil sont de conserver l'encodage actuel dans la mesure du possible, et je ne sais pas s'il peut être dit de tout enregistrer dans un encodage particulier). Mutagen est écrit en Python.
Ex Falso est une interface graphique agréable et propre, et prend en charge la plupart des principales fonctionnalités de retag-multiple-files que vous attendez. Je ne pense pas que cela fasse beaucoup de recherches sur Internet et je ne sais pas comment c'est avec les pochettes d'albums - Quod Libet peut soutenir cela; Ex Falso peut faites-le avec un plugin, s'il en existe un, même s'il n'en existe peut-être pas. Je n'ai jamais eu besoin de cette fonctionnalité -- j'utilise EF et mid3v2
de concert pour gérer mes besoins de rebalisage.
Je ne pense pas que vous trouverez une application autonome qui corrigera votre sélection particulière d'encodages mal étiquetés. Avoir un mélange de cp1252, UTF-16 et GB-18030 est assez inhabituel et je ne pense pas que les logiciels existants pourront résoudre cela automatiquement.
Je téléchargerais donc Mutagen et j'écrirais un script Python personnalisé pour automatiser vos propres décisions sur la façon de corriger les encodages inconnus. Par exemple :
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()
Le script ci-dessus fait quelques suppositions :
-
Seules les balises marquées comme étant en encodage 0 sont fausses. (Apparemment, le codage 0 est ISO-8859-1, mais en pratique, il s'agit souvent d'une page de code par défaut de Windows.)
-
Si une balise est marquée comme étant au format UTF-8 ou UTF-16, elle est supposée être correcte et simplement convertie en UTF-8 si ce n'est déjà fait. Personnellement, je n'ai jamais vu d'ID3 marqués comme UTF (encodages 1-3) par erreur auparavant. Heureusement, l'encodage 0 est facile à récupérer dans ses octets d'origine puisque ISO-8859-1 est un mappage direct 1 à 1 des valeurs d'octets ordinales.
Lorsqu'une balise d'encodage 0 est rencontrée, le script tente d'abord de la refondre en GB18030, puis si elle n'est pas valide, elle revient à la page de codes 1252. Les encodages à un octet comme cp1252 auront tendance à correspondre à la plupart des séquences d'octets, il est donc préférable de les mettre à la fin de la liste des encodages à essayer.
Si vous avez d'autres encodages comme cp1251 cyrillique, ou beaucoup de noms de fichiers cp1252 avec plusieurs caractères accentués à la suite, qui sont confondus avec GB18030, vous aurez besoin d'un algorithme de devinette plus intelligent. Regardez peut-être le nom du fichier pour deviner quel type de caractères sont susceptibles d'être présents ?