import os import spotipy from datetime import date from dotenv import load_dotenv from termcolor import colored """ Spotify Playlist Generator https://github.com/kolbyd/spotify-playlist-generator Developed by Kolby Dunning | kolbyd.ca This project is protected under the MIT license. Spotify's trademark and brand are property of Spotify Technology S.A. This software is not owned or supported by Spotify """ def chunks(l, n): for i in range(0, len(l), n): yield l[i:i+n] # Check if the environment file exists if os.path.exists('.env'): load_dotenv() pass else: with open('.env', 'x') as f: f.write("# .env\n" "SPOTIFY_CLIENT_ID=\n" "SPOTIFY_CLIENT_SECRET=") print(colored("Fill in the required fields in '.env'.", "yellow")) exit(1) # Ensure we have our ID and secret from Spotify's API if os.getenv("SPOTIFY_CLIENT_ID") is None or os.getenv("SPOTIFY_CLIENT_SECRET") is None: print(colored("Ensure you have included your Spotify credentials. If you don't have them, please make an app at " "developer.spotify.com", "red")) exit(1) print("Connecting to Spotify. " + colored("Check your browser in case there is a login prompt.", "yellow")) spotify = spotipy.Spotify(auth_manager=spotipy.oauth2.SpotifyOAuth( client_id=os.getenv("SPOTIFY_CLIENT_ID"), client_secret=os.getenv("SPOTIFY_CLIENT_SECRET"), redirect_uri="http://localhost:8080/callback/", scope="user-library-read playlist-modify-public playlist-modify-private") ) print("Connected to Spotify successfully. Starting the converter.") flag = True # Spotify doesn't want to return all liked songs. Set to false when done. offset = 0 # Offset to spotify songs tracks = [] while flag: chunk = spotify.current_user_saved_tracks(50, offset) for track in chunk['items']: tracks.append(track['track']['uri']) if chunk['next'] is None: flag = False offset += 50 # Check if the user wants the playlist to be public playlist_public = input(colored("Do you want the playlist to be public? (y/n)", "green") + colored(" [n] ", "yellow")).lower() == "y" new_playlist = spotify.user_playlist_create(spotify.current_user()['id'], "Liked Songs - " + date.today().strftime("%m-%d-%Y"), playlist_public, description="Auto generated from this user's liked songs.") # Use chunks of 100 due to Spotify limitations for chunk in chunks(tracks, 100): spotify.playlist_add_items(new_playlist['id'], chunk) print("Complete! Check out your new playlist at " + new_playlist['external_urls']['spotify'])