GNU/Linux >> Belajar Linux >  >> Linux

Perbaiki penyandian tag ID3

Anda ingin Ex Falso, editor tag yang termasuk dalam proyek Quod Libet. Picard (pemberi tag MusicBrainz) dapat menggunakan pustaka pemberian tag yang sama, tetapi QL yang membuatnya.

Secara khusus, Anda menginginkan perpustakaan penandaan Mutagen, yang mendukung id3v2.4 (dan dengan "mendukung" maksud saya "menegakkan" ... secara militer ...). Ini juga sangat baik dengan pengkodean karakter, dan menyertakan pemberi tag baris perintah dasar yang dapat ditulisi (mid3v2 ). Sejauh langkah normalisasi Anda, Mutagen hanya menyimpan tag di ID3v2.4. Itu pasti mampu mengubah semua teks menjadi UTF-8, tetapi Anda mungkin perlu membuat skrip itu sendiri (saya percaya bahwa mid3v2 default alat adalah untuk menjaga penyandian saat ini jika memungkinkan, dan saya tidak tahu apakah dapat diberitahu untuk menyimpan semuanya dalam penyandian tertentu). Mutagen ditulis dengan Python.

Ex Falso adalah GUI yang bagus dan bersih, dan mendukung sebagian besar fitur retag-multiple-file utama yang Anda harapkan. Menurut saya itu tidak terlalu mengganggu pencarian internet dan saya tidak tahu bagaimana dengan sampul album - Quod Libet mungkin mendukungnya; Ex F juga bisa lakukan dengan plugin, jika ada, meskipun mungkin tidak ada. Saya tidak pernah membutuhkan fungsionalitas itu -- saya menggunakan EF dan mid3v2 bersama-sama untuk menangani kebutuhan pemberian tag ulang saya.


Saya rasa Anda tidak akan menemukan aplikasi mandiri yang akan memperbaiki pilihan pengkodean yang salah diberi tag. Memiliki campuran cp1252, UTF-16, dan GB-18030 sangat tidak biasa dan menurut saya perangkat lunak yang ada tidak akan dapat menyelesaikannya secara otomatis.

Jadi saya akan mengunduh Mutagen dan menulis skrip Python khusus untuk mengotomatiskan keputusan Anda sendiri tentang cara memperbaiki penyandian yang tidak diketahui. Misalnya:

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

Skrip di atas membuat beberapa asumsi:

  1. Hanya tag yang ditandai dalam penyandian 0 yang salah. (Seolah-olah menyandikan 0 adalah ISO-8859-1, tetapi dalam praktiknya ini sering kali merupakan halaman kode default Windows.)

  2. Jika sebuah tag ditandai sebagai dalam pengkodean UTF-8 atau UTF-16, itu dianggap benar, dan cukup dikonversi ke UTF-8 jika belum. Secara pribadi saya belum pernah melihat ID3 yang ditandai sebagai UTF (pengkodean 1-3) dalam kesalahan sebelumnya. Untungnya pengkodean 0 mudah dipulihkan ke byte aslinya karena ISO-8859-1 adalah pemetaan langsung 1-ke-1 dari nilai byte ordinal.

Ketika tag pengkodean 0 terpenuhi, skrip mencoba untuk menyusunnya kembali sebagai GB18030 terlebih dahulu, kemudian jika tidak valid kembali ke halaman kode 1252. Pengkodean byte tunggal seperti cp1252 akan cenderung cocok dengan sebagian besar urutan byte, jadi sebaiknya letakkan mereka di akhir daftar penyandian untuk dicoba.

Jika Anda memiliki pengkodean lain seperti cp1251 Cyrillic, atau banyak nama file cp1252 dengan beberapa karakter beraksen berturut-turut, yang disalahartikan sebagai GB18030, Anda memerlukan semacam algoritme tebakan yang lebih cerdas. Mungkin lihat nama file untuk menebak karakter seperti apa yang mungkin ada?


Linux
  1. Apa itu tag Canonical?

  2. Gunakan Ts Tanpa Kehilangan Nilai Keluar?

  3. Urutkan Berdasarkan Nilai Hex?

  1. Encoding File Zip?

  2. Perbaiki citra sistem dengan DISM

  3. Nilai persentase dengan GNU Diff

  1. iconv penyandian apa pun ke UTF-8

  2. Mengembalikan nilai x =os.system(..)

  3. Batas waktu cache arp default