-
Notifications
You must be signed in to change notification settings - Fork 0
Home
私は音楽を聞くのが趣味の一つです。iPod と iTunes を使っています。自分の持っているすべての音楽を一元管理できるってのは世界観が変わるよと言われてやってみました。たしかに世界観は変わったのですが、デジタル潔癖症[1]を罹患している私は思わぬところでハマってしまいました。楽曲の情報をすべて埋めてやらないと気が済まないんです。 楽曲のタイトルとアルバムはたいてい iTunes が勝手にデータベースから取ってきてくれるので問題ありません。まずハマったのはすべてのアルバムのジャケットをそろえることです。600x600 pixel のジャケットを揃えるのにものすごい労力を費やしたものです。
ジャケ写取得参考ソフト
- iGCover
- なければアマゾンのユーザーがアップロードしたジャケ写
- それでもなければ discogs.com
- CoverLoad Apple Music.app のジャケ写のはず
ジャケットをすべて揃えたあとリストを眺めてると、入ってるのと入ってないものがある項目として作曲者が目についてしまいました。うまっていない項目をうめないとデジタル潔癖症の私の心は癒えません。 ググッてみたのですがジャケットみたいにフリーなソフトは見つかりません。 自作するしかありません。
さて作曲者情報はどこから取ってきましょうか?
実はいいデータベースがあるんですよ。それも国内に。そう JASRAC の楽曲データベースです。ネットでは何かと言われています JASRAC ですが、さすが音楽の世界を牛耳っているだけあって持っているデータベースはメジャーどころでは洋邦問わずほとんど網羅されています。そしてそのデータベースはネットで公開されています。
http://www2.jasrac.or.jp/eJwid/
技術者としては文句をいう暇があるのならその代わりにとことん利用させていただきます。 普通の Web Form インターフェースで API などなさそうなのでスクレイピングすることにします。iTunes から作曲者情報の無い楽曲のアーティストとタイトルを取ってきてそれを引数にしてJASRAC データベースを検索します。
JASRAC のページは最初のページのボタンを押さないとフォーム検索してくれないので Web コントロールを行うソフトとして htmlunit (Selenium に変更した) を使います。
iTunes データベースは XML ファイルとして存在するので XPath で読み込もうとしたのですが、容量がでかいため(2万曲近くあるので) JDK 付属の DOM で扱うとメモリが溢れてしまうので Saxon を使います。
Music.app から iTunesLibrary.framework を使用して取得するようになったのでライブラリを作成しました。
流れは以下のようになります。
Music Library.musiclibrary -> iTunesLibrary.framework (artist, title) -> Selenium -> JASRAC DB -> xpath (composer) -> TSV file
JASRAC のデータベース内の人名は変な規則で正規化されてるので普通に読みやすくしてやる必要があります。 あと alias も同時に登録されているのでダブリを除かないといけないのですが面倒なのでそのままです。
今までの流れを記述した実際のコードは以下になります。
HTML を JAXP で扱うパーサーや XPath をアノテーションで扱う機構など水面下では結構いろんな事を行っています。 お時間がある方はソースを追ってみてください。
- https://github.com/umjammer/vavi-util-screenscraping/tree/master/src/main/java/vavi/xml/jaxp/html/cyberneko
- https://github.com/umjammer/vavi-util-screenscraping/tree/master/src/main/java/vavix/util/screenscrape/annotation
実行結果の TSV は以下の様になります。
見つかった場合は先頭が RESULT、見つからなかった場合は NONE、もしかしての候補がある場合は MAYBE になっています。
さすがに JASRAC データベースも 100% 網羅しているわけではないので、見つからなかった場合は、
- discogs.com
- allmusic.com
等のサイトを利用してください。 allmusic.com はとても面倒なのでスクレイピングしたいところですが力尽きました...orz
先のプログラムは作曲者情報を 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%) を埋めることができました!ぱちぱち〜
最近ネット配信の音源が増えてきました。海外からの直ダウンロード等ですと JASRAC が 管理していないので作曲者がわからない曲がでてきました。困ったものです。TAG はちゃんと埋めてくださいね。
スクレイピングの際に利用サイトに負荷をかけないようにご注意願います。岡崎事件みたいなことになる可能性もあるということを十分ご理解いただいた上で実行してください。
そういえば歌詞の項目がすべてうまっていない気がするのですが、さらに無駄な時間を浪費しそうなので気づかなかったことにしています(笑)
- リアルの部屋は汚いくせにPCの中のデータやフォルダはきれいに整理されてなければ許されない性格