From ce3bbd86c8346c9694f7452c0ae3c5f94d4151bd Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:10:54 -0700 Subject: [PATCH] Fix $year template variable empty for playlist/sync downloads & empty bracket cleanup Two issues fixed: 1. Download Missing modal fallback path hardcoded release_date: '' and discarded album metadata that discovery had already found on track_info. Now extracts release_date, image_url, album_type, and total_tracks from the enriched track data, fixing empty $year for all non-album-page downloads (playlist syncs, wishlist, Tidal/streaming sources). 2. _sanitize_context_values turned empty strings into '_' via _sanitize_filename, so template cleanup regex couldn't match empty brackets like (). Now skips sanitization for empty strings so the existing () [] {} cleanup works correctly. --- web_server.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/web_server.py b/web_server.py index 6954ed25..1b685b91 100644 --- a/web_server.py +++ b/web_server.py @@ -12649,7 +12649,7 @@ def _sanitize_context_values(context: dict) -> dict: """ sanitized = {} for key, value in context.items(): - if isinstance(value, str): + if isinstance(value, str) and value: sanitized[key] = _sanitize_filename(value) else: sanitized[key] = value @@ -22106,8 +22106,27 @@ def _attempt_download_with_candidates(task_id, candidates, track, batch_id=None) print(f"🎵 [Explicit Context] Using real album data: '{spotify_album_context['name']}' ({spotify_album_context['album_type']}, {spotify_album_context['total_discs']} disc(s))") else: # Fallback to generic context for playlists/wishlists + # Extract album metadata from track_info if available (discovery enriches tracks with full album objects) + fallback_album = track_info.get('album', {}) if track_info else {} + if isinstance(fallback_album, str): + fallback_album = {'name': fallback_album} + elif not isinstance(fallback_album, dict): + fallback_album = {} + fallback_image_url = None + fallback_images = fallback_album.get('images', []) + if fallback_album.get('image_url'): + fallback_image_url = fallback_album['image_url'] + elif fallback_images and isinstance(fallback_images, list) and len(fallback_images) > 0: + fallback_image_url = fallback_images[0].get('url') if isinstance(fallback_images[0], dict) else None spotify_artist_context = {'id': 'from_sync_modal', 'name': track.artists[0] if track.artists else 'Unknown', 'genres': []} - spotify_album_context = {'id': 'from_sync_modal', 'name': track.album, 'release_date': '', 'image_url': None, 'album_type': 'album'} + spotify_album_context = { + 'id': fallback_album.get('id', 'from_sync_modal'), + 'name': fallback_album.get('name', '') or track.album, + 'release_date': fallback_album.get('release_date', ''), + 'image_url': fallback_image_url, + 'album_type': fallback_album.get('album_type', 'album'), + 'total_tracks': fallback_album.get('total_tracks', 0) + } download_payload = candidate.__dict__