Quiere Ex Falso, el editor de etiquetas incluido en el proyecto Quod Libet. Picard (el etiquetador de MusicBrainz) puede usar la misma biblioteca de etiquetado, pero QL la originó.
En particular, desea la biblioteca de etiquetado Mutagen, que admite id3v2.4 (y por "soportar" me refiero a "hacer cumplir"... militarmente...). También es excelente con la codificación de caracteres e incluye un etiquetador de línea de comandos programable básico (mid3v2
). En lo que respecta a su paso de normalización, Mutagen solo guarda etiquetas en ID3v2.4. Sin duda, es capaz de convertir todo el texto a UTF-8, pero es posible que deba crear una secuencia de comandos usted mismo (creo que el mid3v2
Los valores predeterminados de la herramienta son mantener la codificación actual siempre que sea posible, y no sé si se le puede decir que guarde todo en una codificación particular). Mutagen está escrito en Python.
Ex Falso es una interfaz gráfica de usuario agradable y limpia, y es compatible con la mayoría de las funciones principales de reetiquetado de archivos múltiples que esperaría. No creo que haga mucho en cuanto a las búsquedas en Internet y no sé cómo es con las carátulas de los álbumes:Quod Libet puede respaldar eso; Ex Falso puede hágalo con un complemento, en caso de que exista, aunque es posible que no exista. Nunca he necesitado esa funcionalidad, uso EF y mid3v2
en conjunto para manejar mis necesidades de reetiquetado.
No creo que vaya a encontrar una aplicación independiente que arregle su selección particular de codificaciones etiquetadas incorrectamente. Tener una combinación de cp1252, UTF-16 y GB-18030 es bastante inusual y no creo que el software existente pueda resolverlo automáticamente.
Así que descargaría Mutagen y escribiría un script de Python personalizado para automatizar sus propias decisiones sobre cómo corregir codificaciones desconocidas. Por ejemplo:
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()
El script anterior hace algunas suposiciones:
-
Solo las etiquetas marcadas con la codificación 0 son incorrectas. (Aparentemente, la codificación 0 es ISO-8859-1, pero en la práctica suele ser una página de códigos predeterminada de Windows).
-
Si una etiqueta está marcada como codificada en UTF-8 o UTF-16, se supone que es correcta y simplemente se convierte a UTF-8 si aún no lo está. Personalmente, no he visto ID3 marcados como UTF (codificación 1-3) por error antes. Afortunadamente, la codificación 0 es fácil de recuperar en sus bytes originales, ya que ISO-8859-1 es un mapeo directo 1 a 1 de los valores de bytes ordinales.
Cuando se cumple una etiqueta de codificación 0, la secuencia de comandos intenta reformularla como GB18030 primero, luego, si no es válida, vuelve a la página de códigos 1252. Las codificaciones de un solo byte como cp1252 tenderán a coincidir con la mayoría de las secuencias de bytes, por lo que es mejor ponerlas al final de la lista de codificaciones para probar.
Si tiene otras codificaciones como cp1251 Cyrillic, o muchos nombres de archivo cp1252 con múltiples caracteres acentuados seguidos, que se confunden con GB18030, necesitará algún tipo de algoritmo de adivinanza más inteligente. ¿Tal vez mire el nombre del archivo para adivinar qué tipo de caracteres es probable que estén presentes?