From 7e8fed9bd72b7495b2c35b3cb0f6826ff6d7bef2 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 }; }); }