GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kodierung von ID3-Tags reparieren

Sie möchten Ex Falso, den im Quod Libet-Projekt enthaltenen Tag-Editor. Picard (der MusicBrainz-Tagger) verwendet möglicherweise dieselbe Tagging-Bibliothek, aber QL hat sie entwickelt.

Insbesondere möchten Sie die Mutagen-Tagging-Bibliothek, die id3v2.4 unterstützt (und mit "unterstützen" meine ich "durchsetzen" ... militärisch ...). Es eignet sich auch hervorragend für Zeichencodierungen und enthält einen einfachen skriptfähigen Befehlszeilen-Tagger (mid3v2 ). Soweit Ihr Normalisierungsschritt geht, Mutagen nur speichert Tags in ID3v2.4. Es ist sicherlich in der Lage, den gesamten Text in UTF-8 zu konvertieren, aber Sie müssen das möglicherweise selbst skripten (ich glaube, dass die mid3v2 Die Standardeinstellungen des Tools bestehen darin, die aktuelle Codierung nach Möglichkeit beizubehalten, und ich weiß nicht, ob es angewiesen werden kann, alles in einer bestimmten Codierung zu speichern). Mutagen ist in Python geschrieben.

Ex Falso ist eine schöne, saubere GUI und unterstützt die meisten wichtigen Retag-Multiple-Files-Funktionen, die Sie erwarten würden. Ich glaube nicht, dass es bei Internet-Suchen viel bringt, und ich weiß nicht, wie es mit Album-Artwork ist – Quod Libet könnte das unterstützen; Ex Falso kann tun Sie es mit einem Plugin, falls eines vorhanden ist, obwohl eines möglicherweise nicht vorhanden ist. Ich habe diese Funktionalität nie benötigt – ich verwende EF und mid3v2 zusammen, um meine Retagging-Anforderungen zu erfüllen.


Ich glaube nicht, dass Sie eine eigenständige Anwendung finden werden, die Ihre spezielle Auswahl an falsch gekennzeichneten Kodierungen korrigiert. Eine Mischung aus cp1252, UTF-16 und GB-18030 zu haben ist ziemlich ungewöhnlich und ich glaube nicht, dass existierende Software das automatisch lösen kann.

Also würde ich Mutagen herunterladen und ein benutzerdefiniertes Python-Skript schreiben, um Ihre eigenen Entscheidungen zum Korrigieren unbekannter Codierungen zu automatisieren. Zum Beispiel:

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()

Das obige Skript geht von einigen Annahmen aus:

  1. Nur die Tags, die als in Codierung 0 gekennzeichnet sind, sind falsch. (Anscheinend ist die Codierung 0 ISO-8859-1, aber in der Praxis ist es oft eine Windows-Standard-Codepage.)

  2. Wenn ein Tag als UTF-8- oder UTF-16-kodiert gekennzeichnet ist, wird davon ausgegangen, dass es korrekt ist, und es wird einfach in UTF-8 konvertiert, falls dies noch nicht der Fall ist. Persönlich habe ich noch nie ID3s gesehen, die irrtümlicherweise als UTF (Codierungen 1-3) markiert wurden. Glücklicherweise lässt sich 0 leicht in seine ursprünglichen Bytes zurückverwandeln, da ISO-8859-1 eine direkte 1-zu-1-Zuordnung der ordinalen Bytewerte ist.

Wenn ein Codierungs-0-Tag erfüllt wird, versucht das Skript, es zuerst als GB18030 umzuwandeln, und wenn es nicht gültig ist, greift es auf Codepage 1252 zurück. Einzelbyte-Codierungen wie cp1252 passen tendenziell zu den meisten Byte-Sequenzen, daher ist es am besten, sie zu setzen am Ende der Liste der zu versuchenden Kodierungen.

Wenn Sie andere Codierungen wie cp1251 Cyrillic oder viele cp1252-Dateinamen mit mehreren Zeichen mit Akzent hintereinander haben, die mit GB18030 verwechselt werden, benötigen Sie einen clevereren Ratealgorithmus. Sehen Sie sich vielleicht den Dateinamen an, um zu erraten, welche Art von Zeichen wahrscheinlich vorhanden sind?


Linux
  1. So erstellen Sie Git-Tags

  2. Verwenden Sie Ts, ohne den Exit-Wert zu verlieren?

  3. Nach Hex-Wert sortieren?

  4. Verwenden Sie Cloud Servers-Tags

  5. Runden Sie eine geteilte Zahl in Bash

Verwendung von Tags in Ansible Playbook (Beispiele)

Fsck-Befehl unter Linux (Dateisystem reparieren)

iconv jede Kodierung nach UTF-8

Rückgabewert von x =os.system(..)

Rückgabewert der Timeout-Funktion

Wie wird die Prozesspriorität berechnet?