GracenoteのAPIを試してみた

iTunes等のCDプレーヤソフトはGracenoteが提供するデータベースによって曲名を取得している。だが、以前まで普通の個人がそのAPIを利用するのは敷居が高かった。*1ふと気になって調べてみたらなんと簡単に登録できるようになっていた。しかもWeb APIなるものまで提供されている。これは使ってみるしか無いと思って使ってみた。

今まではfreedbを用いていたが、いかんせん有志なのでデータベースが不足している。なのでGracenoteが使えたらありがたいのだ。クラシックのちょっとマイナーなのとか現代音楽とか雅楽のCDで試した限りではちゃんとトラック情報が取得できた。


Web APIはここに簡単に解説してある。: Web API | Gracenote Developer Music + Auto APIs
どうやらClient IDなるものが必要らしいので、アカウント登録をしよう。

登録

アカウントの登録はここで行った。: https://developer.gracenote.com/user/register
登録できたら、ここでログインしよう。: Login to your account | Gracenote Developer Music + Auto APIs

準備

ログインするとMy Appsというページになる。Web APIの利用に必要なClient IDはそのためのAppを追加することで得られるので、右下にある"Add a new app"をクリックする。
Add Appのページになる。App Nameに自由に記入して"Create App"する。
するとMy Appsに戻り、下にAppが追加される。今追加したAppを開く。
App Detailsが表示される。必要なのは"Client ID for Mobile Client and Web API"だけなのでメモしておこう。

Web APIの利用にはClient IDに加えてUser IDが必要となる。
Web APIHTTPSを使ってXMLをPOSTすることでデータ要求し、XML形式で応答が返される。User IDを得るにもその手順を踏む。
ここ(Registration and Authentication)のRegistering a Deviceの項目に書いてあるが、以下のことを行う。

次のURLにUser IDを得るためのXMLをPOSTする。

XXXXXXXの部分はClient IDのハイフンの前の部分で置き換えること。

XMLの内容は以下になる。client_id_stringは各自のClient IDを。

<QUERIES>
    <QUERY CMD="REGISTER">
        <CLIENT>client_id_string</CLIENT>
    </QUERY>
</QUERIES>

例としてregister.xmlというファイル名だとしよう。

コマンドラインでこの要求を送信するのに、wgetcurlが使える。*2

# wget
wget --no-check-certificate --post-file=register.xml https://cXXXXXXX.web.cddbp.net/webapi/xml/1.0/

# curl
curl -d @register.xml https://cXXXXXXX.web.cddbp.net/webapi/xml/1.0/

すると次のような応答が返されるはずだ。

<RESPONSES>
    <RESPONSE STATUS="OK">
        <USER>user_id_string</USER>
    </RESPONSE>
<RESPONSES>

このuser_id_stringをメモしておこう。



TOCによりアルバムのトラック情報を得る

freedbでトラック名を得るときはTOC情報をからCDを探してくる。TOC情報とはCDの上で各トラックがどの位置からスタートしているかという情報のこと。そのfreedbと同じ事をGracenoteで行うことができる。

このページに書いてあることを行えばそれができる。

注意が必要なので、それについても記す。

次のXMLを送信しよう。あるCDのTOC情報のようだ。送信の手順はregister.xmlの時と同じである。

<QUERIES>
  <AUTH>
    <CLIENT>client_id_string</CLIENT>
    <USER>user_id_string</USER>
  </AUTH>
  <QUERY CMD="ALBUM_TOC">
    <MODE>SINGLE_BEST</MODE>
    <TOC>
      <OFFSETS>150 20512 30837 50912 64107 78357 90537 110742 126817 144657 153490 160700 175270 186830 201800 218010 237282 244062 262600 272929</OFFSETS>
  </TOC>
</QUERY>
</QUERIES>

OFFSETSのところにTOCを記述している。これについては後述する。
ちなみにOFFSETSに改行があるとうまくいかないようなので注意。

