1.5.2
This commit is contained in:
Xoconoch
2025-06-04 15:31:00 +02:00
committed by GitHub
3 changed files with 29 additions and 47 deletions

View File

@@ -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()

View File

@@ -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": [],

View File

@@ -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}")