APIで、Spotifyの他者のプレイリストを、コピーする。
非エンジニアですが、コピーしたかったため作りました。
メモで、記事にしています。
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import sys
import spotipy.util as util
from datetime import datetime
day = datetime.now()
date = day.date()
username = 'ログインしているユーザー名'
client_id = "自身のclient_id"
client_secret = "自身のclient_secret"
redirect_uri = "設定した自身のredirect_uri"
client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
scope = 'playlist-modify-public playlist-modify-private'
token = util.prompt_for_user_token(username,scope, client_id=client_id,client_secret=client_secret,redirect_uri=redirect_uri)
sp = spotipy.Spotify(auth=token)
#本文関数
def clear_playlist(playlist_id):
#指定した自分のプレイリストの取得
my_playlist = sp.playlist(playlist_id)
# 指定した自分のプレイリストを空にする
sp.user_playlist_replace_tracks(user=my_playlist["owner"]["id"], playlist_id=playlist_id, tracks=[])
print("指定したプレイリストを空にしました。")
def playlist_change_details(my_playlist_id):
my_playlist = sp.playlist(my_playlist_id)
description = "{}".format(date)
sp.user_playlist_change_details(user=my_playlist["owner"]["id"], playlist_id=my_playlist_id, description=description)
#本文関数 main
def sync_playlists(other_playlist_id, my_playlist_id):
#指定した他者のプレイリストのID
Shother_playlist_id = other_playlist_id
#指定した自分のプレイリストのID
my_playlist_id = my_playlist_id
#指定した他者のプレイリストの取得
other_playlist = sp.playlist(other_playlist_id)
#指定した自分のプレイリストの取得
my_playlist = sp.playlist(my_playlist_id)
#指定した他者のプレイリストの曲目
other_playlist_tracks = [track["track"]["id"] for track in other_playlist["tracks"]["items"]]
#指定した自分のプレイリストの曲目
my_playlist_tracks = [track["track"]["id"] for track in my_playlist["tracks"]["items"]]
#指定した他者のプレイリストの曲数
other_playlist_length = other_playlist["tracks"]["total"]
#指定した自分のプレイリストの曲数
my_playlist_length = my_playlist["tracks"]["total"]
#同期実行
if other_playlist_tracks == my_playlist_tracks and other_playlist_length == my_playlist_length:
playlist_change_details(my_playlist_id)
print("指定した他者のプレイリストと指定した自分のプレイリストが一致しました。処理を終了します。")
else:
#100曲以上の場合、sp.user_playlist_replace_tracksメソッドを使用できない(できるが100が上限なので100曲のプールしかできない)
#そのため
# 指定した自分のプレイリストを空にする
#そして、置き換えではなく、追加にする
clear_playlist(my_playlist_id)
# 指定した他者のプレイリストの曲目を指定した自分のプレイリストに同期
for i in range(0, other_playlist_length, 100):
results = sp.playlist_tracks(playlist_id=other_playlist_id, fields=None, limit=100, offset=i)
tracks = [t["track"]["id"] for t in results["items"]]
sp.user_playlist_add_tracks(user=my_playlist["owner"]["id"], playlist_id=my_playlist_id, tracks=tracks)
playlist_change_details(my_playlist_id)
print("指定した他者のプレイリストと指定した自分のプレイリストが一致しました。処理を終了します。")
sync_playlists("コピーしたいコピー元のplaylistid","ペーストしたいご自身のplaylistid")