Non credo che troverai un'applicazione standalone che risolverà la tua particolare selezione di codifiche con tag errati. Avere una miscela di cp1252, UTF-16 e GB-18030 è abbastanza insolito e non credo che i software esistenti saranno in grado di risolverli automaticamente.
Quindi scaricare Mutagen e scrivere uno script Python personalizzato per automatizzare le proprie decisioni su come correggere codifiche sconosciute. Per esempio:
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()
Lo script sopra fa alcune ipotesi:
Solo i tag contrassegnati come presenti nella codifica 0 sono errati. (La codifica evidentemente 0 è ISO-8859-1, ma in pratica è spesso una tabella codici predefinita di Windows.)
Se un tag è contrassegnato come codificato in UTF-8 o UTF-16, si presume che sia corretto e semplicemente convertito in UTF-8 se non lo è già. Personalmente non ho mai visto prima ID3 contrassegnati come UTF (codifiche 1-3). Fortunatamente la codifica 0 è facile da recuperare nei suoi byte originali poiché ISO-8859-1 è una mappatura diretta da 1 a 1 dei valori dei byte ordinali.
Quando viene soddisfatto un tag di codifica 0, lo script tenta di ripeterlo prima come GB18030, quindi se non è valido ricade nella tabella codici 1252. Le codifiche a byte singolo come cp1252 tenderanno a corrispondere alla maggior parte delle sequenze di byte, quindi è meglio metterle alla fine dell'elenco di codifiche da provare.
Se hai altre codifiche come cp1251 Cyrillic o molti nomi di file cp1252 con più caratteri accentati in una riga, che vengono scambiati per GB18030, avrai bisogno di un algoritmo di indovinare più intelligente di qualche tipo. Forse guarda il nome del file per indovinare quale tipo di caratteri è probabile che siano presenti?
mid3v2
è solo metà della soluzione. Dopo averlo provato, sicuramente non va bene con le codifiche erroneamente identificate di cui soffro, ovvero un tag ID3 aggiornato viene ancora visualizzato in modo errato in Amarok. Mutagen non soddisfa le mie esigenze di "intelligente di capire la codifica originale"; assume allegramenteLatin1
/Windows-1252
, che è conforme standard, ma inutile per il mondo reale disordinato. Sono propenso a non accettare questa risposta in questo momento; Darò qualche giorno in più di opportunità per altre risposte. Se non arriva nulla di buono, vieni accettato.