MP3ファイルのID3タグを一度に変更できるツールを作ってみた

昔にリッピングしたMP3ファイルには下のように iTunesで曲名が 01 AudioTrack 01.mp3 などと表示されています。これはiTunesの「情報を見る」ダイアログで変更できますが、いちいちGUIから変更していくのは大変です。そこで、ファイル名、曲名を書いたファイルから一括で変更できるツールを作ってみました。

f:id:yuum3:20140820170453p:plain

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)