From da49f54a53d3e56520c00f49663546350eead2b5 Mon Sep 17 00:00:00 2001 From: Xoconoch Date: Wed, 4 Jun 2025 07:05:24 -0600 Subject: [PATCH] fixed album download --- deezspot/spotloader/__download__.py | 58 +++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/deezspot/spotloader/__download__.py b/deezspot/spotloader/__download__.py index 6f643b7..0907751 100644 --- a/deezspot/spotloader/__download__.py +++ b/deezspot/spotloader/__download__.py @@ -1078,21 +1078,57 @@ class DW_ALBUM: c_song_metadata = {} for key, item in self.__song_metadata_items: if type(item) is not list: - c_song_metadata[key] = self.__song_metadata[key] + c_song_metadata[key] = item # Corrected: use item directly total_tracks = album.nb_tracks for a in range(total_tracks): - for key, item in self.__song_metadata_items: + # c_song_metadata starts with album-wide values. + # For each track 'a', list-based values for that track 'a' are updated. + # A copy is made later for c_preferences.song_metadata. + for key, item in self.__song_metadata_items: # item is self.__song_metadata[key] if type(item) is list: - c_song_metadata[key] = self.__song_metadata[key][a] - song_name = c_song_metadata['music'] - artist_name = c_song_metadata['artist'] - album_name = c_song_metadata['album'] + if a < len(item): # Check bounds for 'item' (which is the list) + c_song_metadata[key] = item[a] # Access element from 'item' + else: + # Data for this key is missing for track 'a' + logger.warning( + f"Metadata mismatch in album '{self.__song_metadata.get('album', 'Unknown Album')}'. " + f"Key '{key}' has a list of {len(item)} items, " + f"but trying to access index {a} for track {a+1}/{total_tracks}. " + f"Setting value to None for this track." + ) + c_song_metadata[key] = None # Provide a fallback + if key == 'ids': + logger.error( + f"Critical 'ids' metadata for track {a+1} in album " + f"'{self.__song_metadata.get('album', 'Unknown Album')}' " + f"is missing due to list length mismatch. This track will likely fail." + ) + + song_name = c_song_metadata.get('music') + artist_name = c_song_metadata.get('artist') + album_name = c_song_metadata.get('album') current_track = a + 1 c_preferences = deepcopy(self.__preferences) - c_preferences.song_metadata = c_song_metadata.copy() - c_preferences.ids = c_song_metadata['ids'] + c_preferences.song_metadata = c_song_metadata.copy() # Use a copy for this track's preferences + c_preferences.ids = c_song_metadata.get('ids') # Get the 'ids' for current track 'a' c_preferences.track_number = current_track # Track number in the album + + if c_preferences.ids is None: + logger.error( + f"Skipping track {current_track} ('{song_name}') from album '{album_name}' " + f"because its ID is missing due to inconsistent album metadata (list length mismatch for 'ids' key)." + ) + error_track_metadata = c_song_metadata.copy() + error_track = Track(error_track_metadata, None, None, None, None, None) + error_track.success = False + error_track.error_message = ( + f"Track ID missing for track {current_track} ('{song_name}') in album " + f"'{album_name}' due to metadata list length mismatch." + ) + tracks.append(error_track) + continue + c_preferences.link = f"https://open.spotify.com/track/{c_preferences.ids}" # Add album_id to song metadata for consistent parent info @@ -1100,14 +1136,14 @@ class DW_ALBUM: try: # Use track-level reporting through EASY_DW - track = EASY_DW(c_preferences, parent='album').download_try() + track = EASY_DW(c_preferences, parent='album').easy_dw() except TrackNotFound as e_track: - track = Track(c_song_metadata, None, None, None, None, None) + track = Track(c_song_metadata.copy(), None, None, None, None, None) # Use a copy of metadata for this track track.success = False track.error_message = str(e_track) # Store the error message from TrackNotFound logger.warning(f"Track '{song_name}' by '{artist_name}' from album '{album.album_name}' not found or failed to download. Reason: {track.error_message}") except Exception as e_generic: - track = Track(c_song_metadata, None, None, None, None, None) + track = Track(c_song_metadata.copy(), None, None, None, None, None) # Use a copy of metadata for this track track.success = False track.error_message = f"An unexpected error occurred: {str(e_generic)}" logger.error(f"Unexpected error downloading track '{song_name}' by '{artist_name}' from album '{album.album_name}'. Reason: {track.error_message}")