GNU/Linux >> Linux Esercitazione >  >> Linux

Ripara la codifica dei tag ID3

Vuoi Ex Falso, l'editor di tag incluso nel progetto Quod Libet. Picard (il tagger di MusicBrainz) potrebbe utilizzare la stessa libreria di tagging, ma l'ha originata QL.

In particolare, vuoi la libreria di tagging Mutagen, che supporta id3v2.4 (e per "supporto" intendo "applicare" ... militarmente ...). È anche eccellente con le codifiche dei caratteri e include un tagger della riga di comando di base con script (mid3v2 ). Per quanto riguarda la tua fase di normalizzazione, Mutagen solo salva i tag in ID3v2.4. È certamente in grado di convertire tutto il testo in UTF-8, ma potrebbe essere necessario scriverlo da soli (credo che mid3v2 le impostazioni predefinite dello strumento sono di mantenere la codifica corrente ove possibile e non so se si può dire di salvare tutto in una particolare codifica). Mutagen è scritto in Python.

Ex Falso è una GUI piacevole e pulita e supporta la maggior parte delle principali funzionalità di retag-multiple-file che ti aspetteresti. Non penso che faccia molto in termini di ricerche su Internet e non so come sia con le copertine degli album - Quod Libet potrebbe supportarlo; Ex Falso può fallo con un plugin, se ne esiste uno, anche se potrebbe non esistere. Non ho mai avuto bisogno di questa funzionalità:utilizzo EF e mid3v2 in concerto per gestire le mie esigenze di retagging.


Non credo che troverai un'applicazione autonoma che risolverà la tua particolare selezione di codifiche con tag errati. Avere una combinazione di cp1252, UTF-16 e GB-18030 è piuttosto insolito e non credo che il software esistente sarà in grado di risolverlo automaticamente.

Quindi scaricherei Mutagen e scriverò uno script Python personalizzato per automatizzare le tue decisioni su come correggere le codifiche sconosciute. Ad 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 alcuni presupposti:

  1. Solo i tag contrassegnati come nella codifica 0 sono errati. (Apparentemente la codifica 0 è ISO-8859-1, ma in pratica è spesso una tabella codici predefinita di Windows.)

  2. Se un tag è contrassegnato come codificato in UTF-8 o UTF-16, si presume che sia corretto e viene semplicemente convertito in UTF-8 se non lo è già. Personalmente non ho mai visto ID3 contrassegnati come UTF (codifiche 1-3) per errore prima. Fortunatamente la codifica 0 è facile da recuperare nei suoi byte originali poiché ISO-8859-1 è una mappatura diretta 1 a 1 dei valori dei byte ordinali.

Quando viene soddisfatto un tag di codifica 0, lo script tenta prima di riformularlo come GB18030, quindi se non è valido torna alla code page 1252. Le codifiche a byte singolo come cp1252 tenderanno a corrispondere alla maggior parte delle sequenze di byte, quindi è meglio inserirle alla fine dell'elenco delle codifiche da provare.

Se hai altre codifiche come cp1251 cirillico o molti nomi di file cp1252 con più caratteri accentati di fila, che vengono scambiati per GB18030, avrai bisogno di un algoritmo di indovinazione più intelligente di qualche tipo. Forse dai un'occhiata al nome del file per indovinare che tipo di caratteri potrebbero essere presenti?


Linux
  1. Come creare tag Git

  2. Che cos'è un tag canonico?

  3. Il valore massimo dell'ID di processo?

  4. Valore percentuale con GNU Diff

  5. PID massimo in Linux

Come utilizzare i tag in Ansible Playbook (esempi)

Comando Fsck in Linux (ripara file system)

Ripara un'immagine di sistema con DISM

Arrotonda un numero diviso in Bash

Timeout predefinito della cache arp

Come viene calcolata la priorità del processo?