kimagre inrash

感想を書きます

Spotifyのマイライブラリをエクスポートしよう(Python)

time 2021/09/22

AmazonMusicからSpotifyに移行したばかりですが、
移行できてない数曲を調べたいのと今後のためにエクスポートテストしておくことにしました。

いつも通りここからは自己責任で。

SpotifyのアカウントはあるのでAPIを使えるようにするために開発者登録。
https://developer.spotify.com/dashboard/login

ざっくり登録して
CLIENT_ID と CLIENT_SECRET を入手。

基本的な手順はここに書かれている通り。
サーバーを立てるというのがメンドくさいなあ・・て思ってたけど、それくらいしか方法がない感じ。
https://developer.spotify.com/documentation/web-api/quick-start/

ローカルサーバーを立てる

https://nodejs.org/ja/
node.js をインストール。

https://github.com/spotify/web-api-auth-examples
をgit clone。

git cloneした authorization_code をプロジェクトにコピー。
さらにルートにある package.json をプロジェクトの authorization_code の中にコピー。

package.json があるフォルダに移動して

$ npm install

これで必要なモジュールがインストールされる。

次に app.js 内の以下を変更する。

var client_id = 'CLIENT_ID'; // Your client id
var client_secret = 'CLIENT_SECRET'; // Your secret
var redirect_uri = 'REDIRECT_URI'; // Your redirect uri

CLIENT_ID、CLIENT_SECRET は Spotify Developer で確認できる。
REDIRECT_URI は http://localhost:8888/callback に設定。

次に Spotify Developer のアプリ側も設定が必要。
https://developer.spotify.com/dashboard/applications
アプリケーション -> EDIT SETTINGS から Redirect URIs に以下を追加。

  • http://localhost:8888
  • http://localhost:8888/callback
$ node app.js

これでサーバーが起動する。

認証

プロジェクトに api-authorization.py を作成して認証を通す。
USER_NAMEの部分が引っかかりやすい。(プロフィール画面に表示されるランダムな文字列を指定)

$ python api-authorization.py
# -*- coding: utf-8 -*-

import spotipy
import spotipy.util as util

USER_NAME = '123456789' # アカウント情報のランダムな文字列
CLIENT_ID = 'XXXXXXXXXXXXXXXX'
CLIENT_SECRET = 'YYYYYYYYYYYYYYYY'
REFIRECT_URI = 'http://localhost:8888/callback'
SCOPE = 'user-library-read' # 必要なスコープ設定

token = util.prompt_for_user_token(
    USER_NAME,
    scope=SCOPE,
    client_id=CLIENT_ID,
    client_secret=CLIENT_SECRET, 
    redirect_uri=REFIRECT_URI) 

sp = spotipy.Spotify(auth=token)
print('ok')

ブラウザが立ち上がって認証画面となる。
同意すると「Authentication status: successful」と表示が出る。
api-authorization.py を実行したフォルダに .cache-XXXXXXXX ファイルが出来ていて
これがあれば認証が必要なAPIは使えるように。

サーバーはCTRL+Cで停止してOK。

リスト取得

プロジェクトに api-mysongs.py を作成してリストアップ。

$ python api-mysongs.py
# -*- coding: utf-8 -*-

import spotipy
import spotipy.util as util

USER_NAME = '123456789' # アカウント情報のランダムな文字列
CLIENT_ID = 'XXXXXXXXXXXXXXXX'
CLIENT_SECRET = 'YYYYYYYYYYYYYYYY'
REFIRECT_URI = 'http://localhost:8888'
SCOPE = 'user-library-read' # 必要なスコープ設定

if __name__ == "__main__":
    # トークン発行
    token = util.prompt_for_user_token(
        user_name=USER_NAME,
        scope=SCOPE,
        client_id=CLIENT_ID,
        client_secret=CLIENT_SECRET,
        redirect_uri=REFIRECT_URI)

    sp = spotipy.Spotify(auth=token)

    # APIオプション
    limit = 50
    offset = 0

    # ログ出力
    f = open('spotifyLibrary.txt','w', encoding='UTF-8') 

    while True:
        # Get User's Saved Tracks
        results = sp.current_user_saved_tracks(limit,offset,'JP')

        # 合計曲数
        total = results['total']

        # 取得した曲の詳細
        for idx, item in enumerate(results['items']):
            print(str(offset+idx) + "/" + str(total) )

            track = item['track']
            f.write( track['name'] + "\t" + track['artists'][0]['name'] + "\n" )

        # 終了判定
        offset = offset + limit
        if offset >= total:
            break

    f.close()

spotifyLibrary.txt という名前で作成される。

まとめ

AmazonMusicからSpotifyに移行できていない曲が判明しました。
大半は手動で追加しましたが、一部の曲はSpotifyにも存在しなかったです。

前後記事

AmazonMusicのマイミュージックをSpotifyに移行しよう(Python+Selenium)
住所から地図上にプロットしよう(python+geopandas)