From 47977cf76b3abf3643c970b226cb683f1fd832ce Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Mon, 7 Jun 2021 22:39:33 +0200
Subject: [PATCH] added SpotifyImport

---
 .gitignore                                    |  3 +-
 SpotifyBackup.py                              |  2 +-
 SpotifyImport.py                              | 66 +++++++++++++++++++
 ...mple.json => settings-backup-example.json} |  0
 config/settings-import-example.json           | 12 ++++
 5 files changed, 81 insertions(+), 2 deletions(-)
 create mode 100644 SpotifyImport.py
 rename config/{settings-example.json => settings-backup-example.json} (100%)
 create mode 100644 config/settings-import-example.json

diff --git a/.gitignore b/.gitignore
index 14da8ec..4c27b3c 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 9b8b0f7..2b8940f 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 0000000..adfd034
--- /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 0000000..90f912f
--- /dev/null
+++ b/config/settings-import-example.json
@@ -0,0 +1,12 @@
+{
+    "spotifyAPI": {
+        "clientID": ""
+    },
+    "playlists": [
+        {
+            "backupFilePath": "",
+            "user": "",
+            "id": ""
+        }
+    ]
+}
\ No newline at end of file
-- 
GitLab