Discogs プラグイン・旧版(API V1.0版)
![]() | |
Artist: | Perfume (2) |
Url: | http://www.perfume-web.jp/ |
![]() | |
Title: | ワンルーム・ディスコ |
Label: | Tokuma Japan Communications |
Released: | 2009 |
Track: | 1 [5:16] ワンルーム・ディスコ |
2 [5:06] 23:30 | |
3 [5:18] ワンルーム・ディスコ (Original Instrumental) | |
4 [5:06] 23:30 (Original Instrumental) |
テクノ名盤200+αの刷新の際に、このリスト中には、Amazonには全然レコードをおいてないミュージシャンがいっぱいいたことを思い出し、どこかからミュージシャンとそのアルバムのデータを引っぱってこれないかしらと、いろいろ探し回ったあげく、DiscogsのDeveloper's APIを叩いてデータを持ってくる、FreeStyleWiki用のプラグインを作ってみました。
インストール
- Discogsのアカウントを取得する。
- DiscogsのAPIキーを登録する。
- 申請してから返事が来るまで結構時間がかかります(私の場合、3時間強かかりました)。
- 以下のファイルをダウンロードする。
- discogs.zip(340)
- Discogs.pmの39行目に記載のある変数「$key」に登録したAPIキーを設定する。
- plugin以下にインストールする。
- さらに以下のモジュールをlib以下にインストールする。
使い方
{{discogs Perfume (2),ワンルーム・ディスコ,2009}}
- 「Perfume (2)」はミュージシャン名。「 (2)」というのは、Discogsのデータベースに、他にも「Perfume」という同名のミュージシャンが登録されているためにつけられている番号で、普通はつける必要ありません。
- 「ワンルーム・ディスコ」はCDもしくはレコードのタイトル。
- 「2009」はリリースされた年。
補足
- プラグインの出力全体を <div class="discogs">〜</div> でくるんであります。テーブルを組んで表示していますので、枠線がうるさく感じる場合にはCSSで非表示にしてください。
div.discogs table { border-style:none; } div.discogs th, div.discogs td, div.discogs img { border-style:none; }
愚痴
DiscogsのDeveloper's APIは、リクエストがRESTでレスポンスがXMLというありがちなもので、プラグインくらいちょちょいのちょいと書けるだろうと手をつけてみたものの、ものすごく手間取りました。
その理由ですが、まずは、登録されているデータがいいかげんなこと。
例えば、テクノ名盤/8の「The House Master Boyz And The Rude Boy Of House」というミュージシャンですが、Discogsのデータベースには、
- Housemaster Boyz, The
- House Master Boys
- House Master Boys, The
- House Master Boyz
- House Master Boyz & The Rude Boy Of House
- House Master Boyz & The Rude Boy Of House, The
- House Master Boyz & The Rude Boy Of The House
- House Master Boyz / Rude Boy Of House
- House Master Boyz And The Rude Boy Of House
- House Master Boyz And The Rude Boy Of House, The
- House Master Boyz And The Rude Boys Of House
- House Master Boyz And The Rude Oy Of House, The
- House Master Boyz Featuring The Rude Boy Of House, The
- House Master Boyz Rude Boyz Of House
- House Master Boyz, Rude Boyz Of House
- House Master Boyz, The
- House Master Boyz/Rude Boy Of House
- Housemaker Boyz
- Housemaster Boys
- Housemaster Boyz
- Housemaster Boyz & The Rude Boy Of House
- Housemaster Boyz & The Rude Boyz Of House
- Housemaster Boyz And The Rude Boy Of House
- Housemaster Boyz And The Rude Boy Of House, The
- Housemaster Boyz And The Rudeboy Of House, The
- Housemasters Boyz
が登録されています。
このうち、Get Artist のAPIで、26の名前で出したすべてのアルバムのデータを取得できるのは、Discogsでメインの名前とされている「Housemaster Boyz, The」だけ(少なくともそのはず)。
よって、
- まず、Search のAPIで、リストに記載されている名前からDiscogsのデータベースでのメインの名前を見つけ出し、
- メインの名前を用いて、Get Artist のAPIでリストに記載されているアルバム名を検索、リリース番号というDiscogsでの管理番号がわかったら、
- リリース番号を用いて、Get Release のAPIでアルバム情報を得る。
という三段構えでAPIを叩くことになります。
ところが、最初の Search のAPIでうまくメインの名前が見つからない。API Documentのページの例では、レスポンスの<exactresult>要素の、typeがartistになってる<result>要素を見ればいいように思われますが、ここに全然名前が入ってない!
API Documentのページの例にある「AFX」で検索したレスポンスに「afx」しか入ってないのは、「Aphex Twin」とは別名義である(別のミュージシャンとみなす)ということで問題ないでしょう。
でも、この「The House Master Boyz And The Rude Boy Of House」の26の別名の場合、その大半は表記の揺れじゃないですか(少なくとも2つにまとめられると思う)。どれか1つ(もしくは2つのどちらか)で検索したら、メインの名前がわかるようになっててしかるべきでは。なのに、どの名前で検索しても、typeがartistの<result>要素は空っぽ!
変なデータは例に挙げたこれだけではなく、他のデータもこんなのばっか!
しかたがないので、レスポンスの中のいろんなところを見て、できる限りメインの名前を探すようにしました。
それでも見つからない場合は、プラグイン側での対応はあきらめて、いちいちDiscogsで検索してメインの名前を見つけ出し、リストの記載の方を書き換え、プラグインに与える引数自体を修正することで対応しました。
それでもどうしてもうまくいかないページが残ってしまいましたが……。
もう一つの手こずった理由は、文字コードの問題。
FreeSytleWikiは文字コードとしてEUC-JPを採用しています。ですから、Wikiのページには、EUC-JPの文字しか記すことができません。
なのに、このリスト中には「Sven Väth」(aのウムラウト)とか「Trentemøller」(oのスラッシュ)など、EUC-JPでは書けない文字を含む名前や曲名がたくさん出てくるのです。今までは、「Sven Vath」とか「Trentemoller」などと普通のアルファベットの文字に勝手に置き換えて、お茶を濁してきました。
ところが、DiscogsのAPIの文字コードはUTF8なので、これらの文字を使っても別に何の問題もありません。なので、「Sven Vath」とか「Trentemoller」などのお茶を濁した記載で検索してもなにも引っかかってきません。きちんと「Sven Väth」とか「Trentemøller」で検索しないとダメ。
仕方がないので、プラグインが記載されるWikiのページ(EUC-JPの文字コードのみ許される)には、Wikiソースは別にHTMLでも何でもないにも関わらず「Sven Väth」とか「Trentemøller」などと、HTMLの一般実体参照で記しておき、プラグインの中で「Sven Väth」「Trentemøller」に変換することにしました。
さらに、DiscogsのAPIはRESTなので、URLエンコードも行う必要があります。
つまり、WikiソースからAPIのパラメータへの変換は、
- EUC-JPからUTF8への変換
- 一般実体参照から通常の文字への変換(一般実体参照のデコード)
- URLエンコード
という3つの変換を施せばよいことになります。
ところがこれがうまくいかない。変換の順番を変えたり、HTML::EntitiesとEncodeの関係を検討したり、いろいろやってはみたのですが……。
逆方向の変換(URLデコード、一般実体参照へのエンコード、UTF8からEUC-JPへの変換)は簡単にうまくいくのがまたむかつく。
結局、上記3つのうち2つの変換(一般実体参照のデコード、URLエンコード)を一気にやる関数を自分で書いちゃいました。
自分の馬鹿さ加減は棚に上げ、FreeStyleWikiがUTF8に対応してないのが悪い!、と強く強く思いました。
参考
- Discogs API Documentation
- 上記文中でも書きましたが、なかなか、このページのサンプルどおりのレスポンスは返ってこない。
- Perlで文字列を一般実体参照や数字文字参照に変換する方法まとめ - 空繰再繰
- これは知らなかった。勉強になります。ありがとうございます。
関連ページ