もとのページではSINGLE_BESTではなくSINGLE_BEST_COVERにしているが、カバー情報が無いCDでは問題が生じるのでSINGLE_BESTにする。*3

すると次のようなXMLが返される。

<RESPONSES>
 <RESPONSE STATUS="OK">
   <ALBUM>
      <GN_ID>15145216-E6E0EB71C036B10B0C1158CE602C5FAC</GN_ID>
      <ARTIST>Various Artists</ARTIST>
      <TITLE>O Brother, Where Art Thou?</TITLE>
      <PKG_LANG>ENG</PKG_LANG>
      <DATE>2000</DATE>
      <GENRE NUM="64773" ID="27131">Original Film/TV Music</GENRE>
      <TRACK_COUNT>19</TRACK_COUNT>
      <TRACK>
         <TRACK_NUM>1</TRACK_NUM>
         <GN_ID>15145217-94058D7FCB938ADFA97874409F9531B2</GN_ID>
         <ARTIST>James Carter &amp; The Prisoners</ARTIST>
         <TITLE>Po Lazuras</TITLE>
         <GENRE NUM="106221" ID="35985">Traditional Folk</GENRE>
      </TRACK>
<!-- 途中省略 -->
      <TRACK>
         <TRACK_NUM>19</TRACK_NUM>
         <GN_ID>15145235-2C101819521AA55ECCD07789F50A3F85</GN_ID>
         <ARTIST>The Stanley Brothers</ARTIST>
         <TITLE>Angel Band</TITLE>
         <GENRE NUM="75252" ID="31402">Bluegrass</GENRE>
      </TRACK>
   </ALBUM>
 </RESPONSE>
</RESPONSES>

お分かりの通り、ここにトラック情報などが記されている。めでたし。



TOC情報を得るには

cdrdaoでCDをリッピングすると.toc形式のファイルが得られる。これを料理する。cdrdaoについてよくわからない人は、前の記事を参照していただきたい。

TOC情報は.tocファイルの中の

  • FILE "image.bin" 19:43:19 16:21:63

といった行の右から二番目の時間情報を使う。この場合だと19:43:19だ。
これは

  • 分:秒:フレーム

という形式で記述されている。フレームという単位は1/75 秒のことだ。つまりフレーム表示に変換するには次のようになる。

  • (分*60+秒)*75+フレーム

OFFSETSに記述する際には150を加える必要がある。つまり2秒。よくわからないが、プリギャップとかいうのが関係しているとか。おまじないだと思っておこう苦笑
こうして得たフレームの配列をregister.xmlのOFFSETSのところにずらーと書くことになる。
注意するのは、Lead Outの位置も必要になることだ。
最後のトラックが

  • FILE "image.bin" 36:05:07 08:47:61

の場合、一番右が曲長の情報なので、位置と長さを加えたものをフレームに変換して加えておく。



自動でやってほしい

XMLのパースとか面倒だよー*4という方はこちらをどうぞ。

cdrdaoの.tocをCD-TEXT付の.tocに変換する。CLIENT IDとUSER IDは取得してください。

標準入力で入力し、標準出力で出力する。例えば次のように使う。

./main.rb < image.toc > mod.toc

お約束だけれど、責任は負いません。




追記 2013/11/22: リンク切れ修正

*1:敷居が高いというか、登録フォームに記述して送信したらそのうち登録しますと返信がきて一ヶ月くらいまってみたら内容が足りませんといわれる始末。もちろん再度試したけれどダメ。サポートに連絡しても返事なし。という状況だった。

*2:恥ずかしいことにPOSTで生のファイルを送れるということを知らなくてどうするのかわからなかった。

*3:カバー情報が無いCDだとなぜかトラック情報が返されない。SELECT_EXTENDEDを使えば回避できるようだが今回は省略する。

*4:REXMLでパースできるよー