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:
+85
-1
@@ -18,12 +18,22 @@ export const IpcChannels = {
|
||||
historyList: 'history:list',
|
||||
historyAdd: 'history:add',
|
||||
historyRemove: 'history:remove',
|
||||
historyRemoveMany: 'history:remove-many',
|
||||
historyClear: 'history:clear',
|
||||
/** main → renderer push channel for live download events */
|
||||
downloadEvent: 'download:event',
|
||||
cookiesLogin: 'cookies:login',
|
||||
cookiesStatus: 'cookies:status',
|
||||
cookiesClear: 'cookies:clear'
|
||||
cookiesClear: 'cookies:clear',
|
||||
templatesList: 'templates:list',
|
||||
templatesSave: 'templates:save',
|
||||
templatesRemove: 'templates:remove',
|
||||
commandPreview: 'command:preview',
|
||||
ytdlpUpdate: 'ytdlp:update',
|
||||
errorLogList: 'errorlog:list',
|
||||
errorLogClear: 'errorlog:clear',
|
||||
backupExport: 'backup:export',
|
||||
backupImport: 'backup:import'
|
||||
} as const
|
||||
|
||||
/** Sentinel format id meaning "let yt-dlp pick the best video+audio". */
|
||||
@@ -128,6 +138,16 @@ export interface YtdlpVersionResult {
|
||||
error?: string
|
||||
}
|
||||
|
||||
/** yt-dlp's self-update release channel (`--update-to <channel>`). */
|
||||
export type YtdlpUpdateChannel = 'stable' | 'nightly'
|
||||
|
||||
export interface YtdlpUpdateResult {
|
||||
ok: boolean
|
||||
/** yt-dlp's own update output, e.g. "Updated to ... " or "yt-dlp is up to date" */
|
||||
output?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
/** A single selectable output format, derived from `yt-dlp -J`. */
|
||||
export interface FormatOption {
|
||||
/** yt-dlp format_id, or BEST_FORMAT_ID for the auto-best option */
|
||||
@@ -198,6 +218,14 @@ export interface StartDownloadOptions {
|
||||
formatHasAudio?: boolean
|
||||
/** per-download post-processing override; main falls back to settings defaults */
|
||||
options?: DownloadOptions
|
||||
/**
|
||||
* Per-download custom-command override: raw extra yt-dlp flags appended to
|
||||
* the generated argv (see CommandTemplate). Omit to fall back to the
|
||||
* persisted settings default (customCommandEnabled + defaultTemplateId);
|
||||
* pass an empty string to explicitly run with no extra args for just this
|
||||
* download even when the settings default is enabled.
|
||||
*/
|
||||
extraArgs?: string
|
||||
}
|
||||
|
||||
export interface StartDownloadResult {
|
||||
@@ -262,6 +290,32 @@ export interface Settings {
|
||||
restrictFilenames: boolean
|
||||
/** record completed downloads in a yt-dlp --download-archive file to skip repeats */
|
||||
downloadArchive: boolean
|
||||
/** apply a named custom-command template's extra args to every new download */
|
||||
customCommandEnabled: boolean
|
||||
/** id of the CommandTemplate applied when customCommandEnabled is on; null = none picked yet */
|
||||
defaultTemplateId: string | null
|
||||
/** show a native OS notification when a download finishes or fails */
|
||||
notifyOnComplete: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* A named, reusable set of extra yt-dlp CLI flags (Phase C "custom commands"),
|
||||
* e.g. name: 'Write thumbnail + no mtime', args: '--write-thumbnail --no-mtime'.
|
||||
* Shell-split (see parseExtraArgs) and appended to the generated argv just
|
||||
* before the `--` URL terminator, so they can override earlier flags.
|
||||
*/
|
||||
export interface CommandTemplate {
|
||||
id: string
|
||||
name: string
|
||||
args: string
|
||||
}
|
||||
|
||||
/** Result of building the exact yt-dlp command line for the current form state, without running it. */
|
||||
export interface CommandPreviewResult {
|
||||
ok: boolean
|
||||
/** full command line (binary + quoted args), for display/copy only */
|
||||
command?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
/** Whether the built-in sign-in window has ever saved a cookie file, and when. */
|
||||
@@ -293,3 +347,33 @@ export interface HistoryEntry {
|
||||
/** epoch milliseconds */
|
||||
completedAt: number
|
||||
}
|
||||
|
||||
/**
|
||||
* A failed download or download-start attempt, persisted to errorlog.json
|
||||
* (newest-first) so the report survives the queue item being cleared —
|
||||
* Seal's "debug report" equivalent.
|
||||
*/
|
||||
export interface ErrorLogEntry {
|
||||
id: string
|
||||
/** resolved video title when known; falls back to the URL in the UI */
|
||||
title?: string
|
||||
url: string
|
||||
kind: MediaKind
|
||||
error: string
|
||||
/** epoch milliseconds */
|
||||
occurredAt: number
|
||||
}
|
||||
|
||||
/** Result of exporting settings + custom-command templates to a JSON file. */
|
||||
export interface BackupExportResult {
|
||||
ok: boolean
|
||||
/** absolute path written to, present when ok is true */
|
||||
path?: string
|
||||
error?: string
|
||||
}
|
||||
|
||||
/** Result of restoring settings + custom-command templates from a JSON file. */
|
||||
export interface BackupImportResult {
|
||||
ok: boolean
|
||||
error?: string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user