LoginSignup
5
7

More than 5 years have passed since last update.

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

Posted at

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

クライアントIDの取得

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

My Apps

My_Apps___Gracenote.png

Add App

Add_App___Gracenote.png

App Details

mhd_demo___Gracenote.png

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

Ruby

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)

実行

$ ruby ./sample.rb

イケてないところ

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

結論

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

under_fire

感想

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

サンプルコード

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 => 'チョコレイト・ディスコ')

実行

$ 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
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で書きたい

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7