From 15c22295392100d70ef54815979fb17bf91ed933 Mon Sep 17 00:00:00 2001 From: debont80 Date: Thu, 2 Jul 2026 17:05:29 -0400 Subject: [PATCH] fix(playlist): drop stale per-item formats on re-probe Peer-review of the exact-format-per-item feature: re-clicking "Preview formats" on an already-loaded playlist reset info/playlist but left itemFormats/itemFormatOptions/formatExpanded keyed by position, so a stale exact-format pick could silently reattach to a different video landing at the same index in the new probe result and flow into addPlaylist(). Extracted resetPlaylistItemState() and call it from both clearProbe() and fetchFormats(). Co-Authored-By: Claude Sonnet 5 --- .../components/downloadBar/useDownloadBar.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/renderer/src/components/downloadBar/useDownloadBar.ts b/src/renderer/src/components/downloadBar/useDownloadBar.ts index 8ac30cc..e6ec2f4 100644 --- a/src/renderer/src/components/downloadBar/useDownloadBar.ts +++ b/src/renderer/src/components/downloadBar/useDownloadBar.ts @@ -281,11 +281,11 @@ export function useDownloadBar(): DownloadBarController { playlist === null && probeError === null - function clearProbe(): void { - setInfo(null) - setProbeError(null) - setFormatId('') - setPlaylist(null) + // Per-entry format state is keyed by playlist position, so it must be dropped + // any time the playlist itself is dropped or re-fetched -- otherwise a stale + // exact-format pick from a prior probe can silently reattach to a different + // video that lands at the same index in the new result. + function resetPlaylistItemState(): void { setSelected(new Set()) setItemKinds({}) setFormatExpanded(new Set()) @@ -295,6 +295,14 @@ export function useDownloadBar(): DownloadBarController { setFormatProbeError({}) } + function clearProbe(): void { + setInfo(null) + setProbeError(null) + setFormatId('') + setPlaylist(null) + resetPlaylistItemState() + } + // Reset the whole bar after a download / playlist is enqueued: clear the URL + // probe and drop the one-shot overrides (trim / schedule / advanced / incognito / // per-download options) so the next download starts from the global defaults. @@ -387,6 +395,7 @@ export function useDownloadBar(): DownloadBarController { setProbeError(null) setInfo(null) setPlaylist(null) + resetPlaylistItemState() // Probing may switch the URL to the format-picker path, changing the command. setCommandPreview(null) try {