web-dev-qa-db-ja.com

ID3タグのエンコーディングを修復する

私は約2000のMP3ファイルを継承しています。それらの大多数にとって、それらの ID3タグは文字化けして表示されます Amarokで。 ID3タグをv2.4タイプにアップグレードするソフトウェアが必要です$03(つまり、UTF-8エンコーディング)、v1タグをすべて削除し、ケースバイケースで元のエンコーディングを把握することも賢明です(ほとんどの場合、Windows-1252、BOMレスUTF-16、またはGB18030のいずれか)。 )。

TagLibの上でこれを自分でプログラミングし始める前に、私が使用できるそのような完全なソリューションはすでにありますか?

Musicbrainzはお勧めしません。米国で公開されている音楽に大きく偏っており、私にはほとんど役に立たないのです。私の要件に対して最初にテストせずに、一般的なID3タグ付けソフトウェアを推奨しないでください-それらのほとんど

  • v2.4をサポートしていません
  • 率直に言って、文字エンコードについての静かな遅れた考えを持っている
  • 自動化機能はありません(手動で編集することに時間を費やしたくありません)。

また、タグクリーニング、一括名前変更、または分類ソフトウェアのみには(まだ)興味がありません。私は最初に前述の正規化ステップを実行しました。

12
daxim

Quod Libet プロジェクトに含まれているタグエディタであるExFalsoが必要です。 Picard(MusicBrainzタガー)は同じタグ付けライブラリを使用できますが、QLがそれを作成しました。

特に、id3v2.4をサポートする Mutagenタグ付けライブラリ が必要です(「サポート」とは、「強制」を意味します...軍事的に...)。また、文字エンコードにも優れており、基本的なスクリプト可能なコマンドラインタガー(mid3v2)が含まれています。正規化の手順に関する限り、MutagenonlyはタグをID3v2.4に保存します。確かにすべてのテキストをUTF-8に変換することはできますが、自分でスクリプトを作成する必要があるかもしれません(mid3v2ツールのデフォルトは可能な限り現在のエンコーディングを維持することだと思いますが、それかどうかはわかりませんすべてを特定のエンコーディングで保存するように指示できます)。変異原はPythonで書かれています。

Ex FalsoはすてきでクリーンなGUIであり、期待される主要なretag-multiple-files機能のほとんどをサポートします。私はそれがインターネット検索の方法であまり効果がないと思います、そして私はそれがアルバムアートワークでどうであるかわかりません-QuodLibetはそれをサポートするかもしれません。 Ex Falso canプラグインが存在する場合は、存在しない可能性がありますが、プラグインを使用して実行します。その機能は必要ありませんでした。EFとmid3v2を組み合わせて使用​​して、タグの付け直しのニーズを処理しています。

Ex Falso, part of the Quod Libet project

9
quack quixote

誤ってタグ付けされたエンコーディングの特定の選択を修正するスタンドアロンアプリケーションを見つけるつもりはないと思います。 cp1252、UTF-16、GB-18030が混在していることは非常に珍しいことであり、既存のソフトウェアでそれを自動的に解決できるとは思いません。

だから私は Mutagenをダウンロード そしてカスタムPythonスクリプトを書いて、未知のエンコーディングを修正する方法についてのあなた自身の決定を自動化するでしょう。例:

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

上記のスクリプトは、いくつかの仮定を行っています。

  1. エンコーディング0であるとマークされたタグのみが間違っています。 (表面上は0をエンコードするのはISO-8859-1ですが、実際にはWindowsのデフォルトのコードページであることがよくあります。)

  2. タグがUTF-8またはUTF-16エンコーディングであるとマークされている場合、それは正しいと見なされ、まだそうでない場合は単にUTF-8に変換されます。個人的には、UTF(エンコード1〜3)としてマークされたID3が誤って表示されたことはありません。幸い、ISO-8859-1は序数のバイト値を1対1で直接マッピングしているため、0をエンコードすると元のバイトに簡単に復元できます。

エンコーディング0タグが満たされると、スクリプトは最初にそれをGB18030として再キャストしようとします。次に、それが有効でない場合は、コードページ1252にフォールバックします。cp1252のようなシングルバイトエンコーディングは、ほとんどのバイトシーケンスに一致する傾向があるため、それらを配置することをお勧めします。試行するエンコーディングのリストの最後にあります。

Cp1251キリル文字のような他のエンコーディング、またはGB18030と間違われる、複数のアクセント付き文字が連続したcp1252ファイル名が多数ある場合は、ある種の巧妙な推測アルゴリズムが必要になります。たぶん、ファイル名を見て、どのような種類の文字が存在する可能性が高いかを推測しますか?

9
bobince

Mp3Tag with Wine はどうですか?

機能(とりわけ):

バッチタグ編集ID3v1.1、ID3v2.3、ID3v2.4、MP4、WMA、APEv2タグ、Vorbisコメントを一度に複数のファイルに書き込みます。

Amazon、discogs、freedb、MusicBrainzからインポート入力を保存し、Amazon、discogs、freedb、MusicBrainzなどのオンラインデータベースからタグをインポートします。

文字または単語を置き換えるタグおよびファイル名の文字列を置き換えます(正規表現のサポートあり)。

Unicodeの完全サポートユーザーインターフェイスとタグ付けは、Unicodeに完全に準拠しています。

0
cschol