PythonでSpotify APIから曲をプレイリストに追加する(spotipy)

音楽プレーヤーをプログラムからいろいろいじれたら面白いなと思っていたのですが、最近、spotifyAPIを提供しているということを知ったのでやってみました。 GitHubにサンプルコードもいくつかあってやりやすいです。

spotipy/examples at master · plamere/spotipy · GitHub

流れ

  1. Spotifyにアプリ登録申請をしてIDとかをゲットする
  2. プレイリストを作成する
  3. 曲を検索してIDをゲットする
  4. 作成したプレイリストに曲を追加する

環境など

ちなみに私はSpotifyの月額課金していて、以下の内容がフリープランでもできるかは試せていません。。。

準備

mac用のデスクトップアプリをダウンロード

ここからダウンロードできます。 確認するときとかに便利。

アプリを登録

  1. 開発者用のページにアクセス
  2. ページ上部の[MyApp]→[CREATE AN APP]

    こんな感じで入力。

    1. Application Name: MyFirstApp
    2. Aplication Description: MyFirstApp
  3. 作成できたら[Client ID]とかが表示されているページに移るので以下を入力。

    1. 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

SpotifyPython 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を押す。 f:id:ykarakita:20170702114728p:plain:w300

  • そうするとリダイレクトされるのでリダイレクト先の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が返ってくる。

デスクトップアプリから確認すると追加されている。

f:id:ykarakita:20170702122111p:plain:w600

まとめ

夢が広がりング。

参考

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

まとめ

もう夏ですね。

参考