PythonでSpotify APIから曲をプレイリストに追加する(spotipy)
音楽プレーヤーをプログラムからいろいろいじれたら面白いなと思っていたのですが、最近、spotifyがAPIを提供しているということを知ったのでやってみました。 GitHubにサンプルコードもいくつかあってやりやすいです。
spotipy/examples at master · plamere/spotipy · GitHub
流れ
- Spotifyにアプリ登録申請をしてIDとかをゲットする
- プレイリストを作成する
- 曲を検索してIDをゲットする
- 作成したプレイリストに曲を追加する
環境など
ちなみに私はSpotifyの月額課金していて、以下の内容がフリープランでもできるかは試せていません。。。
準備
mac用のデスクトップアプリをダウンロード
ここからダウンロードできます。 確認するときとかに便利。
アプリを登録
- 開発者用のページにアクセス
ページ上部の[MyApp]→[CREATE AN APP]
こんな感じで入力。
- Application Name: MyFirstApp
- Aplication Description: MyFirstApp
作成できたら[Client ID]とかが表示されているページに移るので以下を入力。
- Redirect URI: http://127.0.0.1:8080/
Redirect URIsは間違えないようにする あとは空欄でOK。入力したらADDしてSAVE。
アプリケーションサーバに環境変数を登録
bash_profile
とかに書いておく
$ vi ~/.bash_profile export SPOTIPY_CLIENT_ID='[登録したspotifyアプリのClient ID]' export SPOTIPY_CLIENT_SECRET='[登録したspotifyアプリの[Client Secret]' export SPOTIPY_REDIRECT_URI='http://127.0.0.1:8080/'
環境変数を読み込む
$ source ~/.bash_profile
SpotifyのPython SDKをインストール
$ pip install spotipy
トークン発行/更新モジュールを作成
作業ディレクトリを作成
$ mkdir spotify_handson $ cd spotify_handson
# spotify_token.py import spotipy import spotipy.util as util class Spotify_token: def __init__(self, username): self.username = username self.scope = 'playlist-modify-public' def set(self): token = util.prompt_for_user_token(self.username, self.scope) return token
プレイリストを作成
sampleコードを参考に作成しました。
$ vi create_playlist.py
# create_playlist.py # Creates a playlist for a user import sys import pprint import spotipy from spotify_token import Spotify_token # usage # $ python create_playlist.py [username] [playlist_name] username = sys.argv[1] playlist_name = sys.argv[2] ST = Spotify_token(username) token = ST.set() sp = spotipy.Spotify(auth=token) sp.trace = False playlists = sp.user_playlist_create(username, playlist_name) pprint.pprint(playlists)
実行
$ python create_playlist.py [username] MyFavorite
初回だけブラウザにこんな画面が表示されるのでOKを押す。
そうするとリダイレクトされるのでリダイレクト先の
http://127.0.0.1:8080/?code=
から始まるURLをまるっとコピーする。ターミナルに戻って
Enter the URL you were redirected to:
のあとにコピーしたURLをペーストしてEnterする成功するとプレイリストが作成され、結果が出力されるので
id
をメモっておく。spotifyアプリでプレイリストが作成されたか確認するとわかりやすい。もしかしたらアプリへの反映までのラグがあるかも。
実行したディレクトリに
.cache-[username]
というファイル名ができていて、これ以降はこのファイル内の情報を使って勝手にアクセストークン更新とかもやってくれる。
曲のIDを検索
プレイリストに追加するには曲ごとにつけられたユニークなIDを指定する必要があるので、曲名とかアーティスト名などのキーワードで検索する。
sampleコードを参考に作成しました。
# search.py # shows artist info for a URN or URL import spotipy import sys import pprint from spotify_token import Spotify_token # usage # $ python search.py [ Keyword you want to search ] username = sys.argv[1] search_str = sys.argv[2] ST = Spotify_token(username) token = ST.set() sp = spotipy.Spotify(auth=token) result = sp.search(search_str, limit=10) for item in result['tracks']['items']: print(item['name']) print(item['id']) print('')
ここでは検索結果出力を10件に絞っています。検索するキーワードはアーティスト名でも曲名でもOK。
$ python search.py [username] 岡崎体育
曲名とその曲のIDが表示される
曲をプレイリストに追加
取得したプレイリストIDとトラックIDをもとに、曲を追加します。
# add_tracks_to_playlist.py import pprint import sys import spotipy import spotipy.util as util from spotify_token import Spotify_token if len(sys.argv) > 3: username = sys.argv[1] playlist_id = sys.argv[2] track_ids = sys.argv[3:] else: print("Usage: %s username playlist_id track_id ..." % (sys.argv[0],)) sys.exit() ST = Spotify_token(username) token = ST.set() if token: sp = spotipy.Spotify(auth=token) sp.trace = False results = sp.user_playlist_add_tracks(username, playlist_id, track_ids) print(results) else: print("Can't get token for", username)
$ python add_tracks_to_playlist.py [username] [playlist_id] [track_id]
snapshot_idが返ってくる。
デスクトップアプリから確認すると追加されている。
まとめ
夢が広がりング。
参考
macOSで撮ったスクリーンショットを日付フォルダへ自動で振り分ける
とにかくフォルダが整理されていないと気が済まないのであります。
ではやっていきます。
スクリーンショットの保存場所を変更する
保存場所を作成
$ mkdir ~/Pictures/ScreenShots
保存場所の変更
$ defaults write com.apple.screencapture location ~/Pictures/ScreenShots
SystemUIServerを再起動
$ killall SystemUIServer
これで/Users/[ユーザー名]/Picutures/Screenshots
内にスクリーンショットが保存されるようになる。
Automatorで自動振り分け設定をする
設定の流れについてはこちらの記事に書いてあるとおりなので省略します。
Automatorに設定するスクリプトを以下のものにしてください。 (ユーザー名の部分を変えること)
IFS=$'\n' ssdir=/Users/[ユーザー名]/Pictures/ScreenShots today=$(date +"%Y%m%d") for f in "$@" do if [ -f $f ]; then if [ ! -d $ssdir/$today ]; then mkdir $ssdir/$today fi mv $f $ssdir/$today fi done
ScreenShotsフォルダにファイルが追加されたら日付フォルダに移動します。 日付フォルダが存在していなければ作成します。
下記のような感じになるようにしています。
/Users/[ユーザー名]/Pictures/ScreenShots/20170605/スクリーンショット 2017-06-05 21.03.51.png
まとめ
もう夏ですね。