feat(playlist): exact-format-per-item selection

Each video row in the playlist panel gets an exact-format button that
lazily probes just that entry's URL (reusing the existing single-video
probe IPC, no new main-process code) and shows a native Select of its
real formats. The choice flows through addMany -> formatId per queue
item. Probing is on-demand per row, never all up front, since a
playlist can hold thousands of entries and per-entry probes are
rate-limited.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 16:55:58 -04:00
parent 5c88d9c8e0
commit 4c2b54a599
7 changed files with 424 additions and 55 deletions
+8 -2
View File
@@ -363,8 +363,14 @@ per-item `options`) but not the surfaces. typecheck + test + `npm run build` cle
- [x] **Per-playlist-item editing.** *Done: the playlist panel in `DownloadBar.tsx` gained a
per-row video/audio toggle + **All video** / **All audio** batch buttons; `addPlaylist`
enqueues via `addMany` with each entry's own kind (quality falls back to that kind's
default). Per-item exact-format selection (needs probing each entry) left as a further
extension.*
default).*
- [x] **Per-playlist exact-format-per-item.** *Done: each video row in the playlist panel has an
**exact-format** button that lazily probes just that entry's URL (reusing the single-video
`probe` IPC — no new main code) and reveals a native `<Select>` of that entry's real formats;
the pick is carried as a `ChosenFormat` and flows through `addMany``formatId` per queue
item. Probing is on-demand per row (never all up front — playlists can be huge / rate-limited).
Flipping a row to audio drops its format. Pure mapping in `downloadBar/playlistEntries.ts`,
unit-tested (`test/playlistEntries.test.ts`); verified end-to-end in the preview harness.*
- [x] **Weighted format sorting ("format aspect importance").** *Done: a `formatSort` field on
`DownloadOptions` (raw yt-dlp `-S` string); when set it emits `-S <value>`, overriding the
codec tiebreaker (`buildArgs.ts`); an "advanced" input in `DownloadOptionsForm`. Unit-tested.*