included Skipped Songs for Removal from Playlist
This commit is contained in:
+47
-13
@@ -59,7 +59,7 @@ class MetadataFetchWorker(QThread):
|
|||||||
self.error.emit(f'Failed to fetch metadata: {str(e)}')
|
self.error.emit(f'Failed to fetch metadata: {str(e)}')
|
||||||
|
|
||||||
class DownloadWorker(QThread):
|
class DownloadWorker(QThread):
|
||||||
finished = pyqtSignal(bool, str, list, list)
|
finished = pyqtSignal(bool, str, list, list, list)
|
||||||
progress = pyqtSignal(str, int)
|
progress = pyqtSignal(str, int)
|
||||||
|
|
||||||
def __init__(self, tracks, outpath, is_single_track=False, is_album=False, is_playlist=False,
|
def __init__(self, tracks, outpath, is_single_track=False, is_album=False, is_playlist=False,
|
||||||
@@ -83,6 +83,7 @@ class DownloadWorker(QThread):
|
|||||||
self.is_stopped = False
|
self.is_stopped = False
|
||||||
self.failed_tracks = []
|
self.failed_tracks = []
|
||||||
self.successful_tracks = []
|
self.successful_tracks = []
|
||||||
|
self.skipped_tracks = []
|
||||||
|
|
||||||
def get_formatted_filename(self, track):
|
def get_formatted_filename(self, track):
|
||||||
if self.filename_format == "artist_title":
|
if self.filename_format == "artist_title":
|
||||||
@@ -157,6 +158,7 @@ class DownloadWorker(QThread):
|
|||||||
self.progress.emit(f"File already exists: {new_filename}. Skipping download.", 0)
|
self.progress.emit(f"File already exists: {new_filename}. Skipping download.", 0)
|
||||||
self.progress.emit(f"Skipped: {track.title} - {track.artists}",
|
self.progress.emit(f"Skipped: {track.title} - {track.artists}",
|
||||||
int((i + 1) / total_tracks * 100))
|
int((i + 1) / total_tracks * 100))
|
||||||
|
self.skipped_tracks.append(track)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.service == "qobuz":
|
if self.service == "qobuz":
|
||||||
@@ -205,6 +207,7 @@ class DownloadWorker(QThread):
|
|||||||
elif isinstance(download_result_details, dict) and (download_result_details.get("status") == "all_skipped" or download_result_details.get("status") == "skipped_exists"):
|
elif isinstance(download_result_details, dict) and (download_result_details.get("status") == "all_skipped" or download_result_details.get("status") == "skipped_exists"):
|
||||||
self.progress.emit(f"File already exists or skipped: {new_filename}",0)
|
self.progress.emit(f"File already exists or skipped: {new_filename}",0)
|
||||||
downloaded_file = new_filepath
|
downloaded_file = new_filepath
|
||||||
|
self.skipped_tracks.append(track)
|
||||||
else:
|
else:
|
||||||
downloaded_file = None
|
downloaded_file = None
|
||||||
raise Exception(f"Tidal download failed or returned unexpected result: {download_result_details}")
|
raise Exception(f"Tidal download failed or returned unexpected result: {download_result_details}")
|
||||||
@@ -281,6 +284,7 @@ class DownloadWorker(QThread):
|
|||||||
self.progress.emit(f"File already exists: {new_filename}", 0)
|
self.progress.emit(f"File already exists: {new_filename}", 0)
|
||||||
self.progress.emit(f"Skipped: {track.title} - {track.artists}",
|
self.progress.emit(f"Skipped: {track.title} - {track.artists}",
|
||||||
int((i + 1) / total_tracks * 100))
|
int((i + 1) / total_tracks * 100))
|
||||||
|
self.skipped_tracks.append(track)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if downloaded_file != new_filepath:
|
if downloaded_file != new_filepath:
|
||||||
@@ -308,10 +312,12 @@ class DownloadWorker(QThread):
|
|||||||
success_message += f"\n\nFailed downloads: {len(self.failed_tracks)} tracks"
|
success_message += f"\n\nFailed downloads: {len(self.failed_tracks)} tracks"
|
||||||
if self.successful_tracks:
|
if self.successful_tracks:
|
||||||
success_message += f"\n\nSuccessful downloads: {len(self.successful_tracks)} tracks"
|
success_message += f"\n\nSuccessful downloads: {len(self.successful_tracks)} tracks"
|
||||||
self.finished.emit(True, success_message, self.failed_tracks, self.successful_tracks)
|
if self.skipped_tracks:
|
||||||
|
success_message += f"\n\nSkipped (already exists): {len(self.skipped_tracks)} tracks"
|
||||||
|
self.finished.emit(True, success_message, self.failed_tracks, self.successful_tracks, self.skipped_tracks)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.finished.emit(False, str(e), self.failed_tracks, self.successful_tracks)
|
self.finished.emit(False, str(e), self.failed_tracks, self.successful_tracks, self.skipped_tracks)
|
||||||
|
|
||||||
def pause(self):
|
def pause(self):
|
||||||
self.is_paused = True
|
self.is_paused = True
|
||||||
@@ -1021,7 +1027,7 @@ class SpotiFLACGUI(QWidget):
|
|||||||
control_layout = QHBoxLayout()
|
control_layout = QHBoxLayout()
|
||||||
self.stop_btn = QPushButton('Stop')
|
self.stop_btn = QPushButton('Stop')
|
||||||
self.pause_resume_btn = QPushButton('Pause')
|
self.pause_resume_btn = QPushButton('Pause')
|
||||||
self.remove_successful_btn = QPushButton('Remove Successful Downloads')
|
self.remove_successful_btn = QPushButton('Remove Finished Songs')
|
||||||
|
|
||||||
self.stop_btn.setFixedWidth(120)
|
self.stop_btn.setFixedWidth(120)
|
||||||
self.pause_resume_btn.setFixedWidth(120)
|
self.pause_resume_btn.setFixedWidth(120)
|
||||||
@@ -1964,7 +1970,7 @@ class SpotiFLACGUI(QWidget):
|
|||||||
qobuz_region,
|
qobuz_region,
|
||||||
qobuz_mode
|
qobuz_mode
|
||||||
)
|
)
|
||||||
self.worker.finished.connect(lambda success, message, failed_tracks, successful_tracks: self.on_download_finished(success, message, failed_tracks, successful_tracks))
|
self.worker.finished.connect(lambda success, message, failed_tracks, successful_tracks, skipped_tracks: self.on_download_finished(success, message, failed_tracks, successful_tracks, skipped_tracks))
|
||||||
self.worker.progress.connect(self.update_progress)
|
self.worker.progress.connect(self.update_progress)
|
||||||
self.worker.start()
|
self.worker.start()
|
||||||
self.start_timer()
|
self.start_timer()
|
||||||
@@ -1996,9 +2002,9 @@ class SpotiFLACGUI(QWidget):
|
|||||||
if hasattr(self, 'worker'):
|
if hasattr(self, 'worker'):
|
||||||
self.worker.stop()
|
self.worker.stop()
|
||||||
self.stop_timer()
|
self.stop_timer()
|
||||||
self.on_download_finished(True, "Download stopped by user.", [])
|
self.on_download_finished(True, "Download stopped by user.", [], [], [])
|
||||||
|
|
||||||
def on_download_finished(self, success, message, failed_tracks, successful_tracks=None):
|
def on_download_finished(self, success, message, failed_tracks, successful_tracks=None, skipped_tracks=None):
|
||||||
self.progress_bar.hide()
|
self.progress_bar.hide()
|
||||||
self.stop_btn.hide()
|
self.stop_btn.hide()
|
||||||
self.pause_resume_btn.hide()
|
self.pause_resume_btn.hide()
|
||||||
@@ -2007,8 +2013,10 @@ class SpotiFLACGUI(QWidget):
|
|||||||
|
|
||||||
if successful_tracks is not None:
|
if successful_tracks is not None:
|
||||||
self.successful_downloads = successful_tracks
|
self.successful_downloads = successful_tracks
|
||||||
|
if skipped_tracks is not None:
|
||||||
|
self.skipped_downloads = skipped_tracks
|
||||||
|
|
||||||
if hasattr(self, 'successful_downloads') and self.successful_downloads:
|
if (hasattr(self, 'successful_downloads') and self.successful_downloads) or (hasattr(self, 'skipped_downloads') and self.skipped_downloads):
|
||||||
self.remove_successful_btn.show()
|
self.remove_successful_btn.show()
|
||||||
else:
|
else:
|
||||||
self.remove_successful_btn.hide()
|
self.remove_successful_btn.hide()
|
||||||
@@ -2044,20 +2052,35 @@ class SpotiFLACGUI(QWidget):
|
|||||||
self.pause_resume_btn.setText('Resume')
|
self.pause_resume_btn.setText('Resume')
|
||||||
|
|
||||||
def remove_successful_downloads(self):
|
def remove_successful_downloads(self):
|
||||||
"""Remove successfully downloaded tracks from the dashboard"""
|
"""Remove successfully downloaded and skipped tracks from the dashboard"""
|
||||||
if not hasattr(self, 'successful_downloads') or not self.successful_downloads:
|
successful_tracks = getattr(self, 'successful_downloads', [])
|
||||||
self.log_output.append("No successful downloads to remove.")
|
skipped_tracks = getattr(self, 'skipped_downloads', [])
|
||||||
|
|
||||||
|
if not successful_tracks and not skipped_tracks:
|
||||||
|
self.log_output.append("No downloaded or skipped tracks to remove.")
|
||||||
return
|
return
|
||||||
|
|
||||||
tracks_to_remove = []
|
tracks_to_remove = []
|
||||||
|
|
||||||
|
# Check for successful downloads
|
||||||
for track in self.tracks:
|
for track in self.tracks:
|
||||||
for successful_track in self.successful_downloads:
|
for successful_track in successful_tracks:
|
||||||
if (track.title == successful_track.title and
|
if (track.title == successful_track.title and
|
||||||
track.artists == successful_track.artists and
|
track.artists == successful_track.artists and
|
||||||
track.album == successful_track.album):
|
track.album == successful_track.album):
|
||||||
tracks_to_remove.append(track)
|
tracks_to_remove.append(track)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
# Check for skipped tracks (already exists)
|
||||||
|
for track in self.tracks:
|
||||||
|
for skipped_track in skipped_tracks:
|
||||||
|
if (track.title == skipped_track.title and
|
||||||
|
track.artists == skipped_track.artists and
|
||||||
|
track.album == skipped_track.album):
|
||||||
|
if track not in tracks_to_remove: # Avoid duplicates
|
||||||
|
tracks_to_remove.append(track)
|
||||||
|
break
|
||||||
|
|
||||||
if tracks_to_remove:
|
if tracks_to_remove:
|
||||||
for track in tracks_to_remove:
|
for track in tracks_to_remove:
|
||||||
if track in self.tracks:
|
if track in self.tracks:
|
||||||
@@ -2066,7 +2089,18 @@ class SpotiFLACGUI(QWidget):
|
|||||||
self.all_tracks.remove(track)
|
self.all_tracks.remove(track)
|
||||||
|
|
||||||
self.update_track_list_display()
|
self.update_track_list_display()
|
||||||
self.log_output.append(f"Removed {len(tracks_to_remove)} successfully downloaded tracks from the list.")
|
successful_count = len([t for t in tracks_to_remove if t in successful_tracks])
|
||||||
|
skipped_count = len([t for t in tracks_to_remove if t in skipped_tracks])
|
||||||
|
|
||||||
|
message = f"Removed {len(tracks_to_remove)} tracks from the list"
|
||||||
|
if successful_count > 0:
|
||||||
|
message += f" ({successful_count} downloaded"
|
||||||
|
if skipped_count > 0:
|
||||||
|
message += f", {skipped_count} already existed" if successful_count > 0 else f" ({skipped_count} already existed"
|
||||||
|
if successful_count > 0 or skipped_count > 0:
|
||||||
|
message += ")"
|
||||||
|
|
||||||
|
self.log_output.append(message + ".")
|
||||||
self.tab_widget.setCurrentIndex(0)
|
self.tab_widget.setCurrentIndex(0)
|
||||||
else:
|
else:
|
||||||
self.log_output.append("No matching tracks found in the current list.")
|
self.log_output.append("No matching tracks found in the current list.")
|
||||||
|
|||||||
Reference in New Issue
Block a user