Spotify APIでアーティストの全楽曲を取得する

Pythonの勉強がてらSpotify APIをいじっていて、アーティストの全楽曲を取得するのにちょっと苦労した。自分の知識の整理もかねて方法をメモ。

0.基本と準備

Spotifyのidとalbumとtrack

Spotifyでは、アーティスト、楽曲、アルバム、プレイリストなどは全て固有のidで管理されている。ブラウザでアクセスした際の
 https://………../playlist/xxxxxxxxxxxxxxxx?…..
 https://…………/album/xxxxxsxxxxxxxxxx?……
のxxxxxの部分がid。

楽曲(track)を取得する際に、基本的に把握しておきたい(と思う)ポイント。

  • trackはすべて”album”に属する。albumはいわゆる「アルバム」だけでなく、シングルも含む(配信シングルも収録trackひとつだけのalbumに属する)
  • 複数のalbumに収録された同一曲は、それぞれ別trackとして管理される
  • albumデータからはtrack情報が取れるが、trackデータから逆引きは出来ない

Spityfy APIを使う準備

Spotify APIを使うためのid取得や認証方法とかはネットに山ほど情報があるので省略。Spotifyの無料ユーザーでもAPIは使える。
以下、お約束のコード。

以下、出力例は、延べ1400曲以上らしい松田聖子(artist_id:3E5NLQpQbd0eJ18XO9zC0h)で示している。

1.アルバム/シングルから全楽曲を取得

基本的な手順は
・artist idからartist_albumsAPIでalbumのid一覧を取得
・各albumのidからalbum_tracksAPIでtrack(楽曲)データの一覧を取得
・各trackデータからタイトルを取得
となる。

アルバムから全楽曲

いわゆるアルバムから全曲名を取り出すには、まずartist_albums APIのalbum_typeにalbumを指定する。
なおalbum_typeに指定できるのは以下の4種類

  • album
  • single
  • appears on
  • compilation

(‘appears on’と’compilation’については後述)

以下、コード。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

シングルから全楽曲

artist_albums APIのalbum_typeに’single’を指定するだけで、あとはアルバムと変わらない。
カップリング曲も含めたtrackが取得できる。
以下、両方対応のための関数を利用したパターン。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

アルバム・シングルの全曲

上記で取った楽曲名を合わせるだけ。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

2.他アーティスト作品への参加曲や各種コンピ収録曲

album_typeに’appears_on’を指定すると、アルバム・シングル以外にアーティストが参加した、他アーティスト作品(album)のデータが取れる。(英語の解説)
実際に確認した範囲では
 (1)複数アーティストが参加した、いわゆるコンピ
 (2)特定テーマによるベストアルバム的なもの
 (3)他アーティストの作品参加
の少なくとも3種類が取れる模様。(1)の場合、albumのartist名は「ヴァリアス・アーティスト(Various artist)」になるようだ。

ともかく、このalbumには、対象アーティストが参加していないtrackも含まれている(ことが多いはず)ので、各trackのartist_idをチェックする必要がある。

以下、シンプルにtrack名を取得するコード。ハイライト部分がアルバムやシングルの処理に追加したコード。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

3.「コンピレーション」楽曲も取得

album_typeに’compilation’を指定すると「コンピレーション」albumのデータが取れる。これは上記3種類で取れるalbumには含まれないようだ。
Spotifyで言うcompilationとは、「The Greatest Hits of xxxx」みたいな、アーティストの代表曲をまとめたものを指すらしい(英語の解説)。2.と3.で取得した以外の楽曲は取れないと思う(compilationだけ配信していれば別だが)。
ともかく、trackの取得はアルバムやシングルと同じ。

4.全楽曲を一気に取得し csv出力

artist_albums APIのalbum_type指定を省略すると、上記4種類のalbumデータ全部が取れる。
これで、2.のappears on と同じ方式で絞り込めば「全ての楽曲名」が取得できる(はず)。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

ただ、例えば同じ曲に、artist単独によるものと、他artistとのコラボとの両方がある場合、この単純な方式だと漏れてしまう。

なので、
 ・複数アーティスト名義(コラボなど)は楽曲名にアーティスト名を付加
さらに
 ・楽曲タイトルと、それぞれの収録アルバム・シングル名すべて
 ・楽曲を人気順に並べ替える(複数album収録曲は最も人気が高いものを採用)
 ・まとめたデータを最後にcsv出力
してみる。
以下、コード。artist名を取るためのartistAPIと、楽曲の人気(popularity)データを取るためのtrackAPIを新たに使っている。

出力結果サンプル(id:3E5NLQpQbd0eJ18XO9zC0h)

単純に曲名でリストアップした場合に比べて、楽曲名がひとつ増えている。(同名の曲で、単独名義のものと、本人含む複数名義のものがあった)。

出力したcsvはこんな感じ(一部、2022年2月中旬取得分)。

なおalbumデータ内のalbum_typeは、artist_album APIで指定したalbum_typeとは一致しないので注意が必要。API指定のalbum_typeに対応するのはalbum_groupの方になっている。ややこしい。

また、上記の複数artistの確認部分で、少々まだるっこしい処理になっているのは、API利用回数を少しでも減らすため。短時間で大量にAPIを呼び出すと制限に引っかかる(公式の英語解説)。実際に試行錯誤する際には、取得データを適宜、データ保存して、それを呼び出すようにした方がいいようだ。

以上、Python ver3.10.2で確認。