From 7058559ddc7143b599a3acd03c03816b2c8bc30e Mon Sep 17 00:00:00 2001 From: value1338 Date: Fri, 3 Oct 2025 19:47:51 +0200 Subject: [PATCH] Add button to auto-delete already downloaded files and retry failed ones --- SpotiFLAC.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++---- version.json | 2 +- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/SpotiFLAC.py b/SpotiFLAC.py index e60b1b8..9b1321d 100644 --- a/SpotiFLAC.py +++ b/SpotiFLAC.py @@ -59,7 +59,7 @@ class MetadataFetchWorker(QThread): self.error.emit(f'Failed to fetch metadata: {str(e)}') class DownloadWorker(QThread): - finished = pyqtSignal(bool, str, list) + finished = pyqtSignal(bool, str, list, list) progress = pyqtSignal(str, int) def __init__(self, tracks, outpath, is_single_track=False, is_album=False, is_playlist=False, @@ -82,6 +82,7 @@ class DownloadWorker(QThread): self.is_paused = False self.is_stopped = False self.failed_tracks = [] + self.successful_tracks = [] def get_formatted_filename(self, track): if self.filename_format == "artist_title": @@ -294,6 +295,7 @@ class DownloadWorker(QThread): self.progress.emit(f"Successfully downloaded: {track.title} - {track.artists}", int((i + 1) / total_tracks * 100)) + self.successful_tracks.append(track) except Exception as e: self.failed_tracks.append((track.title, track.artists, str(e))) self.progress.emit(f"Failed to download: {track.title} - {track.artists}\nError: {str(e)}", @@ -304,10 +306,12 @@ class DownloadWorker(QThread): success_message = "Download completed!" if self.failed_tracks: success_message += f"\n\nFailed downloads: {len(self.failed_tracks)} tracks" - self.finished.emit(True, success_message, self.failed_tracks) + if self.successful_tracks: + success_message += f"\n\nSuccessful downloads: {len(self.successful_tracks)} tracks" + self.finished.emit(True, success_message, self.failed_tracks, self.successful_tracks) except Exception as e: - self.finished.emit(False, str(e), self.failed_tracks) + self.finished.emit(False, str(e), self.failed_tracks, self.successful_tracks) def pause(self): self.is_paused = True @@ -643,6 +647,7 @@ class SpotiFLACGUI(QWidget): self.current_version = "4.6" self.tracks = [] self.all_tracks = [] + self.successful_downloads = [] self.reset_state() self.settings = QSettings('SpotiFLAC', 'Settings') @@ -1016,19 +1021,24 @@ class SpotiFLACGUI(QWidget): control_layout = QHBoxLayout() self.stop_btn = QPushButton('Stop') self.pause_resume_btn = QPushButton('Pause') + self.remove_successful_btn = QPushButton('Remove Successful Downloads') self.stop_btn.setFixedWidth(120) self.pause_resume_btn.setFixedWidth(120) + self.remove_successful_btn.setFixedWidth(200) self.stop_btn.setCursor(Qt.CursorShape.PointingHandCursor) self.pause_resume_btn.setCursor(Qt.CursorShape.PointingHandCursor) + self.remove_successful_btn.setCursor(Qt.CursorShape.PointingHandCursor) self.stop_btn.clicked.connect(self.stop_download) self.pause_resume_btn.clicked.connect(self.toggle_pause_resume) + self.remove_successful_btn.clicked.connect(self.remove_successful_downloads) control_layout.addStretch() control_layout.addWidget(self.stop_btn) control_layout.addWidget(self.pause_resume_btn) + control_layout.addWidget(self.remove_successful_btn) control_layout.addStretch() process_layout.addLayout(control_layout) @@ -1041,6 +1051,7 @@ class SpotiFLACGUI(QWidget): self.time_label.hide() self.stop_btn.hide() self.pause_resume_btn.hide() + self.remove_successful_btn.hide() def setup_settings_tab(self): settings_tab = QWidget() @@ -1953,7 +1964,7 @@ class SpotiFLACGUI(QWidget): qobuz_region, qobuz_mode ) - self.worker.finished.connect(self.on_download_finished) + self.worker.finished.connect(lambda success, message, failed_tracks, successful_tracks: self.on_download_finished(success, message, failed_tracks, successful_tracks)) self.worker.progress.connect(self.update_progress) self.worker.start() self.start_timer() @@ -1987,13 +1998,23 @@ class SpotiFLACGUI(QWidget): self.stop_timer() self.on_download_finished(True, "Download stopped by user.", []) - def on_download_finished(self, success, message, failed_tracks): + def on_download_finished(self, success, message, failed_tracks, successful_tracks=None): self.progress_bar.hide() self.stop_btn.hide() self.pause_resume_btn.hide() self.pause_resume_btn.setText('Pause') self.stop_timer() + # Store successful downloads for later removal + if successful_tracks is not None: + self.successful_downloads = successful_tracks + + # Show remove successful button if there are successful downloads + if hasattr(self, 'successful_downloads') and self.successful_downloads: + self.remove_successful_btn.show() + else: + self.remove_successful_btn.hide() + self.download_selected_btn.setEnabled(True) self.download_all_btn.setEnabled(True) @@ -2024,6 +2045,41 @@ class SpotiFLACGUI(QWidget): self.worker.pause() self.pause_resume_btn.setText('Resume') + def remove_successful_downloads(self): + """Remove successfully downloaded tracks from the dashboard""" + if not hasattr(self, 'successful_downloads') or not self.successful_downloads: + # Show message on process tab since user is still there + self.log_output.append("No successful downloads to remove.") + return + + # Find successful tracks in the track list + tracks_to_remove = [] + for track in self.tracks: + for successful_track in self.successful_downloads: + if (track.title == successful_track.title and + track.artists == successful_track.artists and + track.album == successful_track.album): + tracks_to_remove.append(track) + break + + if tracks_to_remove: + # Remove tracks from both lists + for track in tracks_to_remove: + if track in self.tracks: + self.tracks.remove(track) + if track in self.all_tracks: + self.all_tracks.remove(track) + + self.update_track_list_display() + self.log_output.append(f"Removed {len(tracks_to_remove)} successfully downloaded tracks from the list.") + # Switch to dashboard after showing the message + self.tab_widget.setCurrentIndex(0) + else: + self.log_output.append("No matching tracks found in the current list.") + + # Hide the button after use + self.remove_successful_btn.hide() + def remove_selected_tracks(self): if not self.is_single_track: selected_items = self.track_list.selectedItems() diff --git a/version.json b/version.json index a925abd..e570051 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.6" + "version": "4.7" }