Add button to auto-delete already downloaded files and retry failed ones
This commit is contained in:
+61
-5
@@ -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()
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"version": "4.6"
|
||||
"version": "4.7"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user