GNU/Linux >> Znalost Linux >  >> Linux

Oprava kódování ID3 tagů

Chcete Ex Falso, editor tagů zahrnutý v projektu Quod Libet. Picard (tagger MusicBrainz) může používat stejnou knihovnu značek, ale její původcem je QL.

Konkrétně chcete knihovnu značek Mutagen, která podporuje id3v2.4 (a „podporou“ myslím „vynutit“ ...vojensky...). Je také vynikající s kódováním znaků a obsahuje základní skriptovatelný tagger příkazového řádku (mid3v2 ). Pokud jde o váš normalizační krok, pouze Mutagen ukládá značky do ID3v2.4. Určitě je schopen převést veškerý text do UTF-8, ale možná ho budete muset naskriptovat sami (domnívám se, že mid3v2 výchozí nastavení nástroje je zachovat aktuální kódování, kde je to možné, a nevím, zda lze říci, aby se vše ukládalo v konkrétním kódování). Mutagen je napsán v Pythonu.

Ex Falso je pěkné, čisté GUI a podporuje většinu hlavních funkcí retag-multiple-files, které byste očekávali. Nemyslím si, že to dělá moc ve způsobu vyhledávání na internetu a nevím, jak je to s obaly alb -- Quod Libet to možná podporuje; Ex Falso může udělejte to pomocí pluginu, pokud nějaký existuje, i když možná neexistuje. Nikdy jsem tuto funkci nepotřeboval - používám EF a mid3v2 ve shodě, abych vyřídil mé potřeby v oblasti změny značek.


Nemyslím si, že najdete samostatnou aplikaci, která opraví váš konkrétní výběr nesprávně označených kódování. Mít kombinaci cp1252, UTF-16 a GB-18030 je docela neobvyklé a nemyslím si, že stávající software to dokáže vyřešit automaticky.

Takže bych si stáhl Mutagen a napsal vlastní Python skript, abych zautomatizoval vaše vlastní rozhodování o tom, jak opravit neznámá kódování. Například:

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

Výše uvedený skript vytváří několik předpokladů:

  1. Chybné jsou pouze značky označené jako kódování 0. (Zdá se, že kódování 0 je ISO-8859-1, ale v praxi je to často výchozí kódová stránka Windows.)

  2. Pokud je značka označena jako v kódování UTF-8 nebo UTF-16, předpokládá se, že je správná, a jednoduše se převede na UTF-8, pokud ještě není. Osobně jsem ještě neviděl chybně ID3 označené jako UTF (kódování 1-3). Naštěstí kódování 0 lze snadno obnovit do původních bajtů, protože ISO-8859-1 je přímé mapování hodnot ordinálních bajtů 1:1.

Když je splněna značka kódování 0, skript se ji nejprve pokusí přetypovat na GB18030, a pokud není platný, vrátí se na kódovou stránku 1252. Jednobajtová kódování jako cp1252 bude mít tendenci odpovídat většině bajtových sekvencí, takže je nejlepší je umístit na konci seznamu kódování k vyzkoušení.

Pokud máte jiná kódování, jako je cp1251 azbuka, nebo mnoho názvů souborů cp1252 s více znaky s diakritikou za sebou, které se zaměňují za GB18030, budete potřebovat nějaký chytřejší odhadovací algoritmus. Možná se podívejte na název souboru, abyste uhádli, jaký typ znaků pravděpodobně bude přítomen?


Linux
  1. Použít Ts bez ztráty výstupní hodnoty?

  2. Seřadit podle hexadecimální hodnoty?

  3. Kódování souboru ZIP?

  1. Opravte bitovou kopii systému pomocí DISM

  2. Používejte značky cloudových serverů

  3. Maximální PID v Linuxu

  1. iconv libovolné kódování do UTF-8

  2. Výchozí časový limit mezipaměti arp

  3. Vrácená hodnota funkce časového limitu