SpotifyAIPを使って指定した時間のプレイリストを制作した話

どうも、もくなな(@mo9nana)です。少し前にSpotifyAPIを触ったので記録しておこうと思います。なんでいまさらになってブログ更新し始めたかというとクリスマスでやることがなくなったからです。(現在12月25日)これ以上言いたくありません。察してください。クリスマスぼっちやんとか思った人は正直に挙手してください。殴り込みに行きます。

目的

課題するためにPCつけたのにyoutube見てたら提出期限切れになってた

PCで作業しているとついつい別の作業してしまいますよね。こういう別の作業ってだらだら時間消費しちゃいません?そーいうときに自分はタイマー機能をよく使います。夏場は扇風機のタイマーを30分にして扇風機が動いている間だけyoutube見る….なんてことしてたのですが、扇風機の季節が終わってしまいました。そこで扇風機に代わるタイマー機能がSoptifyのプレイリストであったらな…ということで作ってきました。理由はめちゃしょうもないですが、APIを初めて使ったのでいろいろ勉強になったと感じています。

Spotify for Developersに登録

まずSpotify for Developersに登録してSoptifiAPIを使えるようにします。これを登録しないと何も始まりません。Spotifyのアカウントを所有している人ならだれでも登録できます。

APPを制作する

Spotify for Developersのダッシュボードのページに飛びます。下の方にLOGINと書かれている緑色のボタンがあるのでそこをクリックし、Spotifyのアカウントでログインします。すると、下記のような画面になるので右上のCREATE AN APPをクリックしApp nameとApp descriptionを入力し、下のチェックボックスに印をつけます。ただの名前なので自分の好きな文で大丈夫です。入力し終えたら、右下のCreateをクリックしAPPを制作します。

Redirect URIsの登録と必要項目の確認

先ほど制作したAPPが左側に登録されたので、クリックしてAPPの画面に移動します。右上のEDIT SETTONGSをクリックすると、各種設定項目が表示されるので、その中のRedirect URIs

http://example.com

を入力し、右側のADDをクリックし追加します。追加後、スクロールして左下のSaveを選択し保存します。
また、画面左側のClient IDとClient Secretは後から使うので、メモ帳か何かに保存しておくと便利です。Client Secretは、SHOW CLIENT SECRET をクリックすると表示されます。

プログラム

なんやかんやできたコードが以下になります。内容は結構シンプルです。
こちらからダウンロードできます

import spotipy
import spotipy.util as util
import random

#認証設定
username = '____your_username____'
my_id = '____your_ClientID____'
my_secret = '____your_ClientSecret____'
redirect_uri = '____your_Redirect_URI____'

#権限付与
scope = 'user-library-read user-read-playback-state playlist-read-private user-read-recently-played playlist-read-collaborative playlist-modify-public playlist-modify-private'
#認証
token = util.prompt_for_user_token(username, scope, my_id, my_secret, redirect_uri)
spotify = spotipy.Spotify(auth = token)

def creat_play_list(list_name = 'apiプレイリスト'):
    spotify.user_playlist_create(username, list_name)
    list_data = spotify.user_playlists(username)
    for i in range(list_data['total']):
        play_list_name = list_data['items'][i]['name']
        if play_list_name == list_name:
            url = list_data['items'][i]['external_urls']['spotify']
        else:
            pass
    return(url)

def track_info(limit = 50):
    track_urls = []
    track_times = []
    offset = 0
    saved_tracks = spotify.current_user_saved_tracks(limit = limit, offset = offset)
    total = saved_tracks['total']
    while True:
        if (total > 50):
            set = 50
            total = total -50
        else:
            set = total
        saved_tracks = spotify.current_user_saved_tracks(limit = limit, offset = offset)
        for i in range(set):
            track_url = saved_tracks['items'][i]['track']['external_urls']['spotify']
            track_urls.append(track_url)
            track_time = saved_tracks['items'][i]['track']['duration_ms']
            track_times.append(track_time)
        if saved_tracks['next'] is not None:
            offset += 50
        else:
            break
    track = list(zip(track_urls,track_times))
    return (track)

list_time = float(input("制作したいプレイリストの時間入力してください(分):"))

track = track_info()
random.shuffle(track)
now_time = 0
ans = 0
just_list = []
for i in range(len(track)):
    if ans < list_time:
        now_time = track[i][1]
        ans += now_time/60000
        just_list.append(track[i][0])

num = random.randrange(1, 9999)
playlist_url = creat_play_list(str(int(list_time)) + '分_#' + str(num))
spotify.user_playlist_add_tracks(username, playlist_url,just_list)

環境

以下自分の環境です。spotipyはpipでインストールしてください。

  • Windows11 / 10
  • Python 3.9.1
  • spotipy 2.19.0

コード解説

認証関連

APIを使用するために必要になってくる認証関連は5~15行目で設定しています。色々なサイトを見ながら書いたのでいまいち理解していないところもありまs((殴

認証設定と書いているところに先ほど取得した情報を記述します。redirect_uriにはhttp://example.comを書いてください。文字型で記述する為 ’’ で囲います。

scopeで今回のコードで必要な権限を記述しています。一覧はこちらの公式サイトにあります。

creat_play_list関数

プレイリストを制作し、制作したプレイリストのurlを返してくれる関数です。

最初の1行でプレイリストを制作し、2行目で現在のプレイリスト一覧を取得しています。その後、for文で制作したプレイリストと同じ名前のプレイリストを探し出し、そのurlを返却しています。

同じ名前のプレイリストがあった場合、最初に見つかったほうのurlが返却されてしまう為、制作時に4桁のランダムな数字を名前の最後につけています。これでバクる確率は1/10000、0.0001%です。一万回に一回は動かなくなります。自分の小さな頭じゃこれが精一杯でした。誰か良い案ください((

track_info関数

お気に入りの曲に登録されている曲urlと曲の時間を二次元配列て返してくれる関数です。
一度に50曲までしか取得できないのでwhile分の無限ループで複数回取得しています。

お気に入り登録されている曲のいろいろな情報をjsonで返してくれるので必要な情報だけを取得します。

今回はurlと時間を使用しましたが、カバー画像やどの国で配信されているかなんて情報も取得できます。sputifyしゅごい…

残りのコード(53行目以降)

上2つの関数を作ってしまえば指定した時間になるようにリストに曲をほり込むだけです。

53行目で時間を指定し、56行目でtrack_infoで取得してきたリストをシャッフルしています。60行目のfor文でシャッフルされたリストを上から指定時間になるまでのリストを作り、68行目でプレイリストに追加しています。

おわり

本当はお気に入りの曲じゃなくておすすめの曲でしたかったんだけど、おすすめの曲のAPIが見つからなかった…
なにかあれば連絡ください。

Twitter:@mo9nana

コメント

タイトルとURLをコピーしました