From 53a3e80c059913e6d19f890c49ec0b567463fb01 Mon Sep 17 00:00:00 2001 From: XShine555 Date: Thu, 16 Jul 2026 17:00:35 +0200 Subject: [PATCH] fix(frontend): stop duplicating YouTube tracks in recently played after download The queue/history identity for a song originating on YouTube now always uses its videoId, instead of switching to the local track id once it finishes downloading. Previously that switch made the same song produce two separate entries when merging session and server listening history. --- frontend/src/lib/player/player.svelte.ts | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/frontend/src/lib/player/player.svelte.ts b/frontend/src/lib/player/player.svelte.ts index e836b85..a74e83b 100644 --- a/frontend/src/lib/player/player.svelte.ts +++ b/frontend/src/lib/player/player.svelte.ts @@ -37,27 +37,35 @@ export interface ApiTrackLike { audioStatus?: 'Pending' | 'Processing' | 'Completed' | 'Failed'; } -export function isPendingYouTubeTrack(track: ApiTrackLike): boolean { - return track.source === 'YouTube' && track.audioStatus !== 'Completed'; +export function isYouTubeTrack(track: ApiTrackLike): boolean { + return track.source === 'YouTube'; } -export function queueIdForTrack(track: ApiTrackLike): string | number { - return isPendingYouTubeTrack(track) && track.externalId ? track.externalId : track.id; +export function isPendingYouTubeTrack(track: ApiTrackLike): boolean { + return isYouTubeTrack(track) && track.audioStatus !== 'Completed'; } export function youTubeThumbnailUrl(videoId: string): string { return `https://i.ytimg.com/vi/${videoId}/mqdefault.jpg`; } +export function queueIdForTrack(track: ApiTrackLike): string | number { + return isYouTubeTrack(track) && track.externalId ? track.externalId : track.id; +} + export function toQueueItems(tracks: ApiTrackLike[]): QueueItem[] { return tracks.map((track) => { - const pendingYouTube = isPendingYouTubeTrack(track); + const youTube = isYouTubeTrack(track); return { id: queueIdForTrack(track), title: track.title, artist: track.artist, - source: pendingYouTube ? 'youtube' : 'local', - coverUrl: pendingYouTube && track.externalId ? youTubeThumbnailUrl(track.externalId) : undefined + source: youTube ? 'youtube' : 'local', + coverUrl: youTube + ? isPendingYouTubeTrack(track) && track.externalId + ? youTubeThumbnailUrl(track.externalId) + : `/api/tracks/${track.id}/cover?size=small` + : undefined }; }); }