せかいの世界(備忘録)

音楽・ITに関する色々なものを触ってみたり、競プロの記録を残したりします。

Pythonを用いてSpotifyのプレイリストを作成&再生してみる

今回は、PythonからSpotifyAPIを叩いてみます。 まず前提条件として、SpotifyのPremium会員への登録が必要です。

実行環境

Python 3.7.0

Cliend IDの取得

My Dashboard | Spotify for Developersへアクセスします。Create An APPから必要な情報を入力すると以下のページにアクセスできます。  

「Show Client Secret」をクリックし、Cliend IDとClient Sercretをメモします。
また、「Edit Setting」ボタンからRedirect URIs にhttp://example.comを追加し、「Save」ボタンを押して保存しておきます。 f:id:tori114:20181014073045p:plain

Python側の準備

今回は、Spotipyと呼ばれるライブラリを用いてアーティストの検索などを行なっていきます。 まずは、
pip install spotipy
でspotipyをインストールします。 名前がややこしいので注意してください。

次に、環境変数SpotifyのClient ID、Client Secret、Redirect URIを登録します。 今回はbash_profileに記述しておきます。

$ vi ~/.bash_profile
export SPOTIPY_CLIENT_ID='XXXX'
export SPOTIPY_CLIENT_SECRET='XXXX'
export SPOTIPY_REDIRECT_URI='http://example.com'

プレイリストの自動生成と再生

では実際にプログラムの方に入っていきます。 今回の大まかな仕様は以下の通りです。
1. 自分の好みのアーティストを一人選択する。
2. artist_related_artistsを用いて、選択したアーティストと関連性の高いアーティスト群を抽出する。
3. 関連アーティスト群からそれぞれ1曲1ずつランダムに選択し、プレイリストを作成する。
4. Spotifyと連携しているデバイスで再生する。

Spotidyと連携できるデバイスとして、個人的にはSONOS ONEがオススメです。 ワイヤレススピーカーなので部屋のどこにでも置けるのが魅力的。 音質も良く、セットアップも簡単、さらに最近IFTTT対応したというのがポイントですね。 次回は、このプログラムをIFTTT経由で動かしてみたいところ。

Sonos One スマートスピーカー Amazon Alexa搭載 ブラック

Sonos One スマートスピーカー Amazon Alexa搭載 ブラック

プログラムと実行

実行コマンドは以下の通りです。
python main.py [アーティスト名]
実行すると初回のみ Enter the URL you were redirected to: と聞かれ、ブラウザでRedirectURIが開かれます。 URLをコピーし、そのままターミナルに貼り付ければOKです。

Point

  • バイス情報と楽曲の再生はrequestsを用いて直接HTTPリクエストを送っています。spotipyから呼び出す関数が見当たりませんでした。(よくよく探せばあるのかもしれません。)

  • device_id = devices["devices"][0]['id']の部分で、0番目のデバイスIDを取得しています。Spotifyと連携しているデバイスを複数お持ちの人は、数字を変えて自分が再生したいデバイスを選択して下さい。

  • usernameは自身のユーザー名に置き換えてください。確認方法は色々あると思いますが、自分はiPhoneSpotifyアプリから 「My Library > 右上の歯車 > アカウント 」で確認しました。

import spotipy
import spotipy.util as util
import sys
import random
import subprocess
import requests
import json
username = "XXXX"
scope = 'user-read-playback-state,playlist-read-private,user-modify-playback-state,playlist-modify-public'
search_str = sys.argv[1]

artist_id_map={}
token = util.prompt_for_user_token(username, scope)

sp = spotipy.Spotify(auth=token)
header = {'Authorization': 'Bearer {}'.format(token)}


res = requests.get("https://api.spotify.com/v1/me/player/devices", headers=header)
devices = res.json()
device_id = devices["devices"][0]['id']

playlist = sp.user_playlist_create(username,"NewPlaylist")
playlist_id = playlist['id']

result = sp.search(q='artist:'+search_str, limit=1)
artist_id = result['tracks']['items'][0]['artists'][0]['id']
print (result['tracks']['items'][0]['id'])
artist_related_artists = sp.artist_related_artists(artist_id)
track_ids = []
for artist_list in artist_related_artists['artists']:
    result = sp.search(q='artist:'+artist_list['name'], limit=50)

    if len(result['tracks']['items']) > 1:
        track_ids.append(random.choice(result['tracks']['items'])['id'])

sp.user_playlist_add_tracks(username, playlist_id, track_ids)

param = {'device_id':device_id,
         'context_uri':'spotify:playlist:%s' % playlist_id}

res = requests.put("https://api.spotify.com/v1/me/player/play", data=json.dumps(param), headers = header)

まとめ

今回、Pythonを用いてSpotifyAPIを叩いてみました。 途中手こずる場面もありましたが、無事Playlistの自動生成と指定したデバイスで再生できるようになりました。
次回は、このIFTTTと呼ばれるWebサービスと連携させてみようと思います。

参考

Documentation | Spotify for Developers
Welcome to Spotipy! — spotipy 2.0 documentation