#!/usr/bin/python3 import spotipy from spotipy.oauth2 import SpotifyOAuth import json import sys import datetime scope = "user-library-read playlist-modify-public" sp = spotipy.Spotify(auth_manager=SpotifyOAuth(scope=scope, client_id="1034e542fa064c27859b61a6ec5f864e", client_secret="2503172e78ce4d5e9146047db0a39077", redirect_uri="http://b.4a.si:25425/")) playlist = "0ASvlSEvlQu5nyFwUZqf9n" results = {"items": [None]} offset = 0 publicized_uris = [] while len(results["items"]) != 0: results = sp.playlist_items(playlist, None, 100, offset) for idx, item in enumerate(results["items"]): publicized_uris.append(item["track"]["uri"]) offset += 100 results = {"items": [None]} offset = 0 saved_items = [] to_add = [] while len(results["items"]) != 0: results = sp.current_user_saved_tracks(50, offset) for idx, item in enumerate(results['items']): saved_items.append(item) if item["track"]["uri"] not in publicized_uris: to_add.append(item["track"]["uri"]) else: publicized_uris.remove(item["track"]["uri"]) offset += 50 to_add.reverse() if len(to_add) != 0: for batch in [to_add[i:i+50] for i in range(0, len(to_add), 50)]: sp.playlist_add_items(playlist, batch) if len(publicized_uris) != 0: sp.playlist_remove_all_occurrences_of_items(playlist, publicized_uris) todaystring = datetime.datetime.now().isoformat().replace("T", " ").split(".")[0] sp.playlist_change_details(playlist, name="public mirror of my liked songs.", public=True, collaborative=False, description=f"updated {todaystring} automatically daily using http://4a.si/spotsync ... order is correct, new songs get added counterintuitively at the bottom") print(json.dumps(saved_items))