From 26c465118b48547b9895871a6cbdff472a7a1cbd Mon Sep 17 00:00:00 2001 From: Markury Date: Sat, 4 Oct 2025 14:43:37 -0400 Subject: [PATCH] fix: missing cover art in playlist downloads Playlist downloads were not fetching album cover URLs, causing both embedded cover art and folder cover.jpg files to be skipped. Queue manager now fetches album data on-demand (only when cover art is enabled) to get cover URLs, reusing the same logic as individual track downloads. Fetches track data first if albumId is missing. --- src/lib/services/deezer/queueManager.ts | 52 +++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/lib/services/deezer/queueManager.ts b/src/lib/services/deezer/queueManager.ts index 4601a59..d6cb7ec 100644 --- a/src/lib/services/deezer/queueManager.ts +++ b/src/lib/services/deezer/queueManager.ts @@ -197,6 +197,48 @@ export class DeezerQueueManager { console.log('[DeezerQueueManager] Queue processor stopped'); } + /** + * Ensure track has cover art URL by fetching album data if needed + * Reuses the same logic as addToQueue for consistency + */ + private async ensureCoverUrl(track: DeezerTrack): Promise { + // Skip if already has cover URL + if (track.albumCoverUrl) { + return; + } + + // Skip if no album ID to fetch with + if (!track.albumId || track.albumId === 0) { + console.log(`[DeezerQueueManager] Track "${track.title}" has no albumId, fetching track data...`); + + // Fetch track data to get album ID + try { + const trackData = await deezerAPI.getTrack(track.id.toString()); + if (trackData && trackData.ALB_ID) { + track.albumId = parseInt(trackData.ALB_ID.toString(), 10); + } else { + console.warn(`[DeezerQueueManager] Could not get album ID for track "${track.title}"`); + return; + } + } catch (error) { + console.warn(`[DeezerQueueManager] Error fetching track data for "${track.title}":`, error); + return; + } + } + + // Fetch album data for cover art URL + try { + const albumData = await deezerAPI.getAlbumData(track.albumId.toString()); + if (albumData?.ALB_PICTURE) { + track.albumCoverUrl = `https://e-cdns-images.dzcdn.net/images/cover/${albumData.ALB_PICTURE}/500x500-000000-80-0-0.jpg`; + track.albumCoverXlUrl = `https://e-cdns-images.dzcdn.net/images/cover/${albumData.ALB_PICTURE}/1000x1000-000000-80-0-0.jpg`; + console.log(`[DeezerQueueManager] Fetched cover URL for "${track.title}"`); + } + } catch (error) { + console.warn(`[DeezerQueueManager] Could not fetch album data for track "${track.title}":`, error); + } + } + /** * Download a single track */ @@ -215,6 +257,11 @@ export class DeezerQueueManager { } deezerAPI.setArl(authState.arl); + // Ensure track has cover URL if cover art is enabled + if (appSettings.embedCoverArt || appSettings.saveCoverToFolder) { + await this.ensureCoverUrl(track); + } + // Get user data for license token const userData = await deezerAPI.getUserData(); const licenseToken = userData.USER?.OPTIONS?.license_token; @@ -353,6 +400,11 @@ export class DeezerQueueManager { } }); + // Ensure track has cover URL if cover art is enabled + if (appSettings.embedCoverArt || appSettings.saveCoverToFolder) { + await this.ensureCoverUrl(track); + } + const userData = await deezerAPI.getUserData(); const licenseToken = userData.USER?.OPTIONS?.license_token;