Gracenoteは、音楽情報のメタデータサービスです。
アーティス名、アルバム名、曲名から音楽データを取得できます。楽曲情報以外に、ムードやテンポ情報も取得できます。
GracenoteからWebAPIを使うためにRuby/Python用のライブラリーについて調べた結果をまとめました。
クライアントIDの取得
ここから、開発者プログラムに登録できます。
日本語だと、Facebook認証完了後、管理画面で言語エラーがでるかもしれないので、英語をオススメします。
管理画面に入ったら、MyAppsボタンを選択し、「Add a new app」を選択し、「Create App」するとクライアントIDが発行されます。
My Apps
Add App
App Details
WebAPIでは、「Client ID for Web API, Rhythm API and eyeQ」と「Client Tag」を使います。
Ruby
gracenote
感想
とりあえず動く
サンプルコード
$ gem install gracenote
$ vi 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)
実行
$ ruby ./sample.rb
イケてないところ
- gnidで検索できないよ
- NET::HTTPを使っているので、同期通信だよ
結論
まあ、アルバム、アーティスト、曲名のテキストサーチだけならいいかな
under_fire
感想
そのままでは動かないので、使えない
一応、動くように書き換えたが、1から作ったほうがまし
サンプルコード
CLIENT_IDの中に、clientTagも含まれているので、ライブラリの作りによっては不要だったりする
$ gem install under_fire
$ vi 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 => 'チョコレイト・ディスコ')
実行
$ ruby ./sample.rb
イケてないところ
- SSLの通信エラーがでる
- Language Preferenceが固定値
- registerで取得したUSERIDを使わないと認証できないが、書き換えてないので、認証エラーになる
他にも
- TrackAPIが実装されていないので、テンポやムードは取れないよ
- NET::HTTPを使っているので、同期通信だよ
良いところ
- gracenote gemに比べて、インターフェイスがRubyっぽいgn_idから検索できる
Python
pygn
感想
使い方は、pygn.pyをマルっとコピーしてワーキングディレクトリに置くだけ。
そのままでは、pipでインストールしても読み込めないよ
機能がひと通り実装されているため使いやすい。
使い方もソースコードが1ファイルだから、コードを読むのが早いです。
サンプルコード
$ wget https://raw.githubusercontent.com/cweichen/pygn/master/pygn.py
$ vi 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
実行
$ python ./sample.py
まとめ
公式でRuby/Pythonのクライアントライブラリがないので、サードパーティー製を使うしかない。
Python用がそこそこまともに動くので、さくっと使いたい場合はpygnをオススメします。
ちゃんと使うとパフォーマンスがでないので、通信周りを非同期ライブラリーに変えてRubyで再実装するか、勉強のため、GoかElixerで書きたい