追記(2025/10/22)
APIの仕様変更により、おすすめのプレイリストの取得ができなくなりました。
昔はこんなことできたんだな的な感覚で見てください。
※この記事は非公開状態で作成され、作成日は2024/08/16です。
公開日は2025/10/23となっています。
はじめに
自分は学生で、今回記事を初めて書きます。またプログラミングは初心者の為、コードが汚かったり、わかりにくかったりする部分があるかもしれませんがご了承ください。
背景
Spotify APIを使用してデータ分析をした経験を用いて、好きな曲を入力したらおすすめの曲を取得しそのプレイリストを自動で作成するプログラムが作成できるのではないかと考えました。
また調べた時に日本語の記事がなかったので、今回の作成に至りました。
環境
エディタはVScodeで、使用言語はPython3.9を用いて実行しています。
使用したライブラリは以下の通りです。
- spotipy
- sys
事前準備
Spotify for Developerの登録、Spotifyのアカウントを持っていることが必須になります。
Spotify for Developerの登録について以下の記事が参考になります。
内部パラメータなどについても詳しく解説されています。
ソースコードの解説
インポート
import spotipy
import sys
from spotipy.oauth2 import SpotifyOAuth
spotipyとsysのライブラリを取得しています。
自分のSpotifyにアクセスするのでSpotifyOAuthを使用します。
Spotify認証
# Spotify API認証
my_id = '設定したID'
secret_key = '設定したkey'
redirect_uri='設定したURL'
# SpotifyOAuthを使用して認証を行い、spotipy.Spotifyのインスタンス作成
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id=my_id, client_secret=secret_key, redirect_uri=redirect_uri, scope='playlist-modify-public'))
ここでSpotify for Developerで登録したID、Client ID、Redirect URIを入力します。
scopeにはplaylist-modify-publicを入力します。これは公開プレイリストの作成、変更、曲の追加を行うことができます。
取得した曲を表示する関数
# 取得した曲を表示する関数
def shutoku():
count = 0
# プレイリストのトラック情報を取得 (favorite_idリスト内のすべてのIDに対して処理)
for track_id in favorite_id:
count += 1
# Spotify APIからトラック情報を取得
track_info = sp.track(track_id)
print(f"{str(count)}曲目: {track_info['name']:30}, アーティスト: {track_info['artists'][0]['name']:15}")
実行した際に好きな曲のidを入力するのですが、その際に曲がちゃんとあっているかターミナル上で確認するための関数になります。
好きな曲の取得
# 宣言
i = 0
favorite_id = []
# 楽曲の入力
while True:
# プレイリストのIDを指定
track_id = input(f"{i+1}曲目のIDを入力してください (終了するには 'end' と入力): ") # 例: プレイリストID
# "end" が入力された場合
if track_id == 'end':
print(f'\n→{i}曲を読み込みました\n')
break
# IDをリストに追加
favorite_id.append(track_id)
# 曲数を増やす
i += 1
# 取得した曲を表示
shutoku()
ここでは好きな曲のidを入力し、それをfavorite_id配列に格納していくコードです。
その後先ほど定義した。shutoku関数で曲があっているか確認ができます。
※注意点として好きな曲は5曲までしか入力できません。
曲があっているかの確認
# 間違いがないか確認
kakunin = input("\n間違いはありませんか(ないなら'yes'を入力。違うならnoを入力):")
# 違うならプログラムを終了する
if kakunin != 'yes':
print("\n間違いがあったためプログラムを終了します")
sys.exit()
print('\n処理をしています、、\n')
コードを見た際に、これはいらないと感じた人もいるかと思います。
しかし、この部分がないと好きな曲のidが間違っていた際に、間違ったプレイリストが自動的に作成されます。それを防止するためです。
おすすめの曲の取得
# 類似した曲を取得して表示する関数
def get_recommendations_from_seed(track_ids, limit=50):
# 最大5つのシードトラックを使っておすすめを取得
seed_tracks = track_ids[:5] # 最大5曲まで
#おすすめの曲を取得
results = sp.recommendations(seed_tracks=seed_tracks, limit=limit)
recommendations = []
count = 1
for track in results['tracks']:
recommendations.append(track['id'])
print(f"おすすめの曲{count:2}: {track['name']:50} , アーティスト {track['artists'][0]['name']}")
count+=1
return recommendations
# 類似した曲を取得
recommended_tracks = get_recommendations_from_seed(favorite_id, limit=50)
まずおすすめの曲を取得して表示する関数を作成します。
先述したように、好きな曲は5曲までしか入力できないのでまず5曲のみ取得し、それをもとにSpotipyライブラリのrecommendationsメソッドを呼び出しおすすめの曲を取得します。
その後recommendations配列にidを追加していきそれがこの関数の戻り値になり、ターミナル上に取得した曲を表示します。
limitの数を変えることでプレイリストの曲数を変えることができます。最大100曲までできるそうです。
Spotify上にプレイリストを作成
# プレイリストを作成
user_id = sp.current_user()['id']
playlist_name = 'おすすめの曲'
playlist = sp.user_playlist_create(user=user_id, name=playlist_name, public=True)
playlist_id = playlist['id']
# プレイリストに曲を追加
sp.user_playlist_add_tracks(user=user_id, playlist_id=playlist_id, tracks=recommended_tracks)
print(f"\nプレイリスト '{playlist_name}' が作成され、{len(recommended_tracks)} 曲が追加されました。")
初めに現在ログインしているユーザーのidを取得します。user_idはプレイリストの作成や曲の追加に必要です。
次にsp.user_playlist_createは新しいプレイリストを作成するメソッドです。
publicはTrueだと公開プレイリストになります。
作成されたプレイリスト情報がplaylistに格納され、その中のidを使ってプレイリストのid(playlist_id)を取得します。プレイリストに曲を追加する際にこのidを使用します。
その後sp.user_playlist_add_tracksを使いプレイリストに曲を追加します。
コード全体
import spotipy
import sys
from spotipy.oauth2 import SpotifyOAuth
# Spotify API認証
my_id = '設定したID'
secret_key = '設定したkey'
redirect_uri='設定したURL'
# SpotifyOAuthを使用して認証を行い、spotipy.Spotifyのインスタンス作成
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id=my_id, client_secret=secret_key, redirect_uri=redirect_uri, scope='playlist-modify-public'))
# 取得した曲を表示する関数
def shutoku():
count = 0
# プレイリストのトラック情報を取得 (favorite_idリスト内のすべてのIDに対して処理)
for track_id in favorite_id:
count += 1
# Spotify APIからトラック情報を取得
track_info = sp.track(track_id)
print(f"{str(count)}曲目: {track_info['name']:30}, アーティスト: {track_info['artists'][0]['name']:15}")
# 宣言
i = 0
favorite_id = []
# 楽曲の入力
while True:
# プレイリストのIDを指定
track_id = input(f"{i+1}曲目のIDを入力してください (終了するには 'end' と入力): ") # 例: プレイリストID
# "end" が入力された場合
if track_id == 'end':
print(f'\n→{i}曲を読み込みました\n')
break
# IDをリストに追加
favorite_id.append(track_id)
# 曲数を増やす
i += 1
# 取得した曲を表示
shutoku()
# 間違いがないか確認
kakunin = input("\n間違いはありませんか(ないなら'yes'を入力。違うならnoを入力):")
# 違うならプログラムを終了する
if kakunin != 'yes':
print("\n間違いがあったためプログラムを終了します")
sys.exit()
print('\n処理をしています、、\n')
# 類似した曲を取得して表示する関数
def get_recommendations_from_seed(track_ids, limit=50):
# 最大5つのシードトラックを使っておすすめを取得
seed_tracks = track_ids[:5] # 最大5曲まで
#おすすめの曲を取得
results = sp.recommendations(seed_tracks=seed_tracks, limit=limit)
recommendations = []
count = 1
for track in results['tracks']:
recommendations.append(track['id'])
print(f"おすすめの曲{count:2}: {track['name']:50} , アーティスト {track['artists'][0]['name']}")
count+=1
return recommendations
# 類似した曲を取得
recommended_tracks = get_recommendations_from_seed(favorite_id, limit=50)
# プレイリストを作成
user_id = sp.current_user()['id']
playlist_name = 'おすすめの曲'
playlist = sp.user_playlist_create(user=user_id, name=playlist_name, public=True)
playlist_id = playlist['id']
# プレイリストに曲を追加
sp.user_playlist_add_tracks(user=user_id, playlist_id=playlist_id, tracks=recommended_tracks)
print(f"\nプレイリスト '{playlist_name}' が作成され、{len(recommended_tracks)} 曲が追加されました。")
コードを動かす際の注意点
- Spotify for Developerの登録が必須で、そのID、SecretKey、RedirectURLをコード内に入力してください。
- 好きな曲は5曲まででその曲のidを入力してください。(idの調べ方については割愛させていただきます)
- Spotify上にプレイリストを作成するので、当たり前ですがSpotifyのアカウントも必要になります。
まとめ
Spotify APIを用いて好きな曲からおすすめの曲のプレイリストを作成することができました。
初めはパラメータの平均をとってそこから取得したらできるのかなとか考えていましたが、おすすめの曲を取得するメソッドがあったので簡単に実装できました。
情報をcsvファイルに保存して自分の好きな曲や、世の中で流行っている曲をグラフ化してみると面白いのではと思いました。
今後も音楽について様々な分析をしてみようと思います。