Complete Phase C (custom commands & yt-dlp updater) and Phase D (library, UX & notifications)
Phase C had been implemented in the working tree but never committed: named custom-command templates (CRUD + per-download override), command preview, and the in-app yt-dlp self-updater. Phase D adds: history search/kind-filter/multi-select/bulk-delete/ re-download; native OS notifications on completion/failure; a private/ incognito download mode that skips history; settings+template backup/ restore via JSON; and a persistent error log surfaced as a Diagnostics report in Settings. See ROADMAP.md for the full per-item breakdown. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+63
-15
@@ -84,24 +84,72 @@ smoke test.*
|
||||
The archive file lives at a fixed `userData/download-archive.txt`
|
||||
(`getDownloadArchivePath()` in `src/main/settings.ts`), not user-configurable.
|
||||
|
||||
## Phase C — Custom commands & yt-dlp management
|
||||
## Phase C — Custom commands & yt-dlp management ✅ COMPLETE
|
||||
|
||||
- [ ] **Custom command templates.** Named, editable templates of extra yt-dlp args; pick a
|
||||
default; a "run custom command" mode. Needs persistence + a template editor view.
|
||||
- [ ] **Command preview.** Show the exact yt-dlp command line before running (build the argv
|
||||
and render it).
|
||||
- [ ] **In-app yt-dlp updater** with stable/nightly channel (`--update-to`, or fetch the
|
||||
release exe), surfaced next to the existing version check.
|
||||
Named `CommandTemplate`s (`src/shared/ipc.ts`) persist to `templates.json`
|
||||
(`src/main/templates.ts`, mirrors `history.ts`'s plain-JSON pattern) and are managed
|
||||
inline in **Settings → Custom commands** via `TemplateManager.tsx` — no modal, matching
|
||||
the rest of the app's no-portal-overlay convention (see the Hint/Select comments re:
|
||||
this dev machine's GPU/driver). A template's extra yt-dlp flags are shell-split
|
||||
(`parseExtraArgs`, `src/main/buildArgs.ts`) and appended to the generated argv
|
||||
immediately before the `--` URL terminator, so a template flag can override anything
|
||||
chosen earlier. `Settings.customCommandEnabled` + `defaultTemplateId` apply a template
|
||||
to every new download; the download bar's own **Custom command** panel lets a single
|
||||
download override that default or opt out entirely (`extraArgs` on
|
||||
`StartDownloadOptions`, mirroring the existing per-download `options` override).
|
||||
`buildCommand()` (`src/main/download.ts`) now centralises settings/access/
|
||||
options/extraArgs resolution, shared by both the real `startDownload` spawn and the new
|
||||
preview path. All items verified in the UI preview + `npm run typecheck` +
|
||||
`npm run test` (11 new unit tests covering `parseExtraArgs`, `formatCommandLine`, and
|
||||
extraArgs ordering). *Caveat: the extra-args splitting and command construction were
|
||||
validated by reasoning + tests, not yet by a real yt-dlp run with actual custom flags —
|
||||
worth a real-download smoke test pass, same as Phase A/B.*
|
||||
|
||||
## Phase D — Library, UX & notifications
|
||||
- [x] **Custom command templates.** Named, editable templates of extra yt-dlp args
|
||||
(`CommandTemplate`), CRUD'd inline via `TemplateManager.tsx`; persisted to
|
||||
`templates.json`. **Pick a default** via `Settings.defaultTemplateId` (a Select in
|
||||
the Custom commands card). The **"run custom command" mode** is
|
||||
`Settings.customCommandEnabled`, applied to every new download unless overridden
|
||||
per-download in the download bar's Custom command panel.
|
||||
- [x] **Command preview.** `IpcChannels.commandPreview` → `previewCommand()`
|
||||
(`src/main/download.ts`) builds the exact argv via the same `buildCommand()` path
|
||||
a real download would take, then renders it with `formatCommandLine`. Surfaced as
|
||||
a **Preview command** button in the download bar, with a Copy button.
|
||||
- [x] **In-app yt-dlp updater.** `updateYtdlp(channel)` (`src/main/ytdlp.ts`) runs
|
||||
yt-dlp's own `--update-to stable|nightly`. Surfaced in **Settings → About**, right
|
||||
next to the existing version check, with a channel picker + result output.
|
||||
|
||||
- [ ] **History search + multi-select + filter** (video/audio) + bulk delete + **re-download**.
|
||||
Schema already exists in `src/shared/ipc.ts`; needs UI + likely the planned move to
|
||||
better-sqlite3.
|
||||
- [ ] **Native OS notifications** on completion / failure (Electron `Notification`).
|
||||
- [ ] **Private / incognito mode** — a download that skips history.
|
||||
- [ ] **Backup / restore** settings + templates (export / import JSON).
|
||||
- [ ] **Error log / copy error report** view (Seal's debug report).
|
||||
## Phase D — Library, UX & notifications ✅ COMPLETE
|
||||
|
||||
History stays plain JSON (`history.json`, 500-entry cap) — search/filter/select are done
|
||||
client-side over the already-small array, so the planned better-sqlite3 migration wasn't
|
||||
needed for this phase and was deliberately skipped to avoid a native-module build step for
|
||||
no functional gain at this scale. Failed downloads (pre-spawn rejections and in-flight
|
||||
yt-dlp failures alike) now persist to a new `errorlog.json` (`src/main/errorlog.ts`,
|
||||
200-entry cap) independent of the queue, so a report survives `Clear finished`. Native
|
||||
notifications and the backup file both reuse existing settings/templates plumbing
|
||||
(`getSettings`/`setSettings`, `listTemplates`/the new `replaceTemplates`) rather than adding
|
||||
parallel storage. All items verified in the UI preview (typecheck + `npm run test` clean).
|
||||
|
||||
- [x] **History search + multi-select + filter** (video/audio) + bulk delete + **re-download**.
|
||||
`HistoryView.tsx` gained a search box, an All/Video/Audio filter, a "Select" mode with
|
||||
per-row checkboxes + select-all + **Delete selected** (new `historyRemoveMany` IPC,
|
||||
`src/main/history.ts`), and a per-row re-download button that re-queues the entry's
|
||||
URL/kind/quality via the existing `addFromUrl`.
|
||||
- [x] **Native OS notifications** on completion / failure (Electron `Notification`,
|
||||
`src/main/download.ts`). Gated by a new **Notify when downloads finish** switch
|
||||
(`Settings.notifyOnComplete`, default on); clicking a notification refocuses the window.
|
||||
- [x] **Private / incognito mode** — a download bar toggle (`DownloadBar.tsx`, sticky like an
|
||||
incognito tab) sets `DownloadItem.incognito`, which `store/downloads.ts` checks before
|
||||
ever calling `useHistory().add(...)`. Queue items show an eye-off badge when private.
|
||||
- [x] **Backup / restore** settings + templates (export / import JSON). New
|
||||
`src/main/backup.ts` writes/reads `{ settings, templates }` via a save/open dialog;
|
||||
`replaceTemplates()` (`src/main/templates.ts`) does a full restore rather than a
|
||||
merge-by-id. Surfaced as **Settings → Backup & restore**.
|
||||
- [x] **Error log / copy error report** view (Seal's debug report). New
|
||||
`src/main/errorlog.ts` persists every failure (pre-spawn rejection, spawn error, or
|
||||
non-zero yt-dlp exit); **Settings → Diagnostics** lists recent entries with
|
||||
**Copy full report** and **Clear log**.
|
||||
|
||||
## Phase E — Theming & platform polish
|
||||
|
||||
|
||||
Reference in New Issue
Block a user