🐋

PythonでSpotify APIに入門する

2024/01/06に公開

こんにちは、学生エンジニアのMasamichiです。最近KPOPにハマっています。LE SSERAFIMの宮脇咲良が可愛すぎます。

さて、今回は音楽系のAPIで定番のSpotify APIをPythonのライブラリであるSpotipyを使って叩く方法を爆速で紹介します。

Spotify APIのSet Up

アプリを作成

Spotify for Developersへいき[Login > Dashboard]からCreate Appを選択して以下のように新規アプリを作成します。
Redirect URIはとりあえず何らかのURLを入れておけばOKです。特にアプリとの関係ありません。

SpotipyでSpotify APIの認証を通す

アプリを作成したら、settingsをクリックしてクライアント情報を取得します。プロジェクトを立ち上げて、main.pyファイルに以下の内容を追加します。

main.py
import spotipy
from spotipy.auth2 import SpotifyClientCredentials

#spotifyインスタンスを作成
sp = spotipy.Spotify(
    auth_manager=SpotifyClientCredentials(
        client_id="27d540****************cc540ab7", #Client ID
	client_secret="45a5*******************5213", #Client Secret
    )
)

実際に動かしてみる

検索するときは以下のように、検索結果を格納して取得したdictから欲しいデータだけを抽出します。(一つの曲オブジェクトだけでデータが膨大なのでなるべく取得する情報を絞ることを薦めします。)

曲を取得

main.py
results = sp.search(q="LE SSERAFIM", limit=5, type="track")
for track in results["tracks"]["items"]
    track_name = track["name"]
    print(track_name)

qはクエリでこれが検索のキーワードになります。limitは出力数、typeは検索する曲データの種類です。trackの他にplaylistpodcastなどがあります。以上のように引数を渡すとターミナルに次のようなoutputが出ます。

terminal
ANTIFRAGILE
Perfect Night
Eve, Psyche & The Bluebeard’s wife
UNFORGIVEN (feat. Nile Rodgers)
FEARLESS (2023 Ver.)

この他にも曲に関するいろいろなデータを取得できます。利用頻度の高いものを次に掲載します。

曲の〇〇を取得 コードブロック
曲名 track["name"]
アーティスト名 track["artists"][0]["name"]
収録アルバム track["album"]["name"]
曲ID track["id"]
ジャケ写 track["album"]["images"][0]["url"]

曲の音声情報を取得

Spotify APIでは曲自体の情報のほかに曲の音声に関する情報も取得できます。以下では例として曲のBPMの取得をしています。

main.py
results = sp.search(q="King Gnu", limit=5, type="track")
for track in results["tracks"]["items"]:
    name = track["name"]
    track_id = track["id"]
    track_info = sp.audio_features(track_id)
    bpm = track_info[0]["tempo"]
    print(f"{name} : {bpm}")

上記のコードを実行するとターミナルで以下のようなoutputが得られます。

terminal
SPECIALZ : 117.048
一途 : 159.971
逆夢 : 83.443
白日 : 93.029
SPECIALZ : 117.064

これを見ると「一途」はかなりハイテンポな曲であることがわかりますね。

Spotifyのサイト埋め込み(応用)

補足的な内容ですが、Spotifyは曲の埋め込みを作成できます。Web版のSpotifyへいき[任意の曲を選択 > 共有 > embed]選択します。

コードをコピーしてプロジェクト内に次のようなhtmlファイルを作成します。

template.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spotify埋め込みdemo</title>
</head>
<body>
    <iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/{{ track_id_0 }}?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
    <iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/{{ track_id_1 }}?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
    <iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/{{ track_id_2 }}?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
    <iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/{{ track_id_3 }}?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
    <iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/{{ track_id_4 }}?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>

</body>
</html>

{{ track_id }}にはPythonファイルから取得した曲のIDが代入されます。これは汎用ビューといいDjangoなどのフルスタックフレームワークでもよく利用させる方法なので覚えておいて損はないです。

先ほどのmain.pyファイルに以下のようなコードを追加してみます。

main.py
import jinja2

results = sp.search(q="aespa", limit=5, type='track')
for idx, track in enumerate(results['tracks']['items']):
    track_id = track['id']
    globals()[f"track_id_{idx}"] = track_id
        
    
with open('template.html') as file:
    template_content = file.read()

template = Template(template_content)

data = {
    "track_id_0": track_id_0,
    "track_id_1": track_id_1,
    "track_id_2": track_id_2,
    "track_id_3": track_id_3,
    "track_id_4": track_id_4
}

output_html = template.render(data)

with open('output.html', 'w') as file:
    file.write(output_html)

このファイルを実行して、作成されたoutput.htmlを確認すると、画像のように検索結果で出た曲の埋め込みが作成されました。

終わりに

今回は、Pythonのライブラリ「Spotipy」を使用してSpotify APIを動かす方法を解説しました。Spotifyは他の音楽APIに比べてリクエスト制限が緩く、ほぼ全ての機能が無料で使えるため個人開発やハッカソンなどでぜひ活用してみて下さい!

Discussion