From 4f5d879781e8fbbf97dab5a751ee8201660a182c Mon Sep 17 00:00:00 2001 From: Xoconoch Date: Wed, 4 Jun 2025 07:24:35 -0600 Subject: [PATCH 1/2] fr this time --- deezspot/spotloader/__download__.py | 71 ++++++++++------------------- 1 file changed, 25 insertions(+), 46 deletions(-) diff --git a/deezspot/spotloader/__download__.py b/deezspot/spotloader/__download__.py index 0907751..fb00344 100644 --- a/deezspot/spotloader/__download__.py +++ b/deezspot/spotloader/__download__.py @@ -1077,58 +1077,37 @@ class DW_ALBUM: c_song_metadata = {} for key, item in self.__song_metadata_items: - if type(item) is not list: - c_song_metadata[key] = item # Corrected: use item directly + if key == 'popularity_list': + continue + if not isinstance(item, list): # Changed from type() to isinstance() + c_song_metadata[key] = item # Use item directly (it's self.__song_metadata[key]) total_tracks = album.nb_tracks for a in range(total_tracks): - # 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: - if a < len(item): # Check bounds for 'item' (which is the list) - c_song_metadata[key] = item[a] # Access element from 'item' + for key, metadata_value_for_key in self.__song_metadata_items: # metadata_value_for_key is self.__song_metadata[key] + if isinstance(metadata_value_for_key, list): # Changed from type() is list to isinstance() + if key == 'popularity_list': + continue + if a < len(metadata_value_for_key): + c_song_metadata[key] = metadata_value_for_key[a] else: - # Data for this key is missing for track 'a' + # Log a warning because a per-track list is shorter than expected. + # This was causing the IndexError. + album_name_for_log = c_song_metadata.get('album', self.__song_metadata.get('album', 'Unknown Album')) 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." + f"In album '{album_name_for_log}', metadata list for key '{key}' is too short. " + f"Expected at least {a + 1} elements for track {a + 1}/{total_tracks} " + f"(list has {len(metadata_value_for_key)}). Assigning None to '{key}' 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') + c_song_metadata[key] = None + song_name = c_song_metadata['music'] + artist_name = c_song_metadata['artist'] + album_name = c_song_metadata['album'] current_track = a + 1 c_preferences = deepcopy(self.__preferences) - 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.song_metadata = c_song_metadata.copy() + c_preferences.ids = c_song_metadata['ids'] 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 @@ -1136,14 +1115,14 @@ class DW_ALBUM: try: # Use track-level reporting through EASY_DW - track = EASY_DW(c_preferences, parent='album').easy_dw() + track = EASY_DW(c_preferences, parent='album').download_try() except TrackNotFound as e_track: - track = Track(c_song_metadata.copy(), None, None, None, None, None) # Use a copy of metadata for this track + track = Track(c_song_metadata, None, None, None, None, None) 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.copy(), None, None, None, None, None) # Use a copy of metadata for this track + track = Track(c_song_metadata, None, None, None, None, None) 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}") From 0ab091f492d44c2b57da5203869d8bce8b0a8699 Mon Sep 17 00:00:00 2001 From: Xoconoch Date: Wed, 4 Jun 2025 07:30:10 -0600 Subject: [PATCH 2/2] fixed deezer as well --- deezspot/deezloader/__download__.py | 1 + deezspot/deezloader/dee_api.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/deezspot/deezloader/__download__.py b/deezspot/deezloader/__download__.py index 160bd0a..504d6e8 100644 --- a/deezspot/deezloader/__download__.py +++ b/deezspot/deezloader/__download__.py @@ -948,6 +948,7 @@ class DW_ALBUM: self.__not_interface = self.__preferences.not_interface self.__quality_download = self.__preferences.quality_download self.__recursive_quality = self.__preferences.recursive_quality + self.__song_metadata = self.__preferences.song_metadata self.__song_metadata_items = self.__song_metadata.items() diff --git a/deezspot/deezloader/dee_api.py b/deezspot/deezloader/dee_api.py index 1e32f52..19a8d34 100644 --- a/deezspot/deezloader/dee_api.py +++ b/deezspot/deezloader/dee_api.py @@ -2,6 +2,7 @@ from time import sleep from datetime import datetime +from typing import Union from deezspot.deezloader.__utils__ import artist_sort from requests import get as req_get from deezspot.libutils.utils import convert_to_date @@ -12,6 +13,7 @@ from deezspot.exceptions import ( TrackNotFound, ) from deezspot.libutils.logging_utils import logger +import requests class API: @@ -282,7 +284,7 @@ class API: def tracking_album(cls, album_json): song_metadata: dict[ str, - list or str or int or datetime + Union[list, str, int, datetime] ] = { "music": [], "artist": [],