背景
Spotifyでは, おすすめの曲や似た曲を永遠に聴くことができる.
しかし全く無関係な曲の羅列を聞く方法がないのかと思い立った.似た曲ばかりを勧めてくるSpotifyに少々嫌気がさしたためである.
標準のプレイリストでは,特定のシーンに一致する曲を集めたものはたくさんあるものの,完全にランダムに選んだ曲を集めたものは見当たらない.
参考
Webを検索すると,試みている記事がいくつか.コチラを参考にした.
-
Pythonを用いてSpotifyのプレイリストを作成&再生してみる
- このPython側の準備をやっておく.
-
Getting random tracks using the Spotify API.
- こちらの記事と同様,ジャンルをランダムで選んで・・・というのを最初考えたが,完全ランダムにはならないらしい.そこでこの記事のように,searchを使うことにしたのだが,この通りにやると[a-z]が入った曲しか引っかからないのでは,ということで,以下のようにした.
APIのリファレンスとか
- https://developer.spotify.com/documentation/web-api/reference/#/operations/search
- https://spotipy.readthedocs.io/en/master/?highlight=genres
実装
- python3.Xで動作確認済み
main.py
# 2022/07/08 v1.0
import spotipy
import spotipy.util as util
import sys
import random
import subprocess
import requests
import json
import string
# 検索キーワードを生成
def getRandomSearch():
rand_char=''
randlst='A'
while rand_char=='':
# [1]と[2]の確率を設定
if random.randint(0, 3) == 0:
# [1] A-Z,0-9から選ぶ
randlst = [random.choice(string.ascii_letters + string.digits) for i in range(1)]
rand_char=''.join(randlst)
else:
# [2] A-Z,0-9だとタイ語や日本語のみの曲が引っかからないので,文字全体から選ぶ
randlst=random.randint(0, 1114111)
rand_char=chr(randlst)
randomSearch = ''
# %はワイルドカード
if random.randint(0, 1) == 0:
randomSearch = rand_char + '%'
else:
randomSearch = '%' + rand_char + '%'
return randomSearch
# ****** main ******
# ******************
username = "XXXXXXXXXXXXXX"
scope = 'playlist-read-private,playlist-modify-public'
token = util.prompt_for_user_token(username, scope)
sp = spotipy.Spotify(auth=token)
header = {'Authorization': 'Bearer {}'.format(token)}
# プレイリストを作成する場合はコメントイン
# playlist = sp.user_playlist_create(username,"NewPlaylist")
# playlist_id = playlist['id']
# 既存のプレイリストIDを指定
playlist_id = 'XXXXXXXXXXXXXXX'
# 国コード一覧を取得
country_codes = sp.country_codes
# 国コードの総数
country_num = len(country_codes)
track_ids = []
# 100曲追加
while len(track_ids) < 100:
# 国コード一覧の中からランダムで一つ選ぶ
random_market = country_codes[random.randint(0, country_num - 1)]
# 検索クエリ
query = getRandomSearch()
# オフセット値の最大は999
randomOffset = random.randint(0, 999)
#検索を実行し1曲取得
results = sp.search(type = 'track', offset = randomOffset, limit = 1, q = query, market = [random_market])
if results is None:
print('NoneType')
else:
# 曲を取得できた場合
if len(results['tracks']['items']) >= 1:
# idを格納
track_ids.append((results['tracks']['items'][0]['id']))
print(results)
else:
print('No Results...')
print(len(track_ids))
# プレイリストに追加
sp.user_playlist_add_tracks(username, playlist_id, track_ids)
後記
こうして生成されたランダムなプレイリストを聴いていても,特に楽しくない.ソースをいじっている時が一番楽しかった.むしろ,興味のない曲を聴いていても苦痛である.
ある程度のジャンルの制約や,シーンに合わせたプレイリスト,お気に入りの曲に合ったおすすめというのは必要だとわかった.