年末のmkaからaacへの一括変換

Windowsがメインだった頃から、ずっと音楽ファイルはmp3 or flacとcuesheetを混ぜたmkaで管理してました。
10年分ぐらいファイル損失無く蓄積できてるので、分量が半端ないことになっていて、ずっとそのままだったんですが、MacがメインになってiPhoneも使ってるので、iTunesでも音楽ファイルちゃんと読めるようにしておかないと、色々面倒な状態でした。
というわけで、年末休みの2日ぐらいを使って、大掃除というか大変換祭りをやってました。


ストレージ容量は昔よりも豊富になったので、mkaはmkaで残しつつ、新しくm4a(aac)に変換したものを別ディレクトリに一括作成することにしました。


まずは、mkaからflacとcuesheetの抽出。

input_dir = ARGV[0]

Dir.chdir(input_dir)

mka_files = Dir.glob("*.mka")

mka_files.each do |filename|
  basename = File.basename(filename, ".*")
  unless File.exist?(basename)
    Dir.mkdir(basename)
    system("mkvextract", "tracks", filename, "--cuesheet", "1:#{basename}/#{basename}.flac")
    system("mkvextract", "attachments", filename, "1:#{basename}/cover.jpg")
    system("gsed", "-i", "-e", "s/FILE \"\"/FILE \"#{basename.force_encoding("UTF-8-MAC").encode("UTF-8").gsub(/&/, "\\\\&")}.flac\"/g", "#{basename}/#{basename}.cue")
    cuesheet = File.open("#{basename}/#{basename}.cue")
    genre = cuesheet.grep(/REM GENRE/).first
    if genre
      system("gsed", "-i", "-e", "/REM GENRE/d", "#{basename}/#{basename}.cue")
      system("gsed", "-i", "-e", "2i #{genre.strip}", "#{basename}/#{basename}.cue")
    end

    cuesheet.rewind
    date = cuesheet.grep(/REM DATE/).first
    if date
      system("gsed", "-i", "-e", "/REM DATE/d", "#{basename}/#{basename}.cue")
      system("gsed", "-i", "-e", "2i #{date.strip}", "#{basename}/#{basename}.cue")
    end

    cuesheet.close
  end
end


mkvtoolnixのmkvextractコマンドで、trackと添付ファイルを吸い出す。
出力したcuesheetをsedで置換して、ある程度整形。
GENREとDATEをディスク単位にしておかないと、この後使うXLDでタグが読めなかったので、その辺りもsedで調整。
ちなみに上のコードはMacで実行したのでgsedになってる。


後は出力したflacに対してXLDで一括変換をかけるだけ。
なんだかんだで、Mac側からflac+cueを変換するなら、XLDが一番便利だった。
AACへの変換はGUIでしか使えないのが、ちょっと難点なんだが。


X Lossless Decoder: Lossless audio decoder for Mac OS X
http://tmkk.undo.jp/xld/index.html


これで、溜まりに溜まっていたmkaもiTunes側で再生したりiPhoneに即転送できるようになった。