Fix track numbering and disc assignment for non-Spotify metadata sources
The download context builder always called spotify_client.get_track_details() first for track_number/disc_number, which fails or returns wrong data when using Deezer/iTunes as metadata source. All tracks got track_number: 0, defaulting to 01, and disc_number: 1. Fix: check track_info (from frontend album data) first, then the track object, then API call as last resort. The album tracks response already has correct track_position and disk_number from Deezer — no API call needed.
This commit is contained in:
parent
cab12b61a6
commit
4baf5e53d4
1 changed files with 33 additions and 18 deletions
|
|
@ -24552,23 +24552,43 @@ def _attempt_download_with_candidates(task_id, candidates, track, batch_id=None)
|
||||||
enhanced_payload['artists'] = [{'name': artist} for artist in track.artists] if track.artists else []
|
enhanced_payload['artists'] = [{'name': artist} for artist in track.artists] if track.artists else []
|
||||||
print(f"✨ [Context] Using clean Spotify metadata - Album: '{track.album}', Title: '{track.name}'")
|
print(f"✨ [Context] Using clean Spotify metadata - Album: '{track.album}', Title: '{track.name}'")
|
||||||
|
|
||||||
# CRITICAL FIX: Get track_number and disc_number from Spotify API like GUI does
|
# Get track_number and disc_number — prefer track data we already have,
|
||||||
if hasattr(track, 'id') and track.id:
|
# fall back to detailed API call only if needed
|
||||||
|
got_track_number = False
|
||||||
|
|
||||||
|
# 1. Try track_info (from frontend, has album track data)
|
||||||
|
tn = track_info.get('track_number', 0) if isinstance(track_info, dict) else 0
|
||||||
|
dn = track_info.get('disc_number', 1) if isinstance(track_info, dict) else 1
|
||||||
|
if tn and tn > 0:
|
||||||
|
enhanced_payload['track_number'] = tn
|
||||||
|
enhanced_payload['disc_number'] = dn
|
||||||
|
got_track_number = True
|
||||||
|
print(f"🔢 [Context] Added track_number from track_info: {tn}, disc_number: {dn}")
|
||||||
|
|
||||||
|
# 2. Try the track object itself (from album tracks response)
|
||||||
|
if not got_track_number and hasattr(track, 'track_number') and track.track_number:
|
||||||
|
enhanced_payload['track_number'] = track.track_number
|
||||||
|
enhanced_payload['disc_number'] = getattr(track, 'disc_number', 1) or 1
|
||||||
|
got_track_number = True
|
||||||
|
print(f"🔢 [Context] Added track_number from track object: {track.track_number}, disc_number: {enhanced_payload['disc_number']}")
|
||||||
|
|
||||||
|
# 3. Last resort — fetch from metadata source API
|
||||||
|
if not got_track_number and hasattr(track, 'id') and track.id:
|
||||||
try:
|
try:
|
||||||
detailed_track = spotify_client.get_track_details(track.id)
|
detailed_track = spotify_client.get_track_details(track.id)
|
||||||
if detailed_track and 'track_number' in detailed_track:
|
if detailed_track and detailed_track.get('track_number'):
|
||||||
enhanced_payload['track_number'] = detailed_track['track_number']
|
enhanced_payload['track_number'] = detailed_track['track_number']
|
||||||
enhanced_payload['disc_number'] = detailed_track.get('disc_number', 1)
|
enhanced_payload['disc_number'] = detailed_track.get('disc_number', 1)
|
||||||
print(f"🔢 [Context] Added Spotify track_number: {detailed_track['track_number']}, disc_number: {enhanced_payload['disc_number']}")
|
got_track_number = True
|
||||||
|
print(f"🔢 [Context] Added track_number from API: {detailed_track['track_number']}, disc_number: {enhanced_payload['disc_number']}")
|
||||||
|
|
||||||
# Backfill album metadata from detailed track when fallback path
|
# Backfill album metadata from detailed track when fallback path
|
||||||
# produced incomplete data (e.g. album was a plain string from
|
# produced incomplete data
|
||||||
# discovery playlists, or release_date missing from track listing)
|
|
||||||
if not has_explicit_context and isinstance(detailed_track.get('album'), dict):
|
if not has_explicit_context and isinstance(detailed_track.get('album'), dict):
|
||||||
dt_album = detailed_track['album']
|
dt_album = detailed_track['album']
|
||||||
if not spotify_album_context.get('release_date') and dt_album.get('release_date'):
|
if not spotify_album_context.get('release_date') and dt_album.get('release_date'):
|
||||||
spotify_album_context['release_date'] = dt_album['release_date']
|
spotify_album_context['release_date'] = dt_album['release_date']
|
||||||
print(f"📅 [Context] Backfilled release_date from Spotify API: {dt_album['release_date']}")
|
print(f"📅 [Context] Backfilled release_date from API: {dt_album['release_date']}")
|
||||||
if dt_album.get('album_type') and not fallback_album.get('album_type'):
|
if dt_album.get('album_type') and not fallback_album.get('album_type'):
|
||||||
spotify_album_context['album_type'] = dt_album['album_type']
|
spotify_album_context['album_type'] = dt_album['album_type']
|
||||||
if not spotify_album_context.get('total_tracks') and dt_album.get('total_tracks'):
|
if not spotify_album_context.get('total_tracks') and dt_album.get('total_tracks'):
|
||||||
|
|
@ -24576,18 +24596,13 @@ def _attempt_download_with_candidates(task_id, candidates, track, batch_id=None)
|
||||||
if not spotify_album_context.get('name') or spotify_album_context['name'] == track.album:
|
if not spotify_album_context.get('name') or spotify_album_context['name'] == track.album:
|
||||||
if dt_album.get('name'):
|
if dt_album.get('name'):
|
||||||
spotify_album_context['name'] = dt_album['name']
|
spotify_album_context['name'] = dt_album['name']
|
||||||
else:
|
|
||||||
enhanced_payload['track_number'] = track_info.get('track_number', 1)
|
|
||||||
enhanced_payload['disc_number'] = track_info.get('disc_number', 1)
|
|
||||||
print(f"⚠️ [Context] No track_number in detailed_track, using track_info fallback: {enhanced_payload['track_number']}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
enhanced_payload['track_number'] = track_info.get('track_number') or track.track_number if hasattr(track, 'track_number') else 0
|
print(f"⚠️ [Context] API track details failed: {e}")
|
||||||
enhanced_payload['disc_number'] = track_info.get('disc_number') or track.disc_number if hasattr(track, 'disc_number') else 1
|
|
||||||
print(f"❌ [Context] Error getting track_number, using track_info fallback: {enhanced_payload['track_number']} ({e})")
|
if not got_track_number:
|
||||||
else:
|
enhanced_payload.setdefault('track_number', 0)
|
||||||
enhanced_payload['track_number'] = track_info.get('track_number', 1)
|
enhanced_payload.setdefault('disc_number', 1)
|
||||||
enhanced_payload['disc_number'] = track_info.get('disc_number', 1)
|
print(f"⚠️ [Context] No track_number found from any source")
|
||||||
print(f"⚠️ [Context] No track.id available, using track_info fallback track_number: {enhanced_payload['track_number']}")
|
|
||||||
|
|
||||||
# Determine if this should be treated as album download
|
# Determine if this should be treated as album download
|
||||||
# First check if we have explicit album context from artist page
|
# First check if we have explicit album context from artist page
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue