GNU/Linux >> Tutoriales Linux >  >> Linux

Reparación de codificación de etiquetas ID3

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:

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

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


Linux
  1. ¿Qué es una etiqueta canónica?

  2. ¿Usar Ts sin perder el valor de salida?

  3. ¿Ordenar por valor hexadecimal?

  4. ¿Codificación de un archivo zip?

  5. Usar etiquetas de servidores en la nube

Cómo usar etiquetas en Ansible Playbook (ejemplos)

Comando Fsck en Linux (Sistema de archivos de reparación)

¿El valor máximo de la identificación del proceso?

Reparar una imagen del sistema con DISM

Valor porcentual con GNU Diff

PID máximo en Linux