From 28d8dbf5e03343cc622d557865434b7030d33b6a Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 25 Nov 2025 23:34:56 -0800 Subject: [PATCH] fix listenbrainz wishlist comp --- web_server.py | 33 +++++++++++++++++++++++++++------ webui/static/script.js | 8 ++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/web_server.py b/web_server.py index 96340b5c..c99be1f7 100644 --- a/web_server.py +++ b/web_server.py @@ -9373,22 +9373,33 @@ def _ensure_spotify_track_format(track_info): else: artists_list.append({'name': 'Unknown Artist'}) + # Build album object with images if available + album_data = track_info.get('album', {}) + if isinstance(album_data, dict): + album = { + 'name': album_data.get('name', 'Unknown Album') + } + # Preserve album images if present (important for ListenBrainz tracks) + if 'images' in album_data: + album['images'] = album_data['images'] + else: + album = { + 'name': str(album_data) if album_data else 'Unknown Album' + } + # Build proper Spotify track structure spotify_track = { 'id': track_info.get('id', f"webui_{hash(str(track_info))}"), 'name': track_info.get('name', 'Unknown Track'), 'artists': artists_list, # Proper Spotify format - 'album': { - 'name': track_info.get('album', {}).get('name') if isinstance(track_info.get('album'), dict) - else track_info.get('album', 'Unknown Album') - }, + 'album': album, 'duration_ms': track_info.get('duration_ms', 0), 'preview_url': track_info.get('preview_url'), 'external_urls': track_info.get('external_urls', {}), 'popularity': track_info.get('popularity', 0), 'source': 'webui_modal' # Mark as coming from webui } - + return spotify_track def _process_failed_tracks_to_wishlist_exact(batch_id): @@ -9672,7 +9683,17 @@ def _on_download_completed(batch_id, task_id, success=True): # Add activity for successful download track_name = track_info.get('name', 'Unknown Track') - artist_name = track_info.get('artists', [{}])[0].get('name', 'Unknown Artist') if track_info.get('artists') else 'Unknown Artist' + + # Safely extract artist name (handle both list and string formats) + artists = track_info.get('artists', []) + if isinstance(artists, list) and len(artists) > 0: + first_artist = artists[0] + artist_name = first_artist.get('name', 'Unknown Artist') if isinstance(first_artist, dict) else str(first_artist) + elif isinstance(artists, str): + artist_name = artists + else: + artist_name = 'Unknown Artist' + add_activity_item("📥", "Download Complete", f"'{track_name}' by {artist_name}", "Now") # Try to remove from wishlist using track info diff --git a/webui/static/script.js b/webui/static/script.js index e737f3c4..18fc6580 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -28663,12 +28663,12 @@ async function openListenBrainzPlaylist(playlistMbid, playlistName) { // Convert to Spotify-like format for compatibility with download modal const spotifyTracks = tracks.map(track => ({ - id: track.recording_mbid || '', + id: track.recording_mbid || `listenbrainz_${track.title}_${track.creator}`.replace(/[^a-z0-9]/gi, '_'), // Generate ID if missing name: track.title || 'Unknown', artists: [{name: cleanArtistName(track.creator || 'Unknown')}], // Proper Spotify format album: { name: track.album || 'Unknown Album', - images: [] + images: track.album_cover_url ? [{url: track.album_cover_url}] : [] }, duration_ms: track.duration_ms || 0, listenbrainz_metadata: track.additional_metadata @@ -30272,7 +30272,7 @@ async function rehydrateDiscoverDownloadModal(playlistId) { // Convert to Spotify format const spotifyTracks = tracks.map(track => ({ - id: null, + id: track.mbid || `listenbrainz_${track.track_name}_${track.artist_name}`.replace(/[^a-z0-9]/gi, '_'), // Generate ID if missing name: track.track_name, artists: [{name: cleanArtistName(track.artist_name)}], // Proper Spotify format album: { @@ -30345,7 +30345,7 @@ async function rehydrateDiscoverDownloadModal(playlistId) { id: track.id, name: track.name, artists: artistsArray, - album: track.album || 'Unknown Album', + album: track.album || {name: 'Unknown Album', images: []}, duration_ms: track.duration_ms || 0, external_urls: track.external_urls || {} };