MP3ファイルのID3タグを一度に変更できるツールを作ってみた
昔にリッピングしたMP3ファイルには下のように iTunesで曲名が 01 AudioTrack 01.mp3 などと表示されています。これはiTunesの「情報を見る」ダイアログで変更できますが、いちいちGUIから変更していくのは大変です。そこで、ファイル名、曲名を書いたファイルから一括で変更できるツールを作ってみました。
iTunes, MP3 などに付いて・・・
iTunesは曲名等の情報は iTunes Library.itl (それを書き出した可読性のある iTunes Music Library.xml)というファイルで管理しています、このファイルを変更するとiTunesに表示される曲名を変更できます(この話しは次回にでも書きます)。
しかし、そこで曲を再生すると、なんと元の 01 AudioTrack 01.mp3 に戻ってしまいます!
実は wikipediaのID3タグ項目 にあるようにMP3,4(.mp3, .m4a)ファイルには アーティスト・作成年・曲名等の情報を書かられていて、iTunesは再生する時に、この情報から曲名を戻して(変更して)しまいます。
ID3タグを編集するツールは有料、オープンソースを含めたくさんあります。中には Amazonを検索し曲名等を一括で設定すてくれそうなツールがあったのですが、なぜか上手く行きませんでした。また、ID3タグのバージョンやエンコード(文字化け)の問題がありMacで動作するオープンソースのツールは良い物が見つけられませんでした。
TagLib, taglib-ruby
ID3タグを扱うライブラリーとしては、C++で書かれた TagLibが良いようで、Rubyから使える taglib-ruby があったので Rubyでツールを書く事にしました。
ちなみに、id3lib というライブラリーもあります。こちらはHome brewでコマンドラインツールもインストール出来るのですが、最近はメンテされてないようで曲名に日本語を入れる事が出来ないので断念しました。
ツール
下のコードのように taglib-rubyを使う事で、MP3ファイルを読み込み、タイトル (曲名)を設定し保存するツールが簡単にできました。MP3ファイルのパス名、曲名をタブ区切りで書いたファイルを用意する事で複数のMP3ファイルを一度に変更できます。
#!/usr/bin/env ruby require 'taglib' MP_FILE_CLASSES = {'.mp3' => TagLib::MPEG::File, '.m4a' => TagLib::MP4::File} def set_mp_audio_file_to_title(path, title) MP_FILE_CLASSES[File.extname(path)].open(path) {|mp| mp.tag.title = title; mp.save} puts " set #{path} title=#{title}" rescue puts " error: #{$!}" exit(-1) end if ARGV.count < 2 puts "Usage: #{$0} MPEG_AUDIO_FILE TITLE or" puts " #{$0} -f FILE_AND_TITLE_LIST" elsif ARGV[0] == '-f' IO.readlines(ARGV[1]).each do |line| path_title = line.split("\t") set_mp_audio_file_to_title(*path_title) if path_title.length == 2 end else set_mp_audio_file_to_title(ARGV[0], ARGV[1]) end exit(0)