diff --git a/.gitignore b/.gitignore index 14da8ec42c31d2c26c26e353d2271c87fa1ff8a6..4c27b3ca56854257a495eae16c135346e4910e00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ exports/ -config/settings.json +config/settings-backup.json +config/settings-import.json Pipfile.lock \ No newline at end of file diff --git a/SpotifyBackup.py b/SpotifyBackup.py index 9b8b0f7ecd9a7f5d47b54f01fedb1457c53862d8..2b8940f3f75263e76c4a5c65d9036fa03edf872d 100644 --- a/SpotifyBackup.py +++ b/SpotifyBackup.py @@ -99,7 +99,7 @@ class SpotifyBackup: if __name__ == '__main__': - with open('config/settings.json', 'r', encoding='utf-8') as f: + with open('config/settings-backup.json', 'r', encoding='utf-8') as f: SETTINGS = json.load(f) spotifyBackup = SpotifyBackup(SETTINGS['spotifyAPI']['clientID'], diff --git a/SpotifyImport.py b/SpotifyImport.py new file mode 100644 index 0000000000000000000000000000000000000000..adfd034b25370dd38243140dcc58e751b546dc19 --- /dev/null +++ b/SpotifyImport.py @@ -0,0 +1,66 @@ +import csv +import json +import time +from typing import List + +import spotipy +from TheCodeLabs_BaseUtils.DefaultLogger import DefaultLogger +from spotipy.oauth2 import SpotifyPKCE + +LOG_FORMAT = '[%(levelname)-7s] - %(asctime)s - %(message)s' +LOGGER = DefaultLogger().create_logger_if_not_exists('SpotifyBackup', logFormat=LOG_FORMAT) + + +class SpotifyImport: + def __init__(self, clientID: str): + client_credentials_manager = SpotifyPKCE(client_id=clientID, redirect_uri='http://localhost', + scope='playlist-modify-private') + self._spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager) + + def import_playlist(self, backupFilePath: str, username: str, playlistID: str): + tracks = self.__load_backup_file(backupFilePath) + + identifier = f'spotify:user:{username}:playlist:{playlistID}' + LOGGER.info(f'>>> Importing tracks to playlist "{playlistID}"...') + + numberOfImportedTracks = 0 + + for index, track in enumerate(tracks): + LOGGER.info(f'Importing {index + 1}/{len(tracks)} - "{track}"...') + try: + self._spotify.playlist_add_items(identifier, [track]) + numberOfImportedTracks += 1 + time.sleep(1) + except: + LOGGER.error(f'Error importing track {index + 1}/{len(tracks)} - "{track}"!') + + LOGGER.info(f'Importing DONE ({numberOfImportedTracks}/{len(tracks)}) successful') + + def __load_backup_file(self, backupFilePath: str) -> List[str]: + LOGGER.info(f'>>> Parsing backup file "{backupFilePath}"...') + + tracks = [] + with open(backupFilePath, 'r', newline='', encoding='utf-8') as f: + reader = csv.reader(f, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL) + + next(reader) # skip header + + for row in reader: + trackUrl = row[-1] + if trackUrl: + tracks.append(trackUrl) + + LOGGER.info(f'>>> Found {len(tracks)} tracks in backup file') + return tracks + + +if __name__ == '__main__': + with open('config/settings-import.json', 'r', encoding='utf-8') as f: + SETTINGS = json.load(f) + + spotifyImport = SpotifyImport(SETTINGS['spotifyAPI']['clientID']) + + for playlist in SETTINGS['playlists']: + spotifyImport.import_playlist(playlist['backupFilePath'], playlist['user'], playlist['id']) + + LOGGER.info('### DONE ###') diff --git a/config/settings-example.json b/config/settings-backup-example.json similarity index 100% rename from config/settings-example.json rename to config/settings-backup-example.json diff --git a/config/settings-import-example.json b/config/settings-import-example.json new file mode 100644 index 0000000000000000000000000000000000000000..90f912f618c1eecad9406fd629ad65becd0fb202 --- /dev/null +++ b/config/settings-import-example.json @@ -0,0 +1,12 @@ +{ + "spotifyAPI": { + "clientID": "" + }, + "playlists": [ + { + "backupFilePath": "", + "user": "", + "id": "" + } + ] +} \ No newline at end of file