diff --git a/ROADMAP-PINCHFLAT.md b/ROADMAP-PINCHFLAT.md index 7ebc0f4..4f60734 100644 --- a/ROADMAP-PINCHFLAT.md +++ b/ROADMAP-PINCHFLAT.md @@ -151,10 +151,15 @@ Turn a `MediaItem` into a real per-item download that lands in `Channel / Playli directory chars (`< > : " / \ | ? *`, trailing dots/spaces, reserved names like `CON`). Critical because `--restrict-filenames` only sanitizes the *filename* yt-dlp generates, not the directory segments AeroFetch constructs from channel/playlist names. -- [ ] **Output-path setting.** A new Settings → Downloads field for the folder layout, defaulting +- [x] **Output-path setting.** A new Settings → Downloads field for the folder layout, defaulting to `Channel / Playlist / Title`, with the raw yt-dlp `-o` template exposed for power users (parallels how Phase C exposed raw extra args). Keeps the existing flat - `filenameTemplate` as the default for non-collection downloads. + `filenameTemplate` as the default for non-collection downloads. *Implemented (Batch 26): + `Settings.collectionOutputTemplate` — blank = the built-in `Channel/Playlist/NNN - Title` + layout; a raw yt-dlp `-o` template overrides it for collection downloads. + `collectionOutputTemplate()` (buildArgs) takes the optional custom template; the zod schema + validates it as a safe relative template; surfaced as the "Collection folder layout" field in + Settings → Downloads → Filenames. A Media Profile can override it per-source (Batch 27).* - [x] **"Media Profile" = named download preset.** Pinchflat bundles quality + subs + output template into a reusable Profile. Implemented: a `MediaProfile` = named bundle of `{ kind, quality, options, outputTemplate, extraArgs }` a Source points at via `Source.profileId`.