umjammer です、 お久しぶりです、すっかり寒い季節になってしまっています。 私は音楽を聞くのが趣味の一つです。iPod と iTunes を使っています。自分の持っているすべての音楽を一元管理できるってのは世界観が変わるよと言われてやってみました。たしかに世界観は変わったのですが、デジタル潔癖症 [1] を罹患している私は思わぬところでハマってしまいました。楽曲の情報をすべて埋めてやらないと気が済まないんです。 楽曲のタイトルとアルバムはたいてい iTunes が勝手にデータベースから取ってきてくれるので問題ありません。まずハマったのはすべてのアルバムのジャケットをそろえることです。600x600 pixel のジャケットを揃えるのにものすごい労力を費やしたものです。
ジャケ写取得参考ソフト iGCover なければアマゾンのユーザーがアップロードしたジャケ写 それでもなければ discogs.com
iTunes Artworks


ジャケットをすべて揃えたあとリストを眺めてると、入ってるのと入ってないものがある項目として作曲者が目についてしまいました。うまっていない項目をうめないとデジタル潔癖症の私の心は癒えません。 ググッてみたのですがジャケットみたいにフリーなソフトは見つかりません。 自作するしかありません。 アーティスト、曲名から作曲者を検索するプログラム さて作曲者情報はどこから取ってきましょうか? 実はいいデータベースがあるんですよ。それも国内に。そう JASRAC楽曲データベースです。ネットでは何かと言われています JASRAC ですが、さすが音楽の世界を牛耳っているだけあって持っているデータベースはメジャーどころでは洋邦問わずほとんど網羅されています。そしてそのデータベースはネットで公開されています。
http://www2.jasrac.or.jp/eJwid/
技術者としては文句をいう暇があるのならその代わりにとことん利用させていただきます。 普通の Web Form インターフェースで API などなさそうなのでスクレイピングすることにします。iTunes から作曲者情報の無い楽曲のアーティストとタイトルを取ってきてそれを引数にしてJASRAC データベースを検索します。 JASRAC のページは最初のページのボタンを押さないとフォーム検索してくれないので Web コントロールを行うソフトとして htmlunit を使います。 iTunes データベースは XML ファイルとして存在するので XPath で読み込もうとしたのですが、容量がでかいため(2万曲近くあるので) JDK 付属の DOM で扱うとメモリが溢れてしまうので Saxon を使います。 流れは以下のようになります。
iTunes Music Library.xml -> xpath (artist, title) -> htmlunit -> JASRAC DB -> xpath (composer) -> TSV file
JASRAC のデータベース内の人名は変な規則で正規化されてるので普通に読みやすくしてやる必要があります。あと alias も同時に登録されているのでダブリを除かないといけないのですが面倒なのでそのままです。 今までの流れを記述した実際のコードは以下になります。
iTunes.java


実行結果の TSV は以下の様になります。
JASRAC Database Scraping
見つかった場合は先頭が RESULT、見つからなかった場合は NONE、もしかしての候補がある場合は MAYBE になっています。 さすがに JASRAC データベースも 100% 網羅しているわけではないので、見つからなかった場合は、
discogs.com allmusic.com
等のサイトを利用してください。 allmusic.com はとても面倒なのでスクレイピングしたいところですが力尽きました...orz iTunes に作曲者を登録するプログラム 先のプログラムは作曲者情報を TSV ファイルに落とすだけですので、実際に iTunes に登録する必要があります。Mac では Apple Script で iTunes をコントロールすることができますので、こんなプログラムを書いてやります。

$ cat composer.scpt
on run argv
  tell application "iTunes"
    set results to (every file track of library playlist 1 whose artist equals item 1 of argv and name equals item 2 of argv)
    -- display dialog item 1 of argv & ", " & item 2 of argv & ", " & count of results
    repeat with t in results
      try
        tell t to set composer to item 3 of argv
      end try
    end repeat
  end tell
end run

TSV ファイルから先頭が RESULT なものだけを抽出して上のプログラムに食わせます。

$ cat tsv2sh
#!/bin/bash

OIFS=$IFS

IFS=' '

exec < "composers.tsv"
while read LINE
do
  if [[ "$LINE" =~ ^RESULT* ]]; then
    # 注意! -F"<tab>"
    echo $LINE | awk -F"    " '{ printf "osascript composer.scpt \"%s\" \"%s\" \"%s\"\n", $2, $3, $4 }'
  fi
done

IFS=$OIFS

$ sh tsv2sh > tmp.sh ; sh -v tmp.sh
:

作曲者の項目のほとんど (17914/17979=99.6%) を埋めることができました!ぱちぱち〜
iTunes Composers


あとがき 最近ネット配信の音源が増えてきました。海外からの直ダウンロード等ですと JASRAC が 管理していないので作曲者がわからない曲がでてきました。困ったものです。TAG はちゃんと埋めてくださいね。 スクレイピングの際に利用サイトに負荷をかけないようにご注意願います。また岡崎事件みたいなことになる可能性もあるということを十分ご理解いただいた上で実行してください。 そういえば歌詞の項目がすべてうまっていない気がするのですが、さらに無駄な時間を浪費しそうなので気づかなかったことにしています(笑)

[1] リアルの部屋は汚いくせにPCの中のデータやフォルダはきれいに整理されてなければ許されない性格