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