GNU/Linux >> Tutoriels Linux >  >> Linux

Réparer l'encodage des balises ID3

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 :

  1. 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.)

  2. 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 ?


Linux
  1. Comment créer des balises Git

  2. La valeur maximale de l'ID de processus ?

  3. Utiliser Ts sans perdre la valeur de sortie ?

  4. Trier par valeur hexadécimale ?

  5. Encodage d'un fichier Zip ?

Comment utiliser les balises dans Ansible Playbook (exemples)

Commande Fsck sous Linux (réparer le système de fichiers)

Valeur en pourcentage avec GNU Diff

PID maximal sous Linux

iconv tout encodage en UTF-8

Délai d'expiration du cache arp par défaut