From b75130cc0a9611f195b09cb5572c9c62aa290bed Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 18 Jan 2024 22:04:49 +0100
Subject: [PATCH] SpotifyRecorder: skip recording for already existing mp3
 files

---
 SpotifyRecorder.py | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/SpotifyRecorder.py b/SpotifyRecorder.py
index d8359d7..7c47778 100644
--- a/SpotifyRecorder.py
+++ b/SpotifyRecorder.py
@@ -98,6 +98,7 @@ class SpotifyRecorder:
         deviceId = self.__get_device_id_by_name(self._spotifyDeviceName)
 
         recordedTrackNumbers = []
+        alreadyExistingTrackNumbers = []
         skippedTrackNumbers = []
         errorTrackNumbers = []
 
@@ -114,21 +115,28 @@ class SpotifyRecorder:
             LOGGER.info(f'>>> Recording track {index + 1}/{len(tracks)}: '
                         f'#{indexInPlaylist} "{track["track"]["name"]}"...')
             try:
-                self.__record_single_track(deviceId, indexInPlaylist, track)
-                recordedTrackNumbers.append(indexInPlaylist)
+                recordingCreated = self.__record_single_track(deviceId, indexInPlaylist, track)
+                if recordingCreated:
+                    recordedTrackNumbers.append(indexInPlaylist)
+                else:
+                    alreadyExistingTrackNumbers.append(indexInPlaylist)
             except Exception as e:
                 LOGGER.error(f'An error occurred while recording track "{track["track"]["name"]}"', exc_info=e)
                 errorTrackNumbers.append(indexInPlaylist)
 
-        self.__print_end_statistics(errorTrackNumbers, recordedTrackNumbers, skippedTrackNumbers, len(tracks))
+        self.__print_end_statistics(errorTrackNumbers, recordedTrackNumbers, skippedTrackNumbers, alreadyExistingTrackNumbers, len(tracks))
 
-    def __record_single_track(self, deviceId, indexInPlaylist, track):
+    def __record_single_track(self, deviceId, indexInPlaylist, track) -> bool:
         self.__stop_playback_if_playing(deviceId)
 
         fileName = self.__determine_file_name(indexInPlaylist, track)
         filePathWav = f'{fileName}.wav'
         filePathMp3 = f'{fileName}.mp3'
 
+        if os.path.exists(filePathMp3):
+            LOGGER.info('Track already exists. Skipping.')
+            return False
+
         recorder = AudioRecorder(self._audioDeviceName, filePathWav)
 
         with recorder.record():
@@ -145,12 +153,17 @@ class SpotifyRecorder:
         LOGGER.debug(f'\t\tRemoving wav file "{filePathWav}"')
         os.remove(filePathWav)
 
+        return True
+
     @staticmethod
-    def __print_end_statistics(errorTrackNumbers: list[int], recordedTrackNumbers: list[int],
-                               skippedTrackNumbers: list[int], numberOfTracks: int):
+    def __print_end_statistics(errorTrackNumbers: list[int],
+                               recordedTrackNumbers: list[int],
+                               skippedTrackNumbers: list[int],
+                               alreadyExistingTrackNumbers: list[int],
+                               numberOfTracks: int):
         LOGGER.info('### DONE ###')
 
-        LOGGER.info('>>> Skipped <<<')
+        LOGGER.info('>>> Skipped local tracks<<<')
         for number in skippedTrackNumbers:
             LOGGER.info(f'Skipped #{number}')
 
@@ -158,8 +171,11 @@ class SpotifyRecorder:
         for number in errorTrackNumbers:
             LOGGER.info(f'Error #{number}')
 
-        LOGGER.info(f'### {numberOfTracks} tracks, {len(recordedTrackNumbers)} recorded, '
-                    f'{len(skippedTrackNumbers)} skipped, {len(errorTrackNumbers)} errors ###')
+        LOGGER.info(f'### {numberOfTracks} tracks, '
+                    f'{len(recordedTrackNumbers)} recorded, '
+                    f'{len(skippedTrackNumbers)} local tracks skipped, '
+                    f'{len(alreadyExistingTrackNumbers)} existing tracks skipped, '
+                    f'{len(errorTrackNumbers)} errors ###')
 
     def __determine_file_name(self, index: int, track) -> str:
         artists = self.__join_artists(track)
-- 
GitLab