Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python:Spotify Web API であるアーティストの全てのアルバムの全楽曲情報を取得する

市販楽曲の情報を入手する手軽な手段として、Spotify Web APIがあります。

以前の記事では、キーワードを入力して楽曲を検索していました。

www.wizard-notes.com

しかし、この方法だとあるアーティストの名前をキーワードとして与えても、そのアーティストの楽曲の情報を全ての取得することはできないようです。

また、他のアーティストの楽曲やカバー曲も引っかかってしまうため、検索効率がよくないです。

そこで、Spotify Web APIsearch() 以外のAPIを使って、あるアーティストの全てのアルバムの全楽曲情報を確実に取得する方法を探してみました。

方針

以下のような方針で検索します。

  1. sp = spotipy.Spotify()
  2. sp.search(type="artist")を使って,アーティスト名からアーティストIDを取得
  3. sp.artist_albums()を使って,アーティストIDから複数のアルバムIDを取得
  4. sp.album_tracks()を使って,各アルバムIDからトラック情報の配列tracksを取得
  5. tracks配列に格納されたトラック情報オブジェクトtrackにアクセス

スクリプト

# -*- coding: utf-8 -*-
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

client_id     = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
client_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(client_id=client_id,
                                                           client_secret=client_secret),
                                                           language='ja')

results_search = sp.search(q=artist, type="artist", limit=5, market=market)

artist_id   = results_search["artists"]["items"][0]["id"]
artist_name = results_search["artists"]["items"][0]["name"]
    
results_artist_albums = sp.artist_albums(artist_id, limit=50)
    
album_ids  = [album["id"]   for album in results_artist_albums["items"]]
album_list = [album for album in results_artist_albums["items"]]
    
data = []
for album_idx, album_id in enumerate(album_ids):
    tracks = sp.album_tracks(album_id, limit=50, market=market)["items"]
    for track in tracks:
        data.append(track["name"])

APIの返り値の例

各情報の取り出し方の参考として、アーティスト名を「米津玄師」として上記スクリプトで処理した時の、各APIの返り値の一部を掲載します。

sp.search(type="artist")["item"]

{'external_urls': {'spotify': 'https://open.spotify.com/artist/1snhtMLeb2DYoMOcVbb8iB'},
 'followers': {'href': None, 'total': 3061574},
 'genres': ['anime', 'j-pop'],
 'href': 'https://api.spotify.com/v1/artists/1snhtMLeb2DYoMOcVbb8iB',
 'id': '1snhtMLeb2DYoMOcVbb8iB',
 'images': [{'height': 640,
             'url': 'https://i.scdn.co/image/ab6761610000e5eb5b4225f4c907007170809d8a',
             'width': 640},
            {'height': 320,
             'url': 'https://i.scdn.co/image/ab676161000051745b4225f4c907007170809d8a',
             'width': 320},
            {'height': 160,
             'url': 'https://i.scdn.co/image/ab6761610000f1785b4225f4c907007170809d8a',
             'width': 160}],
 'name': '米津玄師',
 'popularity': 76,
 'type': 'artist',
 'uri': 'spotify:artist:1snhtMLeb2DYoMOcVbb8iB'}

sp.artist_album()["item"]

 {'album_group': 'album',
 'album_type': 'album',
 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/1snhtMLeb2DYoMOcVbb8iB'},
              'href': 'https://api.spotify.com/v1/artists/1snhtMLeb2DYoMOcVbb8iB',
              'id': '1snhtMLeb2DYoMOcVbb8iB',
              'name': '米津玄師',
              'type': 'artist',
              'uri': 'spotify:artist:1snhtMLeb2DYoMOcVbb8iB'}],
 'available_markets': ['AD', ... 'ZW'],
 'external_urls': {'spotify': 'https://open.spotify.com/album/0htxNVyVbhow8ESseUu5UV'},
 'href': 'https://api.spotify.com/v1/albums/0htxNVyVbhow8ESseUu5UV',
 'id': '0htxNVyVbhow8ESseUu5UV',
 'images': [{'height': 640,
             'url': 'https://i.scdn.co/image/ab67616d0000b273eb53782889e6f2e70a2634a3',
             'width': 640},
            {'height': 300,
             'url': 'https://i.scdn.co/image/ab67616d00001e02eb53782889e6f2e70a2634a3',
             'width': 300},
            {'height': 64,
             'url': 'https://i.scdn.co/image/ab67616d00004851eb53782889e6f2e70a2634a3',
             'width': 64}],
 'name': 'STRAY SHEEP',
 'release_date': '2020-08-05',
 'release_date_precision': 'day',
 'total_tracks': 15,
 'type': 'album',
 'uri': 'spotify:album:0htxNVyVbhow8ESseUu5UV'}

sp.album_tracks()["item"]

{'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/1snhtMLeb2DYoMOcVbb8iB'},
              'href': 'https://api.spotify.com/v1/artists/1snhtMLeb2DYoMOcVbb8iB',
              'id': '1snhtMLeb2DYoMOcVbb8iB',
              'name': '米津玄師',
              'type': 'artist',
              'uri': 'spotify:artist:1snhtMLeb2DYoMOcVbb8iB'}],
 'disc_number': 1,
 'duration_ms': 235720,
 'explicit': False,
 'external_urls': {'spotify': 'https://open.spotify.com/track/2K4aKCOfyN1JwMWUZJiwIX'},
 'href': 'https://api.spotify.com/v1/tracks/2K4aKCOfyN1JwMWUZJiwIX',
 'id': '2K4aKCOfyN1JwMWUZJiwIX',
 'is_local': False,
 'is_playable': True,
 'linked_from': {'external_urls': {'spotify': 'https://open.spotify.com/track/2WI2is2NtH0WTs7zfKNpcE'},
                 'href': 'https://api.spotify.com/v1/tracks/2WI2is2NtH0WTs7zfKNpcE',
                 'id': '2WI2is2NtH0WTs7zfKNpcE',
                 'type': 'track',
                 'uri': 'spotify:track:2WI2is2NtH0WTs7zfKNpcE'},
 'name': 'カムパネルラ',
 'preview_url': 'https://p.scdn.co/mp3-preview/dab31e22ded060b57c14214be0da2c5d98f46685?cid=b231f820fdb243f4aa71168aec1244a6',
 'track_number': 1,
 'type': 'track',
 'uri': 'spotify:track:2K4aKCOfyN1JwMWUZJiwIX'}
 ```