1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Spotify APIで完全ランダムなプレイリストを生成する(Python)

Last updated at Posted at 2022-07-08

背景

Spotifyでは, おすすめの曲や似た曲を永遠に聴くことができる.
しかし全く無関係な曲の羅列を聞く方法がないのかと思い立った.似た曲ばかりを勧めてくるSpotifyに少々嫌気がさしたためである.
標準のプレイリストでは,特定のシーンに一致する曲を集めたものはたくさんあるものの,完全にランダムに選んだ曲を集めたものは見当たらない.

参考

Webを検索すると,試みている記事がいくつか.コチラを参考にした.

APIのリファレンスとか

実装

  • 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)

後記

こうして生成されたランダムなプレイリストを聴いていても,特に楽しくない.ソースをいじっている時が一番楽しかった.むしろ,興味のない曲を聴いていても苦痛である.
ある程度のジャンルの制約や,シーンに合わせたプレイリスト,お気に入りの曲に合ったおすすめというのは必要だとわかった.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?