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.
This commit is contained in:
2026-07-16 17:00:35 +02:00
parent 8684067235
commit 53a3e80c05
+15 -7
View File
@@ -37,27 +37,35 @@ export interface ApiTrackLike {
audioStatus?: 'Pending' | 'Processing' | 'Completed' | 'Failed'; audioStatus?: 'Pending' | 'Processing' | 'Completed' | 'Failed';
} }
export function isPendingYouTubeTrack(track: ApiTrackLike): boolean { export function isYouTubeTrack(track: ApiTrackLike): boolean {
return track.source === 'YouTube' && track.audioStatus !== 'Completed'; return track.source === 'YouTube';
} }
export function queueIdForTrack(track: ApiTrackLike): string | number { export function isPendingYouTubeTrack(track: ApiTrackLike): boolean {
return isPendingYouTubeTrack(track) && track.externalId ? track.externalId : track.id; return isYouTubeTrack(track) && track.audioStatus !== 'Completed';
} }
export function youTubeThumbnailUrl(videoId: string): string { export function youTubeThumbnailUrl(videoId: string): string {
return `https://i.ytimg.com/vi/${videoId}/mqdefault.jpg`; 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[] { export function toQueueItems(tracks: ApiTrackLike[]): QueueItem[] {
return tracks.map((track) => { return tracks.map((track) => {
const pendingYouTube = isPendingYouTubeTrack(track); const youTube = isYouTubeTrack(track);
return { return {
id: queueIdForTrack(track), id: queueIdForTrack(track),
title: track.title, title: track.title,
artist: track.artist, artist: track.artist,
source: pendingYouTube ? 'youtube' : 'local', source: youTube ? 'youtube' : 'local',
coverUrl: pendingYouTube && track.externalId ? youTubeThumbnailUrl(track.externalId) : undefined coverUrl: youTube
? isPendingYouTubeTrack(track) && track.externalId
? youTubeThumbnailUrl(track.externalId)
: `/api/tracks/${track.id}/cover?size=small`
: undefined
}; };
}); });
} }