veodl 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,355 +1,361 @@
1
- # Changelog
2
-
3
- All notable changes to veo. This project follows [Semantic Versioning](https://semver.org/).
4
-
5
- ## 1.11.0
6
-
7
- ### Added
8
-
9
- - **Incognito Downloads**: Added `--incognito` (and `"incognito": true` in configuration/profiles) to save media without creating run records, persistent retry jobs, run archives, download history, `.veo-history` records, or download statistics. Uses an isolated temporary staging directory and completely removes it upon completion, failure, or cancellation, and disables yt-dlp's filesystem cache.
10
- - **Neutral Filenames**: Added `--neutral-filename` (and `"neutralFilename": true`) to generate unidentifiable random filenames (e.g. `video-a1b2c3d4e5f6.mp4`), suppressing video titles, channel names, and custom folder templates in filesystem paths.
11
- - **Subtitle Inspection & Automatic Captions**:
12
- - Added `veo subs <url>` (alias `--list-subs` / `--list-subtitles`) to inspect available manual and automatically generated subtitle tracks, languages, and source formats without downloading.
13
- - Added `--auto-subs` (and `"autoSubs": true`) to download automatically generated captions/subtitles.
14
- - Added `--sub-format <format>` (and `"subFormat": string`) to express a preferred subtitle source format (e.g. `srt/vtt/best`).
15
- - **Post-Download Media Verification**: Added `--verify` (and `"verify": true`) to probe saved media files with FFprobe before recording success, verifying container integrity and stream presence. Retains saved files for inspection if verification fails.
16
-
17
- ## 1.10.1
18
-
19
- ### Added
20
-
21
- - Added `veo <url> --list-qualities` (alias `--list-qualitys`) to list available video resolutions ordered highest first without downloading media. Supports `--json` and discovered `--source <n>`.
22
- - Expanded `--concurrent-fragments` (or `-N`) to support values from 1 to 64. Experimental values between 17 and 64 require interactive `[y/N]` confirmation in terminals, or explicit opt-in via `--experimental-fragments` (or `"experimentalFragments": true` in configuration/profiles) for scripts and automated jobs. Values above 64 are rejected.
23
- - Added support for passing run IDs directly to `--retry-failed` (e.g. `veo --retry-failed <runId>`), automatically locating and resolving the corresponding retry job and rejecting active runs.
24
- - Added clickable OSC 8 directory links for saved file destinations, config paths, and editor headers in supported terminals (Windows Terminal, iTerm2, WezTerm, Kitty, VS Code, and VTE).
25
- - Added inline terminal region support (`createInlineRegion`) to smoothly render live progress and status in place without flickering, entering fullscreen, or wiping terminal scrollback.
26
-
27
- ### Fixed
28
-
29
- - Handled terminal window resize events during live progress display, dynamically refitting titles and status lines.
30
- - Improved terminal title and line wrapping to display up to three lines for long titles before truncating.
31
- - Improved interactive config editor footer layout for long status messages and ensured stdin is paused cleanly upon exit.
32
- - Preserved complete original values in JSON and redirected output while adapting prose output to the active terminal width.
33
-
34
- ## 1.10.0
35
-
36
- ### Added
37
-
38
- - **Persistent Profile Management**: Added `veo profile [NAME|list|reset]` commands to view the active configuration profile, inspect available profiles, switch defaults, or reset back to default without manual configuration edits.
39
- - **On-demand Config Guide**: Added `veo config guide` to display full configuration guidance, supported options, and templates in the terminal without opening the interactive editor.
40
- - **Interactive Config Editor enhancements**:
41
- - Full Undo (`Ctrl+Z`) and Redo (`Ctrl+Y`) history support when modifying settings.
42
- - Select All (`Ctrl+A`) shortcut to easily highlight and overwrite lines or entire sections.
43
- - Interactive F3 guide management prompt (`A` to add/refresh, `R` to strip documentation lines).
44
- - Mouse edge drag auto-scrolling when dragging selections past viewport bounds.
45
- - **Automatic Browser Source Discovery**: Enabled automatic source discovery fallback by default when direct extraction fails, automatically selecting and proceeding if a single verified media stream is found.
46
-
47
- ### Changed
48
-
49
- - Streamlined source discovery observation polling to immediately proceed once candidate streams are detected.
50
- - Enhanced progress output styling and ANSI handling across terminal status reporting.
51
-
52
- ## 1.9.1
53
-
54
- ### Added
55
-
56
- - Added typo and spelling suggestions for misspelled CLI options and subcommands (e.g. `--deepscan` suggests `--deep-scan`, `veo histroy` suggests `veo history`).
57
-
58
- ### Fixed
59
-
60
- - Improved browser-based player source discovery to continuously detect delayed play controls and overlays inside frames.
61
-
62
- ## 1.9.0
63
-
64
- ### Added
65
-
66
- - **Browser-based player source discovery**: Added `veo <page-url> --list-sources` to launch a temporary headless Chrome, Edge or Chromium session, simulate playback, and extract embedded media streams (HLS, DASH, direct MP4/WebM).
67
- - Added `--source <n>` to download or preview (`--dry-run`) a specific discovered source.
68
- - Added `--deep-scan` and `--timeout <duration>` (e.g. `30s`, `2m`) to configure source candidate search depth and deadlines.
69
- - Added interactive source discovery prompt in terminals when direct URL extraction finds no downloadable video.
70
- - Added `autoListSources`, `listSources`, `deepScan`, and `timeout` settings to config defaults and profiles.
71
- - **Config editor improvements**: Enhanced terminal layout with dynamic multi-line detail rows, compact status display, and automatic refresh of the marked template guide for new options.
72
-
73
- ### Fixed
74
-
75
- - Resolved active configuration path properly when running `veo uninstall`.
76
- - Ensured run cancellation requests are processed once per run to avoid race conditions.
77
-
78
- ## 1.8.3
79
-
80
- ### Added
81
-
82
- - Added `veo alias` commands (`list`, `add`, `remove`) to manage custom command names and shortcuts that forward to `veo`.
83
- - Added `veo uninstall` to remove individual aliases with `-p <name>`, or perform a full interactive/planned purge with `--yes`.
84
- - Added `veo up` as a short alias for `veo update`.
85
-
86
- ### Changed
87
-
88
- - Streamlined package binary commands to `veo` and `veodl`.
89
-
90
- ## 1.8.2
91
-
92
- ### Changed
93
-
94
- - Updated repository, issue tracker, and homepage URLs to `Mailo037/veodl`.
95
-
96
- ## 1.8.1
97
-
98
- ### Changed
99
-
100
- - Renamed package to `veodl` on npm.
101
- - Provided `veo`, `veod`, and `veodl` as parallel terminal commands (all execute the same CLI).
102
-
103
- ## 1.8.0
104
-
105
- ### Added
106
-
107
- - **`veo inspect <file>` and `veo inspect run <id>`**: Inspect local container and stream metadata with `--json`. Add `--check-audio` to decode audio tracks and verify signals above -60 dBFS. `veo inspect run <id>` locates saved run files by file identity, size, and sampled SHA-256 fingerprint, even after renames or moves (`--search <directory>`).
108
- - **`veo retry --last`**: Automatically retry the most recent failed or unfinished job without manually locating its job file.
109
- - **`veo history` improvements**: Added `--limit <1-1000>` to customize history entries and `--failed` to view only failed or cancelled attempts with their retry command and persistent `runId`.
110
- - **Config editor clipboard & mouse scrolling**: Added native system clipboard copy/paste (Ctrl+C / Ctrl+V) across Windows, macOS, Linux (Wayland/X11), and Termux, as well as mouse wheel and Ctrl+Up/Down scrolling.
111
- - **Termux desktop opener**: Supported `--open` in Android/Termux using `termux-open`.
112
- - **Agent guidelines**: Included AGENTS.md and docs/AGENT_GUIDE.md in the distributed package.
113
-
114
- ## 1.7.2
115
-
116
- ### Fixed
117
-
118
- - Stale download-history records referencing deleted files are automatically pruned on subsequent downloads, and empty `.veo-history` directories are removed.
119
- - `veo doctor` inspects `.veo-history` records, reports stale duplicate-detection records as warnings, and flags damaged history directories.
120
-
121
- ## 1.7.1
122
-
123
- ### Fixed
124
-
125
- - Progress adapts to narrow terminals, updates one line for parallel downloads, and marks estimated sizes instead of showing premature completion.
126
- - Download errors retain specific HTTP/network codes instead of replacing them with a generic network warning.
127
- - Files announced by a failed yt-dlp process are retained as unconfirmed, not treated as completed transfers; retry requires a successful backend exit.
128
-
129
- ## 1.7.0
130
-
131
- ### Added
132
-
133
- - Android/Termux automatically uses system yt-dlp and FFmpeg, with platform-specific doctor and backend-update instructions.
134
- - First downloads and `veo doctor fix` automatically install missing Termux tools (including JavaScript support) or acquire missing desktop media binaries in veo's cache; offline mode never installs packages.
135
-
136
- ### Changed
137
-
138
- - Static desktop media tools are optional dependencies so unsupported binaries do not prevent npm installation.
139
-
140
- ## 1.6.1
141
-
142
- ### Added
143
-
144
- - `veo config reset` restores the current template after confirmation and saves an exact backup of the previous configuration, including malformed files.
145
-
146
- ## 1.6.0
147
-
148
- ### Added
149
-
150
- - Parallel URL and batch downloads with serialized jobs, per-item statistics, and adaptive retries with reduced concurrency.
151
- - Parallel playlist downloads (two playlist entries concurrently by default, `--playlist-concurrency 1-4`), with per-entry progress, serialized job updates, and cancellation that waits for active workers.
152
- - Concurrent DASH/HLS fragment downloads (up to eight DASH/HLS fragments concurrently by default; `-N` overrides this).
153
- - Safe filename and folder templates, free-space estimates, and phase timings.
154
- - Offline config commands: `veo config check` and `veo config show`, and full option documentation in the config editor.
155
- - Prefer H.264/AAC for explicit MP4 downloads, report incompatible original codecs, and add opt-in `--compatible` / `kompatibel` profile with conditional H.264/AAC conversion.
156
- - `--recode` flag for explicitly converting video formats when remuxing is incompatible.
157
-
158
- ### Changed
159
-
160
- - Video `--format` now remuxes without quality loss; incompatible codecs fail instead of being converted silently.
161
- - Apply consistent terminal styling to all veo command reports and help, including stats; dim terminal status details and highlight titles, successful saves and failures; preserve plain JSON/piped output and honor `--no-color`, `NO_COLOR` and config color preferences.
162
-
163
- ### Fixed
164
-
165
- - Fix Node.js DEP0190 warnings during Windows self-updates by invoking cmd.exe explicitly with a fixed npm command.
166
-
167
- ## 1.5.0
168
-
169
- ### Added
170
-
171
- - **`veo runs` and `veo stop`**: every run registers itself with a **6-character id** while
172
- it works, so another terminal can watch and end it. `veo runs` lists active runs with PID,
173
- state, start time, progress and output directory, `veo runs <id>` shows one run in detail
174
- (URLs, media settings, job file and per-item state), `veo stop <id>` stops that run and
175
- `veo stop` stops every run. A stop request is polled by the run itself, so no signals or
176
- PIDs are needed; the stopped run exits like Ctrl+C and keeps its partial data and retry
177
- job. Records of crashed runs are marked `stale` and removed by `veo stop`. Run records
178
- never contain credentials or cookie settings, and an unknown or damaged record file is
179
- ignored instead of breaking later runs.
180
- - **`veo history`**: shows the last 5 download attempts, newest first, with title, status,
181
- media type, date, duration, URL and the saved files. Saved, skipped, failed and cancelled
182
- items are recorded, including the reported failure reason; playlist entries and retries
183
- count individually. `veo history --json` prints `{"count":N,"entries":[…]}` with the
184
- complete file list for scripting. Records live as one small file per attempt in the
185
- per-user veo cache's `history` directory and are kept by `veo flush`.
186
-
187
- ### Changed
188
-
189
- - The run registry moved out of `veo flush` into `src/runs.js`; `veo flush` and `veo stop`
190
- now stop the same registered runs, and `veo flush` keeps working with run records written
191
- by older versions.
192
-
193
- ## 1.4.0
194
-
195
- ### Added
196
-
197
- - **Local download cache**: downloads and media processing now finish in the per-user veo
198
- cache before the destination is written, so the output location is only touched once the
199
- media is ready. Saving uses a hard link where supported and an exclusive copy across
200
- drives or cloud mounts, with copied sizes verified. Existing files are still never
201
- overwritten. The local original is removed only after files and history are saved.
202
- - **Recoverable transfers**: if saving fails or is cancelled after processing completed, the
203
- finished local original and its sidecars are kept for **15 minutes** — with or without
204
- `--resume`. Repeat the same command, or use the printed `--retry-failed` command, to retry
205
- the transfer without contacting the source again. The same source, media settings and
206
- destination identify a cached transfer; a repeated failure starts a fresh retention
207
- period. Expired copies are removed on the next veo invocation, never by a background
208
- timer, and active transfers are never expired.
209
- - **`veo stats`**: persistent counters for saved videos and audio, failed attempts, skips,
210
- cancellations and total elapsed download-request time. `veo stats --json` prints the
211
- totals as JSON. Playlist entries count individually and retries are new attempts.
212
- Statistics hold counters and timestamps, not URLs or filenames.
213
- - **`veo flush [--stats]`**: stops active veo runs started with this version, then removes
214
- temporary local downloads — including the 15-minute retained copies and unfinished resume
215
- data — plus cached retry job files. Saved media, output history, config/profiles and
216
- backend binaries are kept, and `--stats` additionally resets the statistics.
217
- - **`veo doctor fix`**: restores missing or damaged managed tools and then checks again,
218
- staging bundled FFmpeg/FFprobe and downloading hash-verified yt-dlp when needed. With
219
- `--offline` only local binaries are used, and `-o PATH` creates and checks an output
220
- directory.
221
- - **Title placeholders** in `--rename` and the config/profile `rename` key: `-r "movie_*"`
222
- inserts the original title (`movie_My Film.mp4`), and every `*` is substituted. Placeholders
223
- make `--rename` usable with several URLs and playlists, where a plain name is still refused.
224
- - **`profiles.default`** is applied automatically when no profile is selected; other named
225
- profiles keep using the global defaults instead of inheriting `default`. `veo config edit`
226
- adds an empty `default` profile to existing configurations without changing settings, and
227
- the wizard preselects it.
228
- - Config syntax errors now name the line and column and explain the likely mistake, such as
229
- Markdown code fences, a trailing comma or an unescaped Windows path, without echoing
230
- private config values.
231
- - The packaged-tarball check now verifies that every relative import resolves inside the
232
- tarball and that the tarball, `package.json` and CHANGELOG versions agree, so an
233
- incompletely bumped or incompletely packed release fails before publishing.
234
-
235
- ### Changed
236
-
237
- - `veo doctor` no longer warns about a missing system FFmpeg when the selected FFmpeg and
238
- FFprobe work, and it reports retained local downloads and copied-size mismatches.
239
- - Resume state and partial data now live in the local per-user cache under `downloads`
240
- instead of the output directory, and the request hash also separates destinations,
241
- playlist entries and source URLs. Legacy `.veo-part-<video id>` folders in the output
242
- directory are left untouched and are not migrated automatically.
243
- - Unfinished downloads are discarded on failure or cancellation unless `--resume` is given;
244
- a completed download is the only thing retained for a transfer retry. Local disk space is
245
- therefore needed for the complete download and its processing files.
246
-
247
- ## 1.3.0
248
-
249
- ### Added
250
-
251
- - **Interactive wizard**: run `veo` without arguments in a terminal to be guided through a
252
- download — profile, link, video or audio, available resolution, output directory, and
253
- playlist entry selection. It enables resume and offers to skip already downloaded files.
254
- Redirected input never starts a prompt.
255
- - **Named profiles** in the config file (`"profiles": { "music": {...} }`) plus
256
- `veo config edit|path|profiles`. Global defaults are merged first, then the profile
257
- selected with `--profile`, then explicit flags.
258
- - **Negated boolean flags** such as `--no-open`, `--no-audio` or `--no-resume` switch off a
259
- stored default for one invocation; `--no-subs` also disables stored subtitle languages
260
- and subtitle embedding.
261
- - **URL list files** with `--batch-file <file>` (one URL per line, blank lines and `#`
262
- comments ignored), combinable with URLs on the command line.
263
- - **Durable batch jobs and `--retry-failed <file>`**: failed or cancelled runs print a
264
- ready-to-use retry command, and retries keep the resolved output directory and settings
265
- even from another working directory. Completed playlist jobs retry only failed indices.
266
- - **A final summary** per run, counting saved, skipped and failed items. With `--open`,
267
- successful files are opened even when another URL or playlist entry fails.
268
- - **Playlist entries one at a time**: a failed entry keeps previously saved files and does
269
- not stop the remaining entries. `--playlist-items 1,3-5` selects entries by original
270
- one-based index, and the selection count plus available size estimates are shown first.
271
- - **`--skip-existing`** reuses the recorded source and settings history and re-checks that
272
- the files are still on disk. A different quality or format, or a deleted output, is
273
- downloaded again.
274
- - **Resume by source and settings hash**: partial data lives in
275
- `.veo-part-<hash>`, guarded by a lock and a manifest that records backend-confirmed
276
- completion, so an unprocessed file is never mistaken for a finished video. Each playlist
277
- entry has its own state; completed entries are skipped on a later run and unfinished ones
278
- are preserved independently.
279
- - **Labelled phases** in the terminal title and progress output: current item, source title,
280
- video/audio/media stream, conversion or merge, and saving.
281
- - **Workflow regression tests** and real-backend smoke coverage for URL lists, profiles,
282
- retry, duplicate detection and playlist selection.
283
-
284
- ### Changed
285
-
286
- - Generated configuration comments, the example profiles (`music`, `archive`),
287
- documentation and sample filenames are English throughout. Previously generated German
288
- template comments are translated by the next `veo config edit`, preserving existing
289
- settings, paths and custom profile names.
290
- - `veo config edit` fills new or empty files with a commented template and gives existing
291
- files a one-time commented reference guide, without changing stored settings. Config
292
- files accept `//` line and `/* ... */` block comments.
293
- - Ambiguous "resume folders" are replaced by the source/settings hash layout; only
294
- backend-confirmed postprocessed media is reused.
295
- - Other positive numeric resolutions, such as `-q 540p`, are accepted instead of only the
296
- documented list.
297
-
298
- ## 1.2.0
299
-
300
- Everything below ships together: `1.1.0` was prepared but never published, so this
301
- release is the first to contain these changes.
302
-
303
- ### Changed
304
-
305
- - **`--quality` is now an upper bound.** `-q 720p` downloads the best resolution at or
306
- below 720p and never fetches 2160p instead. If a source offers nothing at or below the
307
- request, veo stops before downloading and names the resolutions that do exist. The
308
- historical "nearest available height" rule is still available as `--closest-quality`
309
- and may pick a resolution above the request. Sources without resolution metadata fall
310
- back to the best available stream, as before.
311
- - A finished download is now linked into place instead of copied. Staging lives inside
312
- the output directory, so a hard link is enough; filesystems without hard links still
313
- fall back to a copy. This removes a full extra read and write per download, roughly
314
- halves the peak disk usage, and makes saving cancellable.
315
- - Fewer duplicated downloads in `veo update`: an explicitly installed backend release
316
- is no longer pruned.
317
- - Metadata and media tools are prepared before any network work, so an unusable local
318
- setup fails before a backend download starts.
319
-
320
- ### Added
321
-
322
- - **Multiple URLs** in one invocation: `veo <url1> <url2> ...`. Downloads run
323
- sequentially, a failure does not stop the remaining URLs, and the exit status is `1`
324
- if any URL failed.
325
- - **`--playlist`** to download every entry of a playlist or channel URL. Each entry keeps
326
- its own title, and `--no-playlist` remains the default.
327
- - **Subtitles**: `--subs`, `--sub-langs <langs>`, `--embed-subs`.
328
- - **Metadata**: `--embed-metadata`, `--embed-thumbnail`, `--sponsorblock-remove <categories>`,
329
- `--section <range>`, and `-N/--concurrent-fragments <n>` for faster fragmented downloads.
330
- - **`--resume`** keeps partial data in `.veo-part-<video id>` and continues an interrupted
331
- download, including one that was cancelled with Ctrl+C.
332
- - **`--cookies <file>` and `--cookies-from-browser <browser[:profile]>`** for content you
333
- are authorized to access. Cookie files are validated before any network work and a
334
- world-readable file produces a warning.
335
- - **`--dry-run`** reports the title, quality and destination path without downloading.
336
- - **`--list-formats`** prints the backend's own format table.
337
- - **`--json`** prints one JSON object per URL for scripting.
338
- - **`veo doctor`** checks Node.js, the output directory, the backend cache, yt-dlp,
339
- FFmpeg/FFprobe, the config file, leftover partial downloads and network reachability.
340
- It downloads nothing and exits `1` when a check fails.
341
- - **`veo backend update [--check]`** installs a newer yt-dlp release without waiting for a
342
- new veo release, verified against that release's own `SHA2-256SUMS`. `veo backend reset`
343
- returns to the release pinned and hash-verified at build time.
344
- - **Config file** for defaults (output directory, quality, format, subtitle preferences,
345
- and so on). Explicit command-line flags always win.
346
- - **Windows on ARM** is no longer rejected: when the bundled static media tools are
347
- unavailable, veo uses a system FFmpeg installation found on `PATH`.
348
-
349
- ### Fixed
350
-
351
- - `--rename` is applied again; it had stopped affecting the saved filename.
352
-
353
- ## 1.0.2
354
-
355
- - Initial published release.
1
+ # Changelog
2
+
3
+ All notable changes to veo. This project follows [Semantic Versioning](https://semver.org/).
4
+
5
+ ## 1.12.0
6
+
7
+ ### Added
8
+
9
+ - **Release Notes**: Added `veo changes [<version>]` (alias `veo changelog`) to list every released version, newest first, with the installed one marked. `veo changes <version>` (or `--version <version>`, and a partial version such as `1.10`) shows the notes of one release, `--latest` shows only the newest, and `--since <version>` with `--to <version>` or `--range <from>..<to>` shows everything between two versions. The notes are parsed from the `CHANGELOG.md` shipped with the installed version, so the command works offline, wraps long entries to the terminal width and prints no automatic update hint. `--json` returns the parsed sections, entries and nested entries unchanged for scripting.
10
+
11
+ ## 1.11.0
12
+
13
+ ### Added
14
+
15
+ - **Incognito Downloads**: Added `--incognito` (and `"incognito": true` in configuration/profiles) to save media without creating run records, persistent retry jobs, run archives, download history, `.veo-history` records, or download statistics. Uses an isolated temporary staging directory and completely removes it upon completion, failure, or cancellation, and disables yt-dlp's filesystem cache.
16
+ - **Neutral Filenames**: Added `--neutral-filename` (and `"neutralFilename": true`) to generate unidentifiable random filenames (e.g. `video-a1b2c3d4e5f6.mp4`), suppressing video titles, channel names, and custom folder templates in filesystem paths.
17
+ - **Subtitle Inspection & Automatic Captions**:
18
+ - Added `veo subs <url>` (alias `--list-subs` / `--list-subtitles`) to inspect available manual and automatically generated subtitle tracks, languages, and source formats without downloading.
19
+ - Added `--auto-subs` (and `"autoSubs": true`) to download automatically generated captions/subtitles.
20
+ - Added `--sub-format <format>` (and `"subFormat": string`) to express a preferred subtitle source format (e.g. `srt/vtt/best`).
21
+ - **Post-Download Media Verification**: Added `--verify` (and `"verify": true`) to probe saved media files with FFprobe before recording success, verifying container integrity and stream presence. Retains saved files for inspection if verification fails.
22
+
23
+ ## 1.10.1
24
+
25
+ ### Added
26
+
27
+ - Added `veo <url> --list-qualities` (alias `--list-qualitys`) to list available video resolutions ordered highest first without downloading media. Supports `--json` and discovered `--source <n>`.
28
+ - Expanded `--concurrent-fragments` (or `-N`) to support values from 1 to 64. Experimental values between 17 and 64 require interactive `[y/N]` confirmation in terminals, or explicit opt-in via `--experimental-fragments` (or `"experimentalFragments": true` in configuration/profiles) for scripts and automated jobs. Values above 64 are rejected.
29
+ - Added support for passing run IDs directly to `--retry-failed` (e.g. `veo --retry-failed <runId>`), automatically locating and resolving the corresponding retry job and rejecting active runs.
30
+ - Added clickable OSC 8 directory links for saved file destinations, config paths, and editor headers in supported terminals (Windows Terminal, iTerm2, WezTerm, Kitty, VS Code, and VTE).
31
+ - Added inline terminal region support (`createInlineRegion`) to smoothly render live progress and status in place without flickering, entering fullscreen, or wiping terminal scrollback.
32
+
33
+ ### Fixed
34
+
35
+ - Handled terminal window resize events during live progress display, dynamically refitting titles and status lines.
36
+ - Improved terminal title and line wrapping to display up to three lines for long titles before truncating.
37
+ - Improved interactive config editor footer layout for long status messages and ensured stdin is paused cleanly upon exit.
38
+ - Preserved complete original values in JSON and redirected output while adapting prose output to the active terminal width.
39
+
40
+ ## 1.10.0
41
+
42
+ ### Added
43
+
44
+ - **Persistent Profile Management**: Added `veo profile [NAME|list|reset]` commands to view the active configuration profile, inspect available profiles, switch defaults, or reset back to default without manual configuration edits.
45
+ - **On-demand Config Guide**: Added `veo config guide` to display full configuration guidance, supported options, and templates in the terminal without opening the interactive editor.
46
+ - **Interactive Config Editor enhancements**:
47
+ - Full Undo (`Ctrl+Z`) and Redo (`Ctrl+Y`) history support when modifying settings.
48
+ - Select All (`Ctrl+A`) shortcut to easily highlight and overwrite lines or entire sections.
49
+ - Interactive F3 guide management prompt (`A` to add/refresh, `R` to strip documentation lines).
50
+ - Mouse edge drag auto-scrolling when dragging selections past viewport bounds.
51
+ - **Automatic Browser Source Discovery**: Enabled automatic source discovery fallback by default when direct extraction fails, automatically selecting and proceeding if a single verified media stream is found.
52
+
53
+ ### Changed
54
+
55
+ - Streamlined source discovery observation polling to immediately proceed once candidate streams are detected.
56
+ - Enhanced progress output styling and ANSI handling across terminal status reporting.
57
+
58
+ ## 1.9.1
59
+
60
+ ### Added
61
+
62
+ - Added typo and spelling suggestions for misspelled CLI options and subcommands (e.g. `--deepscan` suggests `--deep-scan`, `veo histroy` suggests `veo history`).
63
+
64
+ ### Fixed
65
+
66
+ - Improved browser-based player source discovery to continuously detect delayed play controls and overlays inside frames.
67
+
68
+ ## 1.9.0
69
+
70
+ ### Added
71
+
72
+ - **Browser-based player source discovery**: Added `veo <page-url> --list-sources` to launch a temporary headless Chrome, Edge or Chromium session, simulate playback, and extract embedded media streams (HLS, DASH, direct MP4/WebM).
73
+ - Added `--source <n>` to download or preview (`--dry-run`) a specific discovered source.
74
+ - Added `--deep-scan` and `--timeout <duration>` (e.g. `30s`, `2m`) to configure source candidate search depth and deadlines.
75
+ - Added interactive source discovery prompt in terminals when direct URL extraction finds no downloadable video.
76
+ - Added `autoListSources`, `listSources`, `deepScan`, and `timeout` settings to config defaults and profiles.
77
+ - **Config editor improvements**: Enhanced terminal layout with dynamic multi-line detail rows, compact status display, and automatic refresh of the marked template guide for new options.
78
+
79
+ ### Fixed
80
+
81
+ - Resolved active configuration path properly when running `veo uninstall`.
82
+ - Ensured run cancellation requests are processed once per run to avoid race conditions.
83
+
84
+ ## 1.8.3
85
+
86
+ ### Added
87
+
88
+ - Added `veo alias` commands (`list`, `add`, `remove`) to manage custom command names and shortcuts that forward to `veo`.
89
+ - Added `veo uninstall` to remove individual aliases with `-p <name>`, or perform a full interactive/planned purge with `--yes`.
90
+ - Added `veo up` as a short alias for `veo update`.
91
+
92
+ ### Changed
93
+
94
+ - Streamlined package binary commands to `veo` and `veodl`.
95
+
96
+ ## 1.8.2
97
+
98
+ ### Changed
99
+
100
+ - Updated repository, issue tracker, and homepage URLs to `Mailo037/veodl`.
101
+
102
+ ## 1.8.1
103
+
104
+ ### Changed
105
+
106
+ - Renamed package to `veodl` on npm.
107
+ - Provided `veo`, `veod`, and `veodl` as parallel terminal commands (all execute the same CLI).
108
+
109
+ ## 1.8.0
110
+
111
+ ### Added
112
+
113
+ - **`veo inspect <file>` and `veo inspect run <id>`**: Inspect local container and stream metadata with `--json`. Add `--check-audio` to decode audio tracks and verify signals above -60 dBFS. `veo inspect run <id>` locates saved run files by file identity, size, and sampled SHA-256 fingerprint, even after renames or moves (`--search <directory>`).
114
+ - **`veo retry --last`**: Automatically retry the most recent failed or unfinished job without manually locating its job file.
115
+ - **`veo history` improvements**: Added `--limit <1-1000>` to customize history entries and `--failed` to view only failed or cancelled attempts with their retry command and persistent `runId`.
116
+ - **Config editor clipboard & mouse scrolling**: Added native system clipboard copy/paste (Ctrl+C / Ctrl+V) across Windows, macOS, Linux (Wayland/X11), and Termux, as well as mouse wheel and Ctrl+Up/Down scrolling.
117
+ - **Termux desktop opener**: Supported `--open` in Android/Termux using `termux-open`.
118
+ - **Agent guidelines**: Included AGENTS.md and docs/AGENT_GUIDE.md in the distributed package.
119
+
120
+ ## 1.7.2
121
+
122
+ ### Fixed
123
+
124
+ - Stale download-history records referencing deleted files are automatically pruned on subsequent downloads, and empty `.veo-history` directories are removed.
125
+ - `veo doctor` inspects `.veo-history` records, reports stale duplicate-detection records as warnings, and flags damaged history directories.
126
+
127
+ ## 1.7.1
128
+
129
+ ### Fixed
130
+
131
+ - Progress adapts to narrow terminals, updates one line for parallel downloads, and marks estimated sizes instead of showing premature completion.
132
+ - Download errors retain specific HTTP/network codes instead of replacing them with a generic network warning.
133
+ - Files announced by a failed yt-dlp process are retained as unconfirmed, not treated as completed transfers; retry requires a successful backend exit.
134
+
135
+ ## 1.7.0
136
+
137
+ ### Added
138
+
139
+ - Android/Termux automatically uses system yt-dlp and FFmpeg, with platform-specific doctor and backend-update instructions.
140
+ - First downloads and `veo doctor fix` automatically install missing Termux tools (including JavaScript support) or acquire missing desktop media binaries in veo's cache; offline mode never installs packages.
141
+
142
+ ### Changed
143
+
144
+ - Static desktop media tools are optional dependencies so unsupported binaries do not prevent npm installation.
145
+
146
+ ## 1.6.1
147
+
148
+ ### Added
149
+
150
+ - `veo config reset` restores the current template after confirmation and saves an exact backup of the previous configuration, including malformed files.
151
+
152
+ ## 1.6.0
153
+
154
+ ### Added
155
+
156
+ - Parallel URL and batch downloads with serialized jobs, per-item statistics, and adaptive retries with reduced concurrency.
157
+ - Parallel playlist downloads (two playlist entries concurrently by default, `--playlist-concurrency 1-4`), with per-entry progress, serialized job updates, and cancellation that waits for active workers.
158
+ - Concurrent DASH/HLS fragment downloads (up to eight DASH/HLS fragments concurrently by default; `-N` overrides this).
159
+ - Safe filename and folder templates, free-space estimates, and phase timings.
160
+ - Offline config commands: `veo config check` and `veo config show`, and full option documentation in the config editor.
161
+ - Prefer H.264/AAC for explicit MP4 downloads, report incompatible original codecs, and add opt-in `--compatible` / `kompatibel` profile with conditional H.264/AAC conversion.
162
+ - `--recode` flag for explicitly converting video formats when remuxing is incompatible.
163
+
164
+ ### Changed
165
+
166
+ - Video `--format` now remuxes without quality loss; incompatible codecs fail instead of being converted silently.
167
+ - Apply consistent terminal styling to all veo command reports and help, including stats; dim terminal status details and highlight titles, successful saves and failures; preserve plain JSON/piped output and honor `--no-color`, `NO_COLOR` and config color preferences.
168
+
169
+ ### Fixed
170
+
171
+ - Fix Node.js DEP0190 warnings during Windows self-updates by invoking cmd.exe explicitly with a fixed npm command.
172
+
173
+ ## 1.5.0
174
+
175
+ ### Added
176
+
177
+ - **`veo runs` and `veo stop`**: every run registers itself with a **6-character id** while
178
+ it works, so another terminal can watch and end it. `veo runs` lists active runs with PID,
179
+ state, start time, progress and output directory, `veo runs <id>` shows one run in detail
180
+ (URLs, media settings, job file and per-item state), `veo stop <id>` stops that run and
181
+ `veo stop` stops every run. A stop request is polled by the run itself, so no signals or
182
+ PIDs are needed; the stopped run exits like Ctrl+C and keeps its partial data and retry
183
+ job. Records of crashed runs are marked `stale` and removed by `veo stop`. Run records
184
+ never contain credentials or cookie settings, and an unknown or damaged record file is
185
+ ignored instead of breaking later runs.
186
+ - **`veo history`**: shows the last 5 download attempts, newest first, with title, status,
187
+ media type, date, duration, URL and the saved files. Saved, skipped, failed and cancelled
188
+ items are recorded, including the reported failure reason; playlist entries and retries
189
+ count individually. `veo history --json` prints `{"count":N,"entries":[…]}` with the
190
+ complete file list for scripting. Records live as one small file per attempt in the
191
+ per-user veo cache's `history` directory and are kept by `veo flush`.
192
+
193
+ ### Changed
194
+
195
+ - The run registry moved out of `veo flush` into `src/runs.js`; `veo flush` and `veo stop`
196
+ now stop the same registered runs, and `veo flush` keeps working with run records written
197
+ by older versions.
198
+
199
+ ## 1.4.0
200
+
201
+ ### Added
202
+
203
+ - **Local download cache**: downloads and media processing now finish in the per-user veo
204
+ cache before the destination is written, so the output location is only touched once the
205
+ media is ready. Saving uses a hard link where supported and an exclusive copy across
206
+ drives or cloud mounts, with copied sizes verified. Existing files are still never
207
+ overwritten. The local original is removed only after files and history are saved.
208
+ - **Recoverable transfers**: if saving fails or is cancelled after processing completed, the
209
+ finished local original and its sidecars are kept for **15 minutes** — with or without
210
+ `--resume`. Repeat the same command, or use the printed `--retry-failed` command, to retry
211
+ the transfer without contacting the source again. The same source, media settings and
212
+ destination identify a cached transfer; a repeated failure starts a fresh retention
213
+ period. Expired copies are removed on the next veo invocation, never by a background
214
+ timer, and active transfers are never expired.
215
+ - **`veo stats`**: persistent counters for saved videos and audio, failed attempts, skips,
216
+ cancellations and total elapsed download-request time. `veo stats --json` prints the
217
+ totals as JSON. Playlist entries count individually and retries are new attempts.
218
+ Statistics hold counters and timestamps, not URLs or filenames.
219
+ - **`veo flush [--stats]`**: stops active veo runs started with this version, then removes
220
+ temporary local downloads — including the 15-minute retained copies and unfinished resume
221
+ data — plus cached retry job files. Saved media, output history, config/profiles and
222
+ backend binaries are kept, and `--stats` additionally resets the statistics.
223
+ - **`veo doctor fix`**: restores missing or damaged managed tools and then checks again,
224
+ staging bundled FFmpeg/FFprobe and downloading hash-verified yt-dlp when needed. With
225
+ `--offline` only local binaries are used, and `-o PATH` creates and checks an output
226
+ directory.
227
+ - **Title placeholders** in `--rename` and the config/profile `rename` key: `-r "movie_*"`
228
+ inserts the original title (`movie_My Film.mp4`), and every `*` is substituted. Placeholders
229
+ make `--rename` usable with several URLs and playlists, where a plain name is still refused.
230
+ - **`profiles.default`** is applied automatically when no profile is selected; other named
231
+ profiles keep using the global defaults instead of inheriting `default`. `veo config edit`
232
+ adds an empty `default` profile to existing configurations without changing settings, and
233
+ the wizard preselects it.
234
+ - Config syntax errors now name the line and column and explain the likely mistake, such as
235
+ Markdown code fences, a trailing comma or an unescaped Windows path, without echoing
236
+ private config values.
237
+ - The packaged-tarball check now verifies that every relative import resolves inside the
238
+ tarball and that the tarball, `package.json` and CHANGELOG versions agree, so an
239
+ incompletely bumped or incompletely packed release fails before publishing.
240
+
241
+ ### Changed
242
+
243
+ - `veo doctor` no longer warns about a missing system FFmpeg when the selected FFmpeg and
244
+ FFprobe work, and it reports retained local downloads and copied-size mismatches.
245
+ - Resume state and partial data now live in the local per-user cache under `downloads`
246
+ instead of the output directory, and the request hash also separates destinations,
247
+ playlist entries and source URLs. Legacy `.veo-part-<video id>` folders in the output
248
+ directory are left untouched and are not migrated automatically.
249
+ - Unfinished downloads are discarded on failure or cancellation unless `--resume` is given;
250
+ a completed download is the only thing retained for a transfer retry. Local disk space is
251
+ therefore needed for the complete download and its processing files.
252
+
253
+ ## 1.3.0
254
+
255
+ ### Added
256
+
257
+ - **Interactive wizard**: run `veo` without arguments in a terminal to be guided through a
258
+ download — profile, link, video or audio, available resolution, output directory, and
259
+ playlist entry selection. It enables resume and offers to skip already downloaded files.
260
+ Redirected input never starts a prompt.
261
+ - **Named profiles** in the config file (`"profiles": { "music": {...} }`) plus
262
+ `veo config edit|path|profiles`. Global defaults are merged first, then the profile
263
+ selected with `--profile`, then explicit flags.
264
+ - **Negated boolean flags** such as `--no-open`, `--no-audio` or `--no-resume` switch off a
265
+ stored default for one invocation; `--no-subs` also disables stored subtitle languages
266
+ and subtitle embedding.
267
+ - **URL list files** with `--batch-file <file>` (one URL per line, blank lines and `#`
268
+ comments ignored), combinable with URLs on the command line.
269
+ - **Durable batch jobs and `--retry-failed <file>`**: failed or cancelled runs print a
270
+ ready-to-use retry command, and retries keep the resolved output directory and settings
271
+ even from another working directory. Completed playlist jobs retry only failed indices.
272
+ - **A final summary** per run, counting saved, skipped and failed items. With `--open`,
273
+ successful files are opened even when another URL or playlist entry fails.
274
+ - **Playlist entries one at a time**: a failed entry keeps previously saved files and does
275
+ not stop the remaining entries. `--playlist-items 1,3-5` selects entries by original
276
+ one-based index, and the selection count plus available size estimates are shown first.
277
+ - **`--skip-existing`** reuses the recorded source and settings history and re-checks that
278
+ the files are still on disk. A different quality or format, or a deleted output, is
279
+ downloaded again.
280
+ - **Resume by source and settings hash**: partial data lives in
281
+ `.veo-part-<hash>`, guarded by a lock and a manifest that records backend-confirmed
282
+ completion, so an unprocessed file is never mistaken for a finished video. Each playlist
283
+ entry has its own state; completed entries are skipped on a later run and unfinished ones
284
+ are preserved independently.
285
+ - **Labelled phases** in the terminal title and progress output: current item, source title,
286
+ video/audio/media stream, conversion or merge, and saving.
287
+ - **Workflow regression tests** and real-backend smoke coverage for URL lists, profiles,
288
+ retry, duplicate detection and playlist selection.
289
+
290
+ ### Changed
291
+
292
+ - Generated configuration comments, the example profiles (`music`, `archive`),
293
+ documentation and sample filenames are English throughout. Previously generated German
294
+ template comments are translated by the next `veo config edit`, preserving existing
295
+ settings, paths and custom profile names.
296
+ - `veo config edit` fills new or empty files with a commented template and gives existing
297
+ files a one-time commented reference guide, without changing stored settings. Config
298
+ files accept `//` line and `/* ... */` block comments.
299
+ - Ambiguous "resume folders" are replaced by the source/settings hash layout; only
300
+ backend-confirmed postprocessed media is reused.
301
+ - Other positive numeric resolutions, such as `-q 540p`, are accepted instead of only the
302
+ documented list.
303
+
304
+ ## 1.2.0
305
+
306
+ Everything below ships together: `1.1.0` was prepared but never published, so this
307
+ release is the first to contain these changes.
308
+
309
+ ### Changed
310
+
311
+ - **`--quality` is now an upper bound.** `-q 720p` downloads the best resolution at or
312
+ below 720p and never fetches 2160p instead. If a source offers nothing at or below the
313
+ request, veo stops before downloading and names the resolutions that do exist. The
314
+ historical "nearest available height" rule is still available as `--closest-quality`
315
+ and may pick a resolution above the request. Sources without resolution metadata fall
316
+ back to the best available stream, as before.
317
+ - A finished download is now linked into place instead of copied. Staging lives inside
318
+ the output directory, so a hard link is enough; filesystems without hard links still
319
+ fall back to a copy. This removes a full extra read and write per download, roughly
320
+ halves the peak disk usage, and makes saving cancellable.
321
+ - Fewer duplicated downloads in `veo update`: an explicitly installed backend release
322
+ is no longer pruned.
323
+ - Metadata and media tools are prepared before any network work, so an unusable local
324
+ setup fails before a backend download starts.
325
+
326
+ ### Added
327
+
328
+ - **Multiple URLs** in one invocation: `veo <url1> <url2> ...`. Downloads run
329
+ sequentially, a failure does not stop the remaining URLs, and the exit status is `1`
330
+ if any URL failed.
331
+ - **`--playlist`** to download every entry of a playlist or channel URL. Each entry keeps
332
+ its own title, and `--no-playlist` remains the default.
333
+ - **Subtitles**: `--subs`, `--sub-langs <langs>`, `--embed-subs`.
334
+ - **Metadata**: `--embed-metadata`, `--embed-thumbnail`, `--sponsorblock-remove <categories>`,
335
+ `--section <range>`, and `-N/--concurrent-fragments <n>` for faster fragmented downloads.
336
+ - **`--resume`** keeps partial data in `.veo-part-<video id>` and continues an interrupted
337
+ download, including one that was cancelled with Ctrl+C.
338
+ - **`--cookies <file>` and `--cookies-from-browser <browser[:profile]>`** for content you
339
+ are authorized to access. Cookie files are validated before any network work and a
340
+ world-readable file produces a warning.
341
+ - **`--dry-run`** reports the title, quality and destination path without downloading.
342
+ - **`--list-formats`** prints the backend's own format table.
343
+ - **`--json`** prints one JSON object per URL for scripting.
344
+ - **`veo doctor`** checks Node.js, the output directory, the backend cache, yt-dlp,
345
+ FFmpeg/FFprobe, the config file, leftover partial downloads and network reachability.
346
+ It downloads nothing and exits `1` when a check fails.
347
+ - **`veo backend update [--check]`** installs a newer yt-dlp release without waiting for a
348
+ new veo release, verified against that release's own `SHA2-256SUMS`. `veo backend reset`
349
+ returns to the release pinned and hash-verified at build time.
350
+ - **Config file** for defaults (output directory, quality, format, subtitle preferences,
351
+ and so on). Explicit command-line flags always win.
352
+ - **Windows on ARM** is no longer rejected: when the bundled static media tools are
353
+ unavailable, veo uses a system FFmpeg installation found on `PATH`.
354
+
355
+ ### Fixed
356
+
357
+ - `--rename` is applied again; it had stopped affecting the saved filename.
358
+
359
+ ## 1.0.2
360
+
361
+ - Initial published release.