GracenoteAPIを使うためのライブラリを調べた


[Gracenote](http://www.gracenote.com/?language=ja)は、音楽情報のメタデータサービスです。
アーティス名、アルバム名、曲名から音楽データを取得できます。楽曲情報以外に、ムードやテンポ情報も取得できます。
GracenoteからWebAPIを使うためにRuby/Python用のライブラリーについて調べた結果をまとめました。

# クライアントIDの取得
[ここから](https://developer.gracenote.com/?language=en)、開発者プログラムに登録できます。
日本語だと、Facebook認証完了後、管理画面で言語エラーがでるかもしれないので、英語をオススメします。
管理画面に入ったら、MyAppsボタンを選択し、「Add a new app」を選択し、「Create App」するとクライアントIDが発行されます。

## My Apps

![My_Apps___Gracenote.png](https://qiita-image-store.s3.amazonaws.com/0/2432/657fbff3-0d27-1e1c-484c-bfd0b9a0094e.png "My_Apps___Gracenote.png")

## Add App

![Add_App___Gracenote.png](https://qiita-image-store.s3.amazonaws.com/0/2432/93c24232-28c2-e8f4-4b3e-2845e5fd4fa0.png "Add_App___Gracenote.png")

## App Details

![mhd_demo___Gracenote.png](https://qiita-image-store.s3.amazonaws.com/0/2432/798a9e3a-f151-cce9-a5ab-8e016d2cba59.png "mhd_demo___Gracenote.png")

WebAPIでは、「Client ID for Web API, Rhythm API and eyeQ」と「Client Tag」を使います。

# Ruby
## gracenote
https://github.com/nobelium/gracenote

### 感想
とりあえず動く

### サンプルコード

```
$ gem install gracenote
$ vi sample.rb
```

```sample.rb
require 'rubygems'
require 'gracenote'

obj = Gracenote.new(
  clientID: '',
  clientTag: ''
)
obj.registerUser
artist_name = 'Perfume'
album_title = 'GAME'
track_title = 'チョコレイト・ディスコ'
match_mode = '0'
p obj.findTrack(artist_name, album_title, track_title, match_mode)
```

### 実行

```bash
$ ruby ./sample.rb
```

### イケてないところ

- gnidで検索できないよ
- NET::HTTPを使っているので、同期通信だよ

### 結論
まあ、アルバム、アーティスト、曲名のテキストサーチだけならいいかな

## under_fire
https://github.com/jasonthompson/under_fire/

### 感想

そのままでは動かないので、使えない
一応、動くように書き換えたが、１から作ったほうがまし

### サンプルコード

CLIENT_IDの中に、clientTagも含まれているので、ライブラリの作りによっては不要だったりする

```
$ gem install under_fire
$ vi sample.rb
```

```sample.rb
require 'rubygems'
require 'under_fire'

ENV["GRACENOTE_CLIENT_ID"] = 'your client id'

module UnderFire
  class BaseQuery
    def build_base_query(&block)
      builder = Builder::XmlMarkup.new
      builder.QUERIES {
        builder.AUTH {
          builder.CLIENT ENV["GRACENOTE_CLIENT_ID"]
          builder.USER ENV["GRACENOTE_USER"]
        }
        yield builder
      }
    end
  end
end

module UnderFire
  class APIRequest
    def self.post(query, api_url)
      uri = URI(api_url)
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true
      req = Net::HTTP::Post.new(uri.request_uri)
      req.body = query
      req['Content-Type'] = 'application/xml'
      res = http.request(req)
      res
    end
  end
end

client = UnderFire::Client.new
response = client.register(ENV["GRACENOTE_CLIENT_ID"])
ENV["GRACENOTE_USER"] = response.response[:responses][:response][:user]
p client.find_album(:track_title => 'チョコレイト・ディスコ')
```

### 実行

```bash
$ ruby ./sample.rb
```

### イケてないところ
- SSLの通信エラーがでる
- Language Preferenceが固定値
- registerで取得したUSERIDを使わないと認証できないが、書き換えてないので、認証エラーになる

### 他にも
- TrackAPIが実装されていないので、テンポやムードは取れないよ
- NET::HTTPを使っているので、同期通信だよ

### 良いところ
- gracenote gemに比べて、インターフェイスがRubyっぽいgn_idから検索できる

# Python

## pygn

### 感想
使い方は、pygn.pyをマルっとコピーしてワーキングディレクトリに置くだけ。
そのままでは、pipでインストールしても読み込めないよ
機能がひと通り実装されているため使いやすい。
使い方もソースコードが１ファイルだから、コードを読むのが早いです。

### サンプルコード

```
$ wget https://raw.githubusercontent.com/cweichen/pygn/master/pygn.py
$ vi sample.py
```

```sample.py
import pygn

clientID = '' # Enter your Client ID here
userID = pygn.register(clientID)
metadata = pygn.search(clientID=clientID, userID=userID, artist='Perfume')
print metadata
```


### 実行

```bash
$ python ./sample.py
```

# まとめ
公式でRuby/Pythonのクライアントライブラリがないので、サードパーティー製を使うしかない。
Python用がそこそこまともに動くので、さくっと使いたい場合はpygnをオススメします。
ちゃんと使うとパフォーマンスがでないので、通信周りを非同期ライブラリーに変えてRubyで再実装するか、勉強のため、GoかElixerで書きたい