LoginSignup
11
11

More than 3 years have passed since last update.

[python] [Gracenote Web API] pygnをちょこっとカスタマイズ

Last updated at Posted at 2015-05-15

QiitaにこんなAPI扱ってる人いねーだろうと思いつつも投稿します。
技術ブログだから関連してたら何書いてもOKでしょ。
別にここで今日の晩飯について言及するようなことはありません。

2020/11/17 追記

Gracenote WebAPIが無料公開されなくなってしまったのでしょうか?
https://developer.gracenote.com/web-apiNotFound になってしまっています。
(そもそもGracenoteに登録してcliantIDとuserIDを取得することができない?)

Gracenote WebAPIが非公開になったか確認できるまで、当記事は過去ログとして放置しておきます。

そもそもGracenoteとは?

iPodやらiPhoneを使ってる人の中では知らない人はいないであろうiTunesですが、CDを入れて楽曲のタグ付けをする際に使われているのがこのGracenote APIです。
古今東西ありとあらゆる楽曲が登録されていて、殊更日本においては同人音楽やらエロゲの予約特典のドラマCDまで認識する始末。
誰が登録してるんですかね?本当・・・(もうやだこの国・・・)

そんな優れもののAPIですが、iTunesに入ってるのはGNSDKといい何でもできるもの(C言語です)。
Web APIは簡易版ですが、結構細かい内容を返してくれます。
XMLを投げたらXMLで返してくれます。
(個人的にはJSONのほうが好きですが、)ラッパーがあるので何とかなります。

簡単な使い方

私はPythonistaなのでpygnしか使いません。(Pythonが一番好きだけど、C#とNode.jsも興味があるので暇があったら投稿するかも・・・)
予め、Gracenoteに登録してcliantIDとuserIDは取得しておいて下さい。

超流しで書きます。
今日の本題ではないので。

test.py
import pygn, json

clientID = 'XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
userID = 'XXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

def beautiful(gn_obj): 
   data = json.dumps(gn_obj, sort_keys=True, indent=4, ensure_ascii=False)
   return data

res = beautiful(pygn.search(clientID=clientID, userID=userID, album='オー!リバル', artist='ポルノグラフィティ'))
print(res)

./test.py > res.jsonとでもして保存して下さい。

本題

pygnを<LANG>ja</LANG>に対応させただけです。
パッチファイルです。

pygn.patch
--- /home/hoge/Download/pygn-master/pygn.py 2015-05-15 17:06:08.436636117 +0900
+++ /usr/local/lib/python3.4/dist-packages/pygn.py  2015-05-15 04:04:38.551710764 +0900
@@ -7,6 +7,8 @@

 You will need a Gracenote Client ID to use this module. Please contact 
 developers@gracenote.com to get one.
+
+<LANG>オプション対応版
 """

 from __future__ import print_function
@@ -100,7 +102,8 @@
 # Added by Fabian in order to cover the Rhythm API
 # Returns a list of gnmetadata dictionaries 

-def createRadio(clientID='', userID='', artist='', track='', mood='', era='', genre='', popularity ='', similarity = '', count='10'):
+def createRadio(clientID='', userID='', lang='', artist='', track='', mood='', era='', genre='',
+                popularity ='', similarity = '', count='10'):
     """
     Queries a Radio playlist
     """
@@ -117,6 +120,7 @@

     # Build the user header 
     query.addAuth(clientID, userID)
+    query.addLang(lang)

     query.addQuery('RADIO_CREATE')

@@ -228,7 +232,7 @@

 #***********************************************************************************************************************

-def search(clientID='', userID='', artist='', album='', track='', toc=''):
+def search(clientID='', userID='',lang='', artist='', album='', track='', toc=''):
     """
     Queries the Gracenote service for a track, album, artist, or TOC

@@ -247,6 +251,7 @@
     query = _gnquery()

     query.addAuth(clientID, userID)
+    query.addLang(lang)

     if (toc != ''):
         query.addQuery('ALBUM_TOC')
@@ -432,7 +437,7 @@



-def get_discography(clientID='', userID='', artist='', rangeStart=1, rangeEnd=10):
+def get_discography(clientID='', userID='', lang='', artist='', rangeStart=1, rangeEnd=10):
     """
     Queries the Gracenote service for all albums containing an artist
     """
@@ -449,6 +454,7 @@
     query = _gnquery()

     query.addAuth(clientID, userID)
+    query.addLang(lang)
     query.addQuery('ALBUM_SEARCH')
     query.addQueryTextField('ARTIST', artist)
     query.addQueryOption('SELECT_EXTENDED', 'COVER,REVIEW,ARTIST_BIOGRAPHY,ARTIST_IMAGE,ARTIST_OET,MOOD,TEMPO')
@@ -534,7 +540,7 @@

     return discography

-def fetch(clientID='', userID='', GNID=''):
+def fetch(clientID='', userID='', GNID='', lang=''):
     """
     Fetches a track or album by GN ID
     """
@@ -551,6 +557,7 @@
     query = _gnquery()

     query.addAuth(clientID, userID)
+    query.addLang(lang)
     query.addQuery('ALBUM_FETCH')
     query.addQueryGNID(GNID)
     query.addQueryOption('SELECT_EXTENDED', 'COVER,REVIEW,ARTIST_BIOGRAPHY,ARTIST_IMAGE,ARTIST_OET,MOOD,TEMPO')
@@ -721,6 +728,10 @@
         client.text = clientID
         user.text = userID

+    def addLang(self, language):
+        lang = xml.etree.ElementTree.SubElement(self.root, 'LANG')
+        lang.text = language
+        
     def addQuery(self, cmd):
         query = xml.etree.ElementTree.SubElement(self.root, 'QUERY')
         query.attrib['CMD'] = cmd

これでそれぞれのパラメータにlangオプションが追加されます。

先の例でいくと・・・

res = beautiful(pygn.search(clientID=clientID, userID=userID, lang='ja' album='オー!リバル', artist='ポルノグラフィティ'))

的な感じです。
日本語で返ってきたからといってもムードとかそこら辺が日本語になるだけなんですがね・・・
タブ挿入がうまくいかないので、多分これをあててもまともに動かないと思います。
その場合は手書きで追加して下さい。
 
 
 

11
11
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
11
11