No creo que vaya a encontrar una aplicación independiente que arregle su selección particular de codificaciones etiquetadas incorrectamente. Tener una mezcla 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 Python personalizado para automatizar sus propias decisiones sobre cómo solucionar 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 como codificadas 0 son incorrectas. (La codificación aparentemente 0 es ISO-8859-1, pero en la práctica a menudo es una página de códigos predeterminada de Windows).
Si una etiqueta está marcada como en UTF-8 o una codificación 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 (codificaciones 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 una asignación directa 1 a 1 de los valores de bytes ordinales.
Cuando se cumple una etiqueta de codificación 0, el script intenta relanzarla primero como GB18030, 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 cirílico, o muchos nombres de archivos cp1252 con múltiples caracteres acentuados en una fila, que se confunden con GB18030, necesitará un algoritmo de adivinación más inteligente de algún tipo. ¿Quizás mire el nombre del archivo para adivinar qué tipo de caracteres es probable que estén presentes?
mid3v2
Es solo la mitad de la solución. Después de probarlo, definitivamente no es bueno con las codificaciones mal identificadas que estoy sufriendo, es decir, una etiqueta ID3 actualizada todavía se muestra mal en Amarok. Mutagen no cumple mi requisito acerca de »inteligente sobre descifrar la codificación original«; asume alegrementeLatin1
/Windows-1252
, que es conforme estándar, pero inútil para el mundo real desordenado. Me inclino a no aceptar esta respuesta en este momento; Daré unos días más de oportunidad para otras respuestas. Si no viene nada bueno, te aceptan.