Discogs APIから各種データの取得
https://www.discogs.com/developers/
Pythonを使ったDiscogs APIからの情報取得。
日本語のドキュメントが殆ど存在しないので備忘録も兼ねて一応記録しておく。
実行環境: windows10 Python3.9
1.Discogs APIのPython向けライブラリをインストールする
https://github.com/joalla/discogs_client
Discogs APIのライブラリであるjoallaをインストールする。
コマンドラインで
pip3 install python3-discogs-client
と打てばインストールされる。
ライブラリのドキュメントは以下の通り。
https://python3-discogs-client.readthedocs.io/en/latest/index.html
2.認証
一応認証しなくても使えるが、アルバムアートが取得できないなど、得られる情報が限られる。より多くの情報が要るなら認証を行う必要がある。
認証法にはUser-token認証とOAuth認証がある。Discogsデータベース(アルバム情報 etc.)にアクセスするだけならUser-token認証で十分だが、特定のユーザーに関する情報の閲覧等の操作をしたい場合はOAuth認証が必要になる。今回はUser-token認証にのみ触れる。
まずアカウントを作成する必要がある。
右上の登録ボタンから各種情報を入力して登録。
アカウントが作成出来たら右上のアイコンから設定→開発者へと進む
”新しいトークンを生成”を押すと黒で塗りつぶしてある"現在のトークン"の部分にUser-tokenの文字列が表示されるのでコピーしておく。
コードに移る。まずライブラリのインポート。
import discogs_client
クライアントオブジェクトの生成。第二引数に文字列としてコピーしたユーザートークンを張り付ける。
d = discogs_client.Client('任意のアプリ名', user_token="コピーしたユーザートークン")
この時点で認証まで完了。以下全てのコードにおいて上記のクライアントオブジェクトが既に生成されている物として考える。
3.データの取得
IT分野だとフェッチと呼ぶらしい。日本語使え。
以下のURLから取得できる情報を確認できる。
https://www.discogs.com/developers#page:database
ライブラリの方でメゾッドが用意されている。ここでは主要な物だけピックアップする。
リリースの取得
あるアルバムの特定のリリースに関する情報を取得する。
release = d.release("ID")
IDはDiscogsリリースページのURLか右上のリリースコードの選択、または他のメゾッドから取得する。
#Test Code
release = d.release(2127839)
print(release)
print(release.title)
print(release.artists)
print(release.url)
実行結果
<Release 2127839 'Land Of Cockayne'>
Land Of Cockayne
[<Artist 152680 'Soft Machine'>]
https://www.discogs.com/Soft-Machine-Land-Of-Cockayne/release/2127839
コンマ以下で指定する事により任意の情報を出力できる。その他得られる情報は上記のURLの"release">"Response 200"または
を参照。
マスターリリースの取得
あるアルバムのリリース全体の情報を取得できる。
master = d.master("ID")
IDはDiscogsマスターリリースページのURLか右上のマスターリリースコードの選択、または他のメゾッドから取得する。
#Test code
master = d.master(16930)
print(master)
print(master.title)
print(master.main_release)
for version in master.versions:
print(version)
実行結果(for文の部分の結果を一部省略)
<Master 16930 'Land Of Cockayne'>
Land Of Cockayne
<Release 2127839 'Land Of Cockayne'>
<Release 2203632 'Land Of Cockayne'>
.
.
.
<Release 14513364 'Land Of Cockayne'>
<Release 7017598 'Land Of Cockayne'>
<Release 2128892 'Land Of Cockayne'>
versionsの配列の中には各特定のリリース情報を持つdiscogs_client.models.Releaseクラス(リリースの取得で得られるものと同じ)のオブジェクトが入っている。
print(master.versions[0].__class__.__name__) #クラス名の取得
print(master.versions[0].title)
print(master.versions[0].year)
実行結果
Release
Land Of Cockayne
1981
その他得られる情報は上記のURLの"Master Release">"Response 200"または
を参照。
アーティストの取得
アーティストの各種情報の取得が出来る。
artist = d.artist("ID")
IDはDiscogsアーティストページのURLか右上のアーティストコードの選択、または後述する"検索"から取得する。
artist = d.artist(152680)
print(artist.name)
print(artist.members)
for release in artist.releases:
print(release)
print(artist.releases[0].__class__.__name__) #クラス名の取得
print(artist.releases[0].title)
実行結果(for文の部分の結果を一部省略。Soft machineはリリース大杉)
Soft Machine
[<Artist 5049 'Robert Wyatt'>, <Artist 10354 'Daevid Allen'>, <Artist 45646 'Kevin Ayers'>, <Artist 95878 'Andy Summers'>, <Artist 235031 'Hugh Hopper'>, <Artist 235033 'Elton Dean'>, <Artist 236892 'Theo Travis'>, <Artist 252381 'Nick Evans'>, <Artist 252383 'Mike Ratledge'>, <Artist 252384 'Lyn Dobson'>, <Artist 253140 'Marc Charig'>, <Artist 253632 'Karl Jenkins'>, <Artist 253633 'John Marshall'>, <Artist 253701 'Roy Babbington'>, <Artist 254012 'Allan Holdsworth'>, <Artist 274792 'Ric Sanders'>, <Artist 285394 'Ray Warleigh'>, <Artist 321464 'Alan Wakeman'>, <Artist 321889 'Phil Howard'>, <Artist 351916 'Steve Cook (2)'>, <Artist 418236 'John Etheridge'>]
<Master 16803 'Love Makes Sweet Music'>
<Release 2765770 'The Soft Machine'>
<Master 471058 'Joy Of A Toy / Why Are We Sleeping?'>
.
.
.
<Release 13962398 'Paris December 13,1976'>
<Master 1589378 'Out Of Tunes'>
<Master 315323 'Rubber Riff'>
Master
Love Makes Sweet Music
artist.releasesの配列の中にはdiscogs_client.models.Masterまたはdiscogs_client.models.Releaseクラスのオブジェクトが入っている(マスターリリースの取得またはリリースの取得で得られるものと同じ)
その他得られる情報は上記のURLの"Artist">"Response 200"または
を参照。
検索
任意の情報からDiscogsデータベースに検索をかける事が出来る。
search = d.search(type,title,release_title,credit,artist,anv,label,genre,style,country,year,format,catno,barcode,track,submitter,contributor)
引数が多いよー😭。
実際に検索をかける時はこの中から指定したい要素だけ入力する。
search = d.search(type="master", title="Heaven or Las Vegas")
for result in search:
print(result)
print(search[1].title)
print(search[1].id)
print(search[1].tracklist)
実行結果
<Master 5133 'Cocteau Twins - Heaven Or Las Vegas'>
<Master 5104 'Cocteau Twins - Heaven Or Las Vegas'>
Cocteau Twins - Heaven Or Las Vegas
5104
[<Track 'A1' 'Cherry-Coloured Funk'>, <Track 'A2' 'Pitch The Baby'>, <Track 'A3' 'Iceblink Luck'>, <Track 'A4' 'Fifty-Fifty Clown'>, <Track 'A5' 'Heaven Or Las Vegas'>, <Track 'B1' 'I Wear Your Ring'>, <Track 'B2' 'Fotzepolitic'>, <Track 'B3' 'Wolf In The Breast'>, <Track 'B4' 'Road, River And Rail'>, <Track 'B5' 'Frou-Frou Foxes In Midsummer Fires'>]
type部の指定次第でserchの配列の中に入るオブジェクトがdiscogs_client.models.Masterだったりdiscogs_client.models.Releaseだったりdiscogs_client.models.Artistだったりする。
4.別に必要のない補足
Disogs APIからでは投稿されているアルバムのレビューは取得できない(取得したい奴いるのかはさておき)のでやりたい場合はhtmlから無理やり抽出することになる。
from bs4 import BeautifulSoup
import requests
search = d.search(type="master", title="Heaven or Las Vegas")
url = (
"https://www.discogs.com/master/" +
str(search[1].id) +
'-' +
str(search[1].title.split(' - ')[1].replace(' ', '-').replace('(', '').replace(')', '').replace('/', '')) +
"/reviews?limit=250"
)
reviews = []
html = requests.get(url)
texts = BeautifulSoup(html.text, 'html.parser').find_all('div', class_='review_comment')
for review in texts:
reviews.append(review.contents[0])
print(reviews)
htmlの取得・抽出用としてrequestsとBeautifulSoupを使用(使い方はググって下さい)するのはいいとして、キモというか面倒なのはurlの作成である。アルバムのレビューページのURLは(https://www.discogs.com/master/ID-アルバム名/reviews?limit=レビューの表示数)という構成になっているのでこのフォーマットに適するように作ってあげればよい。上記コードはsearchメゾッドで帰ってくる検索結果を用いて作る場合の一例。
5.あとがき
恐らく公式のドキュメントをGoogle翻訳にぶち込んで読んだ方がいろいろと早い。
この記事が気に入ったらサポートをしてみませんか?