~20 GB の音楽ファイル (ほとんどが mp3、一部は ogg) を含む 2 つのディレクトリがあり、すべての重複した曲を検出したいと考えています。2 つの複雑な要因があります。
- 曲は、2 つのディレクトリで異なるファイル名を持つ場合があります。
- 同じ曲を含む 2 つのファイルの ID3 タグが異なる場合があるため、チェックサムも異なります。
これを解決するための良いアプローチは何ですか?
~20 GB の音楽ファイル (ほとんどが mp3、一部は ogg) を含む 2 つのディレクトリがあり、すべての重複した曲を検出したいと考えています。2 つの複雑な要因があります。
これを解決するための良いアプローチは何ですか?
私がこれまで行ってきた方法は、Music IP から取得した genpuid を使用することです。クローズド ソース ソフトウェアは、形式、id3、チェックサムなどに関係なく、ファイルのオーディオ フィンガープリントを作成します。
詳細については、こちらをご覧ください。
これにより、最も多くの正の重複一致が保証され、誤検知が最小限に抑えられます。また、正しくない id3 タグを正しくタグ付けすることもできます。
これが私がやろうとしていることです(または以前にやったことがあります)...
...出来上がり!(または、digg を読んだ場合: 「...利益!」)
/mp
ID3/OGG 相当のアーティストと曲のメタタグは正確ですか? もしそうなら、あなたはそれらを使うことができます。
編集:そうでない場合は、おそらくそうすることができます...アルバム全体のみを扱っている場合、トラックの数と長さに基づいてすべてのタグデータを取得するツールがいくつかあります.
アルバムと単一ファイルのミックスを扱っている場合は、さらに複雑になります。
ファイルを解析できるライブラリがある場合は、オーディオ データに対してハッシュを実行できます。曲が別のリップであるか、再圧縮/トランスコード/その他されている場合、これは役に立ちません。
もっと洗練された解決策があると確信していますが、音声データが同等であれば、ID3 タグを取り除いてハッシュすることでうまくいくはずです。ハッシュ後、必要に応じて ID3 タグを元に戻すことができます。
おそらく、Last.fm APIが役立つでしょう。これには、トラックの長さ、アーティスト名、トラック番号などを含む XML を返す track.getInfo 呼び出しが含まれます。トラックを比較して、N 個以上のフィールドが等しいかどうかを確認し、等しい場合は同じトラックであると想定できます。
ただし、40 GB の音楽の API リクエストを送信しても問題ないかどうかはわかりません。
このようなものはどうですか: mp3 の長さとオーディオ データへのポインターを取得するライブラリを見つけ (これを実行できるライブラリがいくつかあるようです)、曲の長さに基づいて最初のパス フィルターを実行します。長さが一致する曲については、オーディオ データのチェックサムをチェックします。重複ファイル/画像を見つけるためのこのスクリプトに似ています。