veodl 1.10.0 → 1.11.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/AGENTS.md +3 -3
- package/CHANGELOG.md +29 -0
- package/README.md +128 -67
- package/docs/AGENT_GUIDE.md +23 -9
- package/package.json +61 -58
- package/src/cli.js +227 -133
- package/src/config-diagnostics.js +20 -20
- package/src/config-editor.js +21 -17
- package/src/config-template.js +79 -66
- package/src/config.js +117 -110
- package/src/downloader.js +103 -42
- package/src/experimental-fragments.js +29 -0
- package/src/history.js +1 -1
- package/src/inline-region.js +72 -0
- package/src/inspect-media.js +11 -0
- package/src/interactive.js +9 -4
- package/src/jobs.js +51 -14
- package/src/naming.js +4 -0
- package/src/output.js +77 -60
- package/src/path-links.js +53 -0
- package/src/progress.js +341 -208
- package/src/terminal-size.js +8 -0
package/AGENTS.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Read [the agent guide](docs/AGENT_GUIDE.md) before automating downloads or media checks.
|
|
4
4
|
|
|
5
|
-
- Use `veo <url> --
|
|
5
|
+
- Use `veo <url> --list-qualities --json` to inspect available video resolutions, `veo <url> --dry-run --json` to preview output, then `veo <url> --json` to download authorized content.
|
|
6
6
|
- Parse one JSON object per stdout line. Read stderr and the exit code too; a nonzero exit means the request did not fully succeed.
|
|
7
7
|
- Use `veo runs --json` or `veo runs <id> --json` for active runs, and `veo history --json --limit 20` for finished attempts. Download JSON and history include the persistent `runId`.
|
|
8
8
|
- Use `veo inspect <file> --check-audio --json` to distinguish an audio track from a measured signal. The check decodes the full audio track and may take time.
|
|
9
9
|
- Use `veo inspect run <id> --json` to inspect files from a finished run. It verifies file presence first and searches the output tree by fingerprint after a rename; use `--search <directory>` after a move outside that tree.
|
|
10
|
-
- Use `veo retry --last --json`
|
|
11
|
-
- Keep scripts non-interactive. `veo` without arguments starts a wizard only in a terminal.
|
|
10
|
+
- Use `veo retry --last --json` or `veo --retry-failed <runId> --json` for failed or unfinished jobs. Avoid `veo flush` unless the user asked to remove temporary data and retry jobs.
|
|
11
|
+
- Keep scripts non-interactive. `veo` without arguments starts a wizard only in a terminal; fragment concurrency above 16 requires `--experimental-fragments` in scripts.
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to veo. This project follows [Semantic Versioning](https://semver.org/).
|
|
4
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
|
+
|
|
5
34
|
## 1.10.0
|
|
6
35
|
|
|
7
36
|
### Added
|
package/README.md
CHANGED
|
@@ -68,9 +68,13 @@ Options:
|
|
|
68
68
|
--recode Explicit video conversion (requires --format)
|
|
69
69
|
--playlist-concurrency <n> Parallel playlist entries, 1-4 (default: 2)
|
|
70
70
|
--playlist Download every entry of a playlist or channel URL
|
|
71
|
-
-N, --concurrent-fragments <n> Parallel fragments, 1-
|
|
71
|
+
-N, --concurrent-fragments <n> Parallel fragments, 1-64 (default: 8; 17-64 experimental)
|
|
72
|
+
--experimental-fragments Explicitly accept experimental values above 16
|
|
72
73
|
--subs Download subtitles (default languages: en)
|
|
73
|
-
--
|
|
74
|
+
--auto-subs Include automatically generated subtitles
|
|
75
|
+
--sub-langs <langs> Subtitle languages, e.g. "de,en" (manual unless --auto-subs)
|
|
76
|
+
--sub-format <format> Prefer subtitle formats, e.g. srt/vtt/best
|
|
77
|
+
--list-subs Show manual and automatic subtitle availability
|
|
74
78
|
--embed-subs Embed subtitles into the video file
|
|
75
79
|
--embed-metadata Embed title, date and other metadata
|
|
76
80
|
--embed-thumbnail Embed the thumbnail
|
|
@@ -79,12 +83,16 @@ Options:
|
|
|
79
83
|
--cookies <file> Netscape cookie file, for content you may access
|
|
80
84
|
--cookies-from-browser <browser[:profile]>
|
|
81
85
|
--resume Keep partial data and continue an interrupted download
|
|
86
|
+
--incognito Save media without run ID, history, stats or retry data
|
|
87
|
+
--neutral-filename Optional random filename instead of title and templates
|
|
88
|
+
--list-qualities Show available video resolutions and exit
|
|
82
89
|
--list-formats Show available formats and exit
|
|
83
90
|
--dry-run Show what would be downloaded and exit
|
|
91
|
+
--verify Probe saved media files with FFprobe (default: off)
|
|
84
92
|
--json One JSON object per URL instead of prose
|
|
85
93
|
--profile <name> Use a named profile from the config file
|
|
86
94
|
--batch-file <file> Read one URL per line (blank lines and # comments ignored)
|
|
87
|
-
--retry-failed <file>
|
|
95
|
+
--retry-failed <id|file> Retry failed/unfinished downloads by run ID or job file
|
|
88
96
|
--playlist-items <list> Select entries, e.g. 1,3-5 (implies --playlist)
|
|
89
97
|
--skip-existing Skip matching downloads that are still on disk
|
|
90
98
|
--no-<boolean-option> Disable a default, e.g. --no-open or --no-audio
|
|
@@ -108,7 +116,7 @@ npx veodl "https://example.com/video.mp4" --output ./downloads
|
|
|
108
116
|
|
|
109
117
|
### Several URLs and playlists
|
|
110
118
|
|
|
111
|
-
Playlist downloads use two concurrent entries by default; use `--playlist-concurrency 1` for sequential downloads. Each entry uses up to eight concurrent DASH/HLS fragments by default (`-N 1` disables fragment parallelism). More connections help only when the source and connection have spare capacity. Video format changes preserve the encoded streams unless `--recode` is explicitly enabled; audio extraction and precise section cuts retain their existing conversion behavior.
|
|
119
|
+
Playlist downloads use two concurrent entries by default; use `--playlist-concurrency 1` for sequential downloads. Each entry uses up to eight concurrent DASH/HLS fragments by default (`-N 1` disables fragment parallelism). Fragment counts between 1 and 16 need no confirmation. Values from 17 to 64 are experimental and prompt for `y/N` confirmation in terminals, or require `--experimental-fragments` (or `"experimentalFragments": true` in configuration/profiles) in non-interactive environments and JSON mode. Values above 64 are rejected. More connections help only when the source and connection have spare capacity, and excessive connections may trigger server limits. Video format changes preserve the encoded streams unless `--recode` is explicitly enabled; audio extraction and precise section cuts retain their existing conversion behavior.
|
|
112
120
|
|
|
113
121
|
- Pass any number of URLs; up to two run concurrently by default. Use
|
|
114
122
|
`--concurrent-downloads 1` for sequential processing. A failure is reported
|
|
@@ -125,7 +133,7 @@ Playlist downloads use two concurrent entries by default; use `--playlist-concur
|
|
|
125
133
|
- `--batch-file links.txt` accepts a UTF-8 URL list, optionally alongside URLs on the command
|
|
126
134
|
line. A final summary counts saved, skipped and failed videos. Successful files are opened
|
|
127
135
|
with `--open` even if another URL or playlist entry fails.
|
|
128
|
-
- Failed or cancelled jobs print a ready-to-use `veo --retry-failed
|
|
136
|
+
- Failed or cancelled jobs print a ready-to-use `veo --retry-failed <runId>` command. Saved job file paths are also accepted.
|
|
129
137
|
- Use `veo retry --last` to retry the newest failed or unfinished job without copying its path. Active runs are ignored; use `veo runs` to inspect them.
|
|
130
138
|
Jobs are stored under the per-user veo cache's `jobs` directory. Retries retain resolved
|
|
131
139
|
output directories and settings, even from a different working directory, and explicit
|
|
@@ -141,6 +149,7 @@ veo --batch-file links.txt --profile archive
|
|
|
141
149
|
veo "https://example.com/playlist" --playlist-items 1,3-5 --resume
|
|
142
150
|
veo "https://example.com/playlist" --playlist --skip-existing
|
|
143
151
|
veo --retry-failed "C:\path\to\job.json"
|
|
152
|
+
veo --retry-failed abc123
|
|
144
153
|
veo retry --last
|
|
145
154
|
```
|
|
146
155
|
|
|
@@ -193,11 +202,11 @@ example through `veo config edit`. Enable it with `veo URL --profile kompatibel`
|
|
|
193
202
|
reserved by concurrent downloads in the same process. Unknown sizes are reported as
|
|
194
203
|
unknown; conversion sizes and other processes' disk usage cannot be predicted exactly.
|
|
195
204
|
Use `--no-check-space` to disable this conservative check.
|
|
196
|
-
- `--timings` shows phase times at the end of the run. Single downloads show
|
|
197
|
-
timing without a summary; multiple downloads show timing below the summary.
|
|
198
|
-
The phases cover setup, metadata, download/backend, processing, saving and retry waits.
|
|
199
|
-
Download/backend includes the backend's own startup and extraction overhead;
|
|
200
|
-
these are summed per-download times, not a diagnosis of network speed.
|
|
205
|
+
- `--timings` shows phase times at the end of the run. Single downloads show
|
|
206
|
+
timing without a summary; multiple downloads show timing below the summary.
|
|
207
|
+
The phases cover setup, metadata, download/backend, processing, saving and retry waits.
|
|
208
|
+
Download/backend includes the backend's own startup and extraction overhead;
|
|
209
|
+
these are summed per-download times, not a diagnosis of network speed.
|
|
201
210
|
JSON results include `timings` in milliseconds, or `entryTimings` for playlists.
|
|
202
211
|
Use `--no-timings` to hide/omit them.
|
|
203
212
|
- Terminal details are gray, titles bold, saves green and errors red. The same styling
|
|
@@ -205,6 +214,12 @@ example through `veo config edit`. Enable it with `veo URL --profile kompatibel`
|
|
|
205
214
|
interactive prompts. For example, `veo stats --no-color` disables it for one command. Redirected output
|
|
206
215
|
and JSON have no color escapes. `--no-color`, `"color": false`, `NO_COLOR`,
|
|
207
216
|
and `TERM=dumb` disable colors.
|
|
217
|
+
Terminal reports shorten long URLs, paths and detail values to the current window
|
|
218
|
+
width. Titles can use up to three lines before an ellipsis is added. This also
|
|
219
|
+
applies with `--no-color`; JSON and redirected output retain complete values.
|
|
220
|
+
Downloads stay in the normal terminal flow. Only the current progress block is
|
|
221
|
+
updated in place; narrow windows put the statistics below the progress bar.
|
|
222
|
+
Existing logs remain in scrollback and are not replayed or rewritten on resize.
|
|
208
223
|
This can be set independently per profile, for example
|
|
209
224
|
`"profiles": { "default": { "color": true }, "plain": { "color": false } }`.
|
|
210
225
|
Use `veo stats --profile plain` or `veo URL --profile plain`; `--color` or
|
|
@@ -232,7 +247,7 @@ veo config show --profile fast
|
|
|
232
247
|
Config checks validate every effective profile (or the selected one), including unknown
|
|
233
248
|
settings, ranges and conflicting options. Show prints merged built-in, global and profile
|
|
234
249
|
settings as JSON, with credential paths/browser profiles redacted. Neither command contacts
|
|
235
|
-
video sites. All new options are also documented in `veo config guide`.
|
|
250
|
+
video sites. All new options are also documented in `veo config guide`.
|
|
236
251
|
|
|
237
252
|
### Files, names and resume
|
|
238
253
|
|
|
@@ -283,8 +298,13 @@ video sites. All new options are also documented in `veo config guide`.
|
|
|
283
298
|
|
|
284
299
|
### Metadata and subtitles
|
|
285
300
|
|
|
286
|
-
-
|
|
287
|
-
|
|
301
|
+
- `veo subs <URL>` lists manual and automatically generated subtitles separately, including
|
|
302
|
+
their languages and source formats. `--json` returns one object without subtitle URLs.
|
|
303
|
+
- `--subs` writes manual subtitle files. `--auto-subs` adds generated subtitles, or selects
|
|
304
|
+
only generated subtitles when used alone. `--sub-langs de,en` selects languages;
|
|
305
|
+
`--sub-format srt/vtt/best` prefers available source formats in that order. A format
|
|
306
|
+
preference does not convert subtitles. `--embed-subs` embeds selected subtitles into
|
|
307
|
+
the video container.
|
|
288
308
|
- `--embed-metadata` and `--embed-thumbnail` use FFmpeg to write metadata and cover art.
|
|
289
309
|
- `--sponsorblock-remove sponsor,selfpromo` cuts sponsor segments (YouTube) and requires
|
|
290
310
|
FFmpeg; the cut re-encodes the affected parts.
|
|
@@ -292,6 +312,16 @@ video sites. All new options are also documented in `veo config guide`.
|
|
|
292
312
|
- `-N 8` downloads several fragments in parallel, which is noticeably faster on HLS/DASH
|
|
293
313
|
sources and heavier on the network.
|
|
294
314
|
|
|
315
|
+
### Optional post-download verification
|
|
316
|
+
|
|
317
|
+
Use `veo <URL> --verify` or set `"verify": true` in a config profile to check
|
|
318
|
+
saved media with FFprobe before recording a successful download. It checks that
|
|
319
|
+
the container can be probed and contains a video track (or an audio track for
|
|
320
|
+
`--audio`). Verification is off by default; `--no-verify` overrides a profile.
|
|
321
|
+
This quick check does not decode the whole file or prove that the audio is
|
|
322
|
+
audible. Use `veo inspect <file> --check-audio` for a full audio signal check.
|
|
323
|
+
If verification fails, veo reports failure and keeps the saved file for review.
|
|
324
|
+
|
|
295
325
|
### Access and credentials
|
|
296
326
|
|
|
297
327
|
veo downloads publicly accessible content. It does not bypass access controls, and it does
|
|
@@ -309,10 +339,10 @@ download fails because a login is required, the error message points at these fl
|
|
|
309
339
|
|
|
310
340
|
### Inspection and scripting
|
|
311
341
|
|
|
312
|
-
- `veo <page-url> --list-sources` opens the page in a temporary headless Chrome,
|
|
313
|
-
Edge or Chromium profile, repeatedly checks for visible Play controls (including
|
|
314
|
-
controls added later or inside frames), and watches media requests after interaction.
|
|
315
|
-
Use `--json` for numbered source
|
|
342
|
+
- `veo <page-url> --list-sources` opens the page in a temporary headless Chrome,
|
|
343
|
+
Edge or Chromium profile, repeatedly checks for visible Play controls (including
|
|
344
|
+
controls added later or inside frames), and watches media requests after interaction.
|
|
345
|
+
Use `--json` for numbered source
|
|
316
346
|
metadata. Each result includes its title, host, HLS/DASH/direct type, known
|
|
317
347
|
resolutions, estimated MiB size and Mbit/s bitrate when the source provides them. Signed media
|
|
318
348
|
URLs are not printed. Set `VEO_BROWSER_PATH` if the browser is not found.
|
|
@@ -324,17 +354,22 @@ download fails because a login is required, the error message points at these fl
|
|
|
324
354
|
is reached, verified sources found so far are shown with a timeout notice.
|
|
325
355
|
A deep scan covers observed requests; it cannot discover sources that the
|
|
326
356
|
page never loads. The timeout does not stop a subsequent download.
|
|
327
|
-
- For an unsupported single page URL, veo searches for media automatically and
|
|
328
|
-
uses the only verified source when there is one. If several sources are found,
|
|
329
|
-
the terminal asks which one to use; scripts receive a numbered source list and
|
|
330
|
-
a nonzero exit. `veo <page-url> --source 2 --dry-run --json` previews a chosen
|
|
331
|
-
source, and `veo <page-url> --source 2 --json` downloads it. Scripts never
|
|
332
|
-
receive an interactive prompt.
|
|
357
|
+
- For an unsupported single page URL, veo searches for media automatically and
|
|
358
|
+
uses the only verified source when there is one. If several sources are found,
|
|
359
|
+
the terminal asks which one to use; scripts receive a numbered source list and
|
|
360
|
+
a nonzero exit. `veo <page-url> --source 2 --dry-run --json` previews a chosen
|
|
361
|
+
source, and `veo <page-url> --source 2 --json` downloads it. Scripts never
|
|
362
|
+
receive an interactive prompt.
|
|
333
363
|
Retry jobs retain the page URL and selected number and discover a fresh media
|
|
334
364
|
URL, because player links may expire. Browser discovery uses a temporary
|
|
335
|
-
profile without copying browser cookies, and cannot unlock DRM content.
|
|
336
|
-
Misspelled flags and commands show a nearby valid spelling, for example
|
|
337
|
-
`--deepscan` suggests `--deep-scan`.
|
|
365
|
+
profile without copying browser cookies, and cannot unlock DRM content.
|
|
366
|
+
Misspelled flags and commands show a nearby valid spelling, for example
|
|
367
|
+
`--deepscan` suggests `--deep-scan`.
|
|
368
|
+
- `veo <url> --list-qualities` lists available video resolutions, highest first,
|
|
369
|
+
without downloading media. `--list-qualitys` is an alias. Add `--json` for
|
|
370
|
+
a `qualities` array (e.g. `["1080p", "720p"]`); use `--quality 720p` to select
|
|
371
|
+
an upper bound. Unknown resolutions are reported without guessing. Audio-only,
|
|
372
|
+
storyboard and DRM formats are excluded. Supports `--source <number>` for embedded players.
|
|
338
373
|
- `--list-formats` prints the backend's own format table for one URL and exits.
|
|
339
374
|
- `--dry-run` prints the title, the resolved quality and the destination path that would be
|
|
340
375
|
used — without creating the output directory or downloading anything.
|
|
@@ -383,10 +418,11 @@ are not allowed.
|
|
|
383
418
|
}
|
|
384
419
|
```
|
|
385
420
|
|
|
386
|
-
Supported keys: `output`, `quality`, `format`, `rename`, `audio`, `open`, `resume`,
|
|
387
|
-
`closestQuality`, `cookies`, `cookiesFromBrowser`, `playlist`, `concurrentFragments`,
|
|
421
|
+
Supported keys: `output`, `quality`, `format`, `rename`, `audio`, `open`, `resume`, `incognito`, `neutralFilename`,
|
|
422
|
+
`closestQuality`, `cookies`, `cookiesFromBrowser`, `playlist`, `concurrentFragments`,
|
|
423
|
+
`experimentalFragments`, `playlistConcurrency`, `recode`, `compatible`, `concurrentDownloads`, `adaptiveConcurrency`,
|
|
388
424
|
`filenameTemplate`, `folderTemplate`, `checkSpace`, `timings`, `color`,
|
|
389
|
-
`subs`, `subLangs`, `embedSubs`, `embedMetadata`, `embedThumbnail`, `sponsorblockRemove`,
|
|
425
|
+
`subs`, `autoSubs`, `subLangs`, `subFormat`, `embedSubs`, `embedMetadata`, `embedThumbnail`, `sponsorblockRemove`, `verify`,
|
|
390
426
|
`section`, `json`. An explicit command-line flag always wins over a stored default. An
|
|
391
427
|
unknown key produces a warning; invalid JSON or a wrong value type is an error, because
|
|
392
428
|
silently ignoring a typo would be worse.
|
|
@@ -394,29 +430,50 @@ silently ignoring a typo would be worse.
|
|
|
394
430
|
Source discovery defaults are `deepScan` (boolean), `timeout` (string such as
|
|
395
431
|
`"30s"` or `"2m"`), `listSources` (boolean) and `autoListSources` (boolean).
|
|
396
432
|
`listSources: true` makes a single URL list sources and exit; use
|
|
397
|
-
`--no-list-sources` to download for one invocation. `autoListSources` defaults
|
|
398
|
-
to `true` and searches when ordinary extraction finds no downloadable video.
|
|
399
|
-
Set it to `false` or pass `--no-auto-list-sources` to disable that fallback.
|
|
400
|
-
A single verified source is selected automatically; multiple sources require
|
|
401
|
-
a choice. `deepScan` and
|
|
433
|
+
`--no-list-sources` to download for one invocation. `autoListSources` defaults
|
|
434
|
+
to `true` and searches when ordinary extraction finds no downloadable video.
|
|
435
|
+
Set it to `false` or pass `--no-auto-list-sources` to disable that fallback.
|
|
436
|
+
A single verified source is selected automatically; multiple sources require
|
|
437
|
+
a choice. `deepScan` and
|
|
402
438
|
`timeout` apply to either kind of source search.
|
|
403
439
|
|
|
404
440
|
Additional defaults are `skipExisting` and `playlistItems`. Boolean defaults can be disabled
|
|
405
441
|
with `--no-open`, `--no-audio`, `--no-resume`, `--no-embed-metadata`, etc. `--no-subs` also
|
|
406
442
|
disables stored subtitle languages and subtitle embedding for that invocation.
|
|
407
443
|
|
|
444
|
+
### Incognito downloads
|
|
445
|
+
|
|
446
|
+
Use `veo <url> --incognito` or set `"incognito": true` in a named profile. The
|
|
447
|
+
downloaded media is saved normally. veo does not assign a run ID or write a
|
|
448
|
+
retry job, run archive, download history, output `.veo-history` record, or
|
|
449
|
+
statistics for that attempt. It uses a private temporary staging directory and
|
|
450
|
+
removes it after success, failure, or cancellation. It also disables yt-dlp's
|
|
451
|
+
filesystem cache. `--no-incognito` overrides
|
|
452
|
+
a profile for one request. Incognito cannot be combined with `--resume`,
|
|
453
|
+
`--skip-existing`, or `--retry-failed`; there is no veo retry for an incognito
|
|
454
|
+
attempt. A force-killed process may leave temporary files that the OS can
|
|
455
|
+
clean later. The destination file, shell history, network service, and source
|
|
456
|
+
website can still reveal the download.
|
|
457
|
+
|
|
458
|
+
Example profile: `"profiles": { "private": { "incognito": true } }`.
|
|
459
|
+
Add `"neutralFilename": true` to that profile, or pass `--neutral-filename`,
|
|
460
|
+
to save files as names such as `video-a1b2c3d4e5f6.mp4`. This is optional:
|
|
461
|
+
incognito keeps the normal title by default. Neutral naming overrides `--rename`,
|
|
462
|
+
`--filename-template`, and `--folder-template` for that request. The selected
|
|
463
|
+
output directory, media contents, and embedded metadata are unaffected.
|
|
464
|
+
|
|
408
465
|
### Named profiles
|
|
409
466
|
|
|
410
|
-
If no profile is selected, `profiles.default` is applied automatically. `veo profile music`
|
|
411
|
-
selects another named profile for future commands and stores it as `activeProfile` in the
|
|
412
|
-
config; `veo profile` shows the current choice, and `veo profile list` marks it in
|
|
413
|
-
the list. `veo profile reset` removes the stored choice and returns to `default`.
|
|
414
|
-
You can also use `veo profile default` to select it explicitly.
|
|
415
|
-
The names `list` and `reset` are reserved for these commands and cannot be used as profile names.
|
|
416
|
-
`--profile NAME` overrides this choice for one command. Named profiles use global defaults
|
|
417
|
-
rather than inheriting `default`. The wizard preselects the active profile.
|
|
418
|
-
New configurations include an empty `default` profile and the example profiles. Existing configurations are
|
|
419
|
-
left unchanged when opened. An empty profile does not change download behavior.
|
|
467
|
+
If no profile is selected, `profiles.default` is applied automatically. `veo profile music`
|
|
468
|
+
selects another named profile for future commands and stores it as `activeProfile` in the
|
|
469
|
+
config; `veo profile` shows the current choice, and `veo profile list` marks it in
|
|
470
|
+
the list. `veo profile reset` removes the stored choice and returns to `default`.
|
|
471
|
+
You can also use `veo profile default` to select it explicitly.
|
|
472
|
+
The names `list` and `reset` are reserved for these commands and cannot be used as profile names.
|
|
473
|
+
`--profile NAME` overrides this choice for one command. Named profiles use global defaults
|
|
474
|
+
rather than inheriting `default`. The wizard preselects the active profile.
|
|
475
|
+
New configurations include an empty `default` profile and the example profiles. Existing configurations are
|
|
476
|
+
left unchanged when opened. An empty profile does not change download behavior.
|
|
420
477
|
|
|
421
478
|
```json
|
|
422
479
|
{
|
|
@@ -429,15 +486,15 @@ left unchanged when opened. An empty profile does not change download behavior.
|
|
|
429
486
|
}
|
|
430
487
|
```
|
|
431
488
|
|
|
432
|
-
`veo <url> --profile music` merges global defaults, then the selected profile, then explicit
|
|
433
|
-
CLI flags. `veo config profiles` lists profile names; `veo config path` prints the file path.
|
|
434
|
-
The download status shows `Profile: NAME` (or `global (no profile)` when none is configured).
|
|
435
|
-
`veo config edit` creates a small, valid configuration for new or empty files. Opening an
|
|
436
|
-
existing configuration does not add or update comments. The current option guide is kept in
|
|
437
|
-
the program; `veo config guide` prints it without changing the file. In the built-in editor,
|
|
438
|
-
F3 offers **A** to add or update the guide at the top and **R** to remove a previously
|
|
439
|
-
generated guide. Ctrl+S saves that choice. This can also clean up the long duplicate block
|
|
440
|
-
inserted by older versions. Personal settings and notes below a generated block are preserved.
|
|
489
|
+
`veo <url> --profile music` merges global defaults, then the selected profile, then explicit
|
|
490
|
+
CLI flags. `veo config profiles` lists profile names; `veo config path` prints the file path.
|
|
491
|
+
The download status shows `Profile: NAME` (or `global (no profile)` when none is configured).
|
|
492
|
+
`veo config edit` creates a small, valid configuration for new or empty files. Opening an
|
|
493
|
+
existing configuration does not add or update comments. The current option guide is kept in
|
|
494
|
+
the program; `veo config guide` prints it without changing the file. In the built-in editor,
|
|
495
|
+
F3 offers **A** to add or update the guide at the top and **R** to remove a previously
|
|
496
|
+
generated guide. Ctrl+S saves that choice. This can also clean up the long duplicate block
|
|
497
|
+
inserted by older versions. Personal settings and notes below a generated block are preserved.
|
|
441
498
|
In an interactive terminal, it opens the built-in editor
|
|
442
499
|
unless `VISUAL` or `EDITOR` is configured (an executable path, without shell arguments).
|
|
443
500
|
The editor provides syntax colors, line numbers and live validation. Syntax errors mark
|
|
@@ -446,13 +503,13 @@ spelling suggestions, expected types and allowed values in the status area. Vali
|
|
|
446
503
|
the same rules as the CLI, including profile overrides and audio/video formats.
|
|
447
504
|
Press F2 on a property or value to open suggestions, use Up/Down to choose, Enter to apply
|
|
448
505
|
or Esc to cancel. Suggestions require valid JSON syntax; free-text values and custom numeric
|
|
449
|
-
resolutions such as `900p` remain supported. Ctrl+S validates and saves;
|
|
450
|
-
Ctrl+Z undoes edits, Ctrl+Y redoes them, and Ctrl+A selects the whole file.
|
|
451
|
-
Esc or Ctrl+Q exits, asking before discarding changes. Use arrows, Home/End and PageUp/PageDown
|
|
506
|
+
resolutions such as `900p` remain supported. Ctrl+S validates and saves;
|
|
507
|
+
Ctrl+Z undoes edits, Ctrl+Y redoes them, and Ctrl+A selects the whole file.
|
|
508
|
+
Esc or Ctrl+Q exits, asking before discarding changes. Use arrows, Home/End and PageUp/PageDown
|
|
452
509
|
to navigate. Invalid configurations cannot be saved. `--no-color` disables syntax colors.
|
|
453
510
|
In terminals supporting SGR mouse reporting, left-click positions the cursor and dragging
|
|
454
|
-
selects text, including across lines. Holding the pointer at the top or bottom while dragging
|
|
455
|
-
scrolls the file and extends the selection. Backspace/Delete removes the selection; typing replaces
|
|
511
|
+
selects text, including across lines. Holding the pointer at the top or bottom while dragging
|
|
512
|
+
scrolls the file and extends the selection. Backspace/Delete removes the selection; typing replaces
|
|
456
513
|
it. The mouse wheel scrolls without changing the editing position; Ctrl+Up/Down also scrolls.
|
|
457
514
|
Ctrl+C copies selected text to the system clipboard, and Ctrl+V pastes clipboard text at the
|
|
458
515
|
cursor or replaces the selection. Ctrl+Q or Esc exits the editor. The editor disables mouse
|
|
@@ -477,8 +534,8 @@ $env:VEO_CONFIG_EDITOR = 'external'
|
|
|
477
534
|
|
|
478
535
|
Non-interactive sessions use the external editor unless `--terminal` is explicitly selected,
|
|
479
536
|
in which case an interactive-terminal error is reported. The wizard also offers configured profiles.
|
|
480
|
-
Generated guides and app messages are in English. Existing comments, profile names and
|
|
481
|
-
settings are preserved when opening the editor.
|
|
537
|
+
Generated guides and app messages are in English. Existing comments, profile names and
|
|
538
|
+
settings are preserved when opening the editor.
|
|
482
539
|
|
|
483
540
|
### Terminal output
|
|
484
541
|
|
|
@@ -514,14 +571,14 @@ settings are preserved when opening the editor.
|
|
|
514
571
|
```bash
|
|
515
572
|
veo version # installed version (also: veo --version or veo -v)
|
|
516
573
|
veo # interactive download wizard (terminal only)
|
|
517
|
-
veo config edit # create/open config; F3 offers the optional guide
|
|
518
|
-
veo config guide # print the current option guide
|
|
574
|
+
veo config edit # create/open config; F3 offers the optional guide
|
|
575
|
+
veo config guide # print the current option guide
|
|
519
576
|
veo config reset # confirm with y; back up config and restore the current template
|
|
520
|
-
veo config profiles # list available profiles
|
|
521
|
-
veo profile # show the currently selected profile
|
|
522
|
-
veo profile list # list all profiles and mark the active one
|
|
523
|
-
veo profile music # use music as the default for future commands
|
|
524
|
-
veo profile reset # return to default (or global settings if absent)
|
|
577
|
+
veo config profiles # list available profiles
|
|
578
|
+
veo profile # show the currently selected profile
|
|
579
|
+
veo profile list # list all profiles and mark the active one
|
|
580
|
+
veo profile music # use music as the default for future commands
|
|
581
|
+
veo profile reset # return to default (or global settings if absent)
|
|
525
582
|
veo config path # show the config file location
|
|
526
583
|
veo doctor # diagnose the local setup; exit 1 if a check fails
|
|
527
584
|
veo doctor fix # restore missing or damaged managed tools
|
|
@@ -533,6 +590,7 @@ veo retry --last # retry the newest failed or unfinished job
|
|
|
533
590
|
veo runs # active runs with their id; veo runs <id> for details
|
|
534
591
|
veo runs --json # machine-readable active run metadata
|
|
535
592
|
veo inspect FILE --check-audio --json # track metadata and audio signal
|
|
593
|
+
veo subs URL --json # available manual and automatic subtitles
|
|
536
594
|
veo inspect run ID --check-audio --json # finished run and saved media
|
|
537
595
|
veo stop [id] # stop one run, or every active run
|
|
538
596
|
veo flush # stop runs, clear temporary downloads and retry jobs
|
|
@@ -814,3 +872,6 @@ replacing the CLI.
|
|
|
814
872
|
## License
|
|
815
873
|
|
|
816
874
|
MIT for this CLI. yt-dlp and FFmpeg/FFprobe retain their respective upstream licenses.
|
|
875
|
+
# Clickable paths
|
|
876
|
+
|
|
877
|
+
In supported terminals (Windows Terminal, iTerm2, WezTerm, Kitty, VS Code and recent VTE terminals), the `Saved:` path, `veo config path` and the config editor's header link to the containing folder. Use the terminal's link gesture, usually Ctrl+click or Cmd+click. The terminal and operating system decide whether file links open the file manager; unsupported terminals and redirected output show plain paths. Missing paths are not linked. JSON output remains plain.
|
package/docs/AGENT_GUIDE.md
CHANGED
|
@@ -10,14 +10,14 @@ veo "https://example.com/video" --json --output ./downloads
|
|
|
10
10
|
veo inspect "./downloads/video.mp4" --check-audio --json
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
For a page with an embedded player that the normal extractor cannot identify,
|
|
14
|
-
`veo "<page-url>" --dry-run --json` searches for playable media automatically.
|
|
15
|
-
It uses a single verified source without a second command. If several sources
|
|
16
|
-
are found, run `veo "<page-url>" --list-sources --json` and choose an `index`,
|
|
17
|
-
then use `veo "<page-url>" --source <index> --dry-run --json` before downloading.
|
|
18
|
-
Source discovery opens a temporary headless Chromium-based
|
|
19
|
-
browser, repeatedly checks for Play controls, and observes media requests after
|
|
20
|
-
interaction. It needs Chrome, Edge or Chromium,
|
|
13
|
+
For a page with an embedded player that the normal extractor cannot identify,
|
|
14
|
+
`veo "<page-url>" --dry-run --json` searches for playable media automatically.
|
|
15
|
+
It uses a single verified source without a second command. If several sources
|
|
16
|
+
are found, run `veo "<page-url>" --list-sources --json` and choose an `index`,
|
|
17
|
+
then use `veo "<page-url>" --source <index> --dry-run --json` before downloading.
|
|
18
|
+
Source discovery opens a temporary headless Chromium-based
|
|
19
|
+
browser, repeatedly checks for Play controls, and observes media requests after
|
|
20
|
+
interaction. It needs Chrome, Edge or Chromium,
|
|
21
21
|
or `VEO_BROWSER_PATH`. A found source is verified by the backend; size may be
|
|
22
22
|
unknown, and DRM-protected media is excluded. Source numbers are tied to the
|
|
23
23
|
page's current discovery run and may change later.
|
|
@@ -31,6 +31,12 @@ not to a later download.
|
|
|
31
31
|
|
|
32
32
|
Set `VEO_NO_UPDATE_CHECK=1` when a background update notice would distract a script. Use an explicit output directory to avoid depending on the agent's current working directory. `--dry-run` plans the download without saving media. It can still inspect the source and prepare backend tools on first use.
|
|
33
33
|
|
|
34
|
+
Use `veo "<url>" --list-qualities --json` to list video resolutions without
|
|
35
|
+
downloading media. The result has `status: "qualities"` and a `qualities` array
|
|
36
|
+
ordered highest first, such as `["1080p", "720p"]`. `--list-qualitys` is an alias.
|
|
37
|
+
An empty array means the video has no known resolution; audio-only and DRM
|
|
38
|
+
formats are excluded. Use `--source <index>` for a discovered player source.
|
|
39
|
+
|
|
34
40
|
## Output and failures
|
|
35
41
|
|
|
36
42
|
Download commands write **one JSON object per URL** to stdout with `--json`. Several URLs produce newline-delimited JSON, not a JSON array. Progress, summaries and errors go to stderr. A failed item can still contain saved files, especially within a playlist.
|
|
@@ -58,10 +64,12 @@ veo history --failed --limit 20 --json
|
|
|
58
64
|
veo retry --last --json
|
|
59
65
|
```
|
|
60
66
|
|
|
61
|
-
`runs` reports **active** runs, including their ID, state, options, job path and per-item progress. Completed runs disappear from this list. Download JSON and `history` retain the `runId`. `history` reports finished attempts with their outcome and saved file paths.
|
|
67
|
+
`runs` reports **active** runs, including their ID, state, options, job path and per-item progress. Completed runs disappear from this list. Download JSON and `history` retain the `runId`. `history` reports finished attempts with their outcome and saved file paths. Use `veo --retry-failed <runId>` to retry a failed or unfinished run; a saved `job` path is also accepted as `veo --retry-failed "<job-path>"`. The original retry job must still be present, and retrying an active run by ID is rejected. `veo retry --last` finds the newest retryable job automatically. Running jobs are excluded from `retry --last`.
|
|
62
68
|
|
|
63
69
|
## Inspect saved media and audio
|
|
64
70
|
|
|
71
|
+
`veo subs <URL> --json` lists manual and automatic subtitle languages and formats without saving media. Select manual subtitles with `--subs --sub-langs de,en`, generated subtitles with `--auto-subs --sub-langs de,en`, and prefer a source format with `--sub-format srt/vtt/best`. `--verify` optionally probes saved media files before recording success; it is off by default and does not decode the full track.
|
|
72
|
+
|
|
65
73
|
```sh
|
|
66
74
|
veo inspect "/downloads/Example.mp4" --json
|
|
67
75
|
veo inspect "/downloads/Example.mp4" --check-audio --json
|
|
@@ -79,6 +87,12 @@ The run record is stored in veo's per-user cache on the device that ran the down
|
|
|
79
87
|
|
|
80
88
|
## Operational notes
|
|
81
89
|
|
|
90
|
+
- `veo <URL> --incognito --json` saves media without a run ID, retry job, history, run archive, output duplicate record or statistics. It disables yt-dlp's filesystem cache. A config profile can set `"incognito": true`; `--no-incognito` overrides it. Incognito cannot use `--resume`, `--skip-existing`, or retry. Its temporary staging data is removed after the attempt; the output file and records outside veo (such as shell history or server logs) still exist.
|
|
91
|
+
- Add `--neutral-filename` or `"neutralFilename": true` to use random media filenames instead of titles. This option is independent of `--incognito` and overrides custom file and folder naming for that request.
|
|
92
|
+
|
|
93
|
+
- Fragment concurrency defaults to 8. Values 1-16 need no confirmation; 17-64 are experimental and require terminal `y/N` confirmation before downloading. Scripts and JSON calls must explicitly accept with `--experimental-fragments` or `"experimentalFragments": true` in the config/profile. Values above 64 are always rejected. More connections may trigger server limits and do not guarantee higher speed. Dry-runs and source/format listings do not require confirmation.
|
|
94
|
+
- Example profile: `"experimental": { "concurrentFragments": 32, "experimentalFragments": true }`. Run with `veo <URL> --profile experimental`; use `--no-experimental-fragments` to revoke a stored opt-in.
|
|
95
|
+
|
|
82
96
|
- Run `veo doctor --offline` to check the local setup without network repair. `veo doctor fix` may install missing tools.
|
|
83
97
|
- Use `--resume` for interrupted downloads and `--skip-existing` when repeated saves should be avoided.
|
|
84
98
|
- `veo flush` removes temporary downloads and retry jobs; do not run it as routine maintenance in an agent workflow.
|
package/package.json
CHANGED
|
@@ -1,58 +1,61 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "veodl",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "A clean, simple video downloader powered by yt-dlp.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"veo": "bin/veo.js",
|
|
8
|
-
"veodl": "bin/veo.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"bin/",
|
|
12
|
-
"src/",
|
|
13
|
-
"docs/",
|
|
14
|
-
"AGENTS.md",
|
|
15
|
-
"README.md",
|
|
16
|
-
"CHANGELOG.md",
|
|
17
|
-
"LICENSE"
|
|
18
|
-
],
|
|
19
|
-
"engines": {
|
|
20
|
-
"node": ">=22"
|
|
21
|
-
},
|
|
22
|
-
"scripts": {
|
|
23
|
-
"test": "node --test",
|
|
24
|
-
"test:smoke": "node scripts/smoke.js",
|
|
25
|
-
"test:open": "node scripts/smoke-open.js",
|
|
26
|
-
"check:package": "node scripts/check-package.js",
|
|
27
|
-
"prepublishOnly": "npm test",
|
|
28
|
-
"test:workflows": "node scripts/smoke-workflows.js"
|
|
29
|
-
},
|
|
30
|
-
"keywords": [
|
|
31
|
-
"cli",
|
|
32
|
-
"video",
|
|
33
|
-
"downloader",
|
|
34
|
-
"yt-dlp",
|
|
35
|
-
"audio",
|
|
36
|
-
"youtube",
|
|
37
|
-
"playlist",
|
|
38
|
-
"subtitles"
|
|
39
|
-
],
|
|
40
|
-
"license": "MIT",
|
|
41
|
-
"author": "Mailo037",
|
|
42
|
-
"repository": {
|
|
43
|
-
"type": "git",
|
|
44
|
-
"url": "git+https://github.com/Mailo037/veodl.git"
|
|
45
|
-
},
|
|
46
|
-
"bugs": {
|
|
47
|
-
"url": "https://github.com/Mailo037/veodl/issues"
|
|
48
|
-
},
|
|
49
|
-
"homepage": "https://github.com/Mailo037/veodl#readme",
|
|
50
|
-
"preferGlobal": true,
|
|
51
|
-
"publishConfig": {
|
|
52
|
-
"access": "public"
|
|
53
|
-
},
|
|
54
|
-
"optionalDependencies": {
|
|
55
|
-
"ffmpeg-static": "5.3.0",
|
|
56
|
-
"ffprobe-static": "3.1.0"
|
|
57
|
-
}
|
|
58
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "veodl",
|
|
3
|
+
"version": "1.11.0",
|
|
4
|
+
"description": "A clean, simple video downloader powered by yt-dlp.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"veo": "bin/veo.js",
|
|
8
|
+
"veodl": "bin/veo.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin/",
|
|
12
|
+
"src/",
|
|
13
|
+
"docs/",
|
|
14
|
+
"AGENTS.md",
|
|
15
|
+
"README.md",
|
|
16
|
+
"CHANGELOG.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=22"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "node --test",
|
|
24
|
+
"test:smoke": "node scripts/smoke.js",
|
|
25
|
+
"test:open": "node scripts/smoke-open.js",
|
|
26
|
+
"check:package": "node scripts/check-package.js",
|
|
27
|
+
"prepublishOnly": "npm test",
|
|
28
|
+
"test:workflows": "node scripts/smoke-workflows.js"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"cli",
|
|
32
|
+
"video",
|
|
33
|
+
"downloader",
|
|
34
|
+
"yt-dlp",
|
|
35
|
+
"audio",
|
|
36
|
+
"youtube",
|
|
37
|
+
"playlist",
|
|
38
|
+
"subtitles"
|
|
39
|
+
],
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"author": "Mailo037",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/Mailo037/veodl.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/Mailo037/veodl/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/Mailo037/veodl#readme",
|
|
50
|
+
"preferGlobal": true,
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"optionalDependencies": {
|
|
55
|
+
"ffmpeg-static": "5.3.0",
|
|
56
|
+
"ffprobe-static": "3.1.0"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@xterm/headless": "6.0.0"
|
|
60
|
+
}
|
|
61
|
+
}
|