veodl 1.10.0 → 1.10.1

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 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> --dry-run --json` to inspect the intended output, then `veo <url> --json` to download authorized content.
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` for the latest failed or unfinished job. 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.
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,23 @@
2
2
 
3
3
  All notable changes to veo. This project follows [Semantic Versioning](https://semver.org/).
4
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
+
5
22
  ## 1.10.0
6
23
 
7
24
  ### Added
package/README.md CHANGED
@@ -68,7 +68,8 @@ 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-16 (default: 8)
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
  --sub-langs <langs> Subtitle languages, e.g. "de,en" (implies --subs)
74
75
  --embed-subs Embed subtitles into the video file
@@ -79,12 +80,13 @@ Options:
79
80
  --cookies <file> Netscape cookie file, for content you may access
80
81
  --cookies-from-browser <browser[:profile]>
81
82
  --resume Keep partial data and continue an interrupted download
83
+ --list-qualities Show available video resolutions and exit
82
84
  --list-formats Show available formats and exit
83
85
  --dry-run Show what would be downloaded and exit
84
86
  --json One JSON object per URL instead of prose
85
87
  --profile <name> Use a named profile from the config file
86
88
  --batch-file <file> Read one URL per line (blank lines and # comments ignored)
87
- --retry-failed <file> Retry failed/unfinished downloads from a saved job
89
+ --retry-failed <id|file> Retry failed/unfinished downloads by run ID or job file
88
90
  --playlist-items <list> Select entries, e.g. 1,3-5 (implies --playlist)
89
91
  --skip-existing Skip matching downloads that are still on disk
90
92
  --no-<boolean-option> Disable a default, e.g. --no-open or --no-audio
@@ -108,7 +110,7 @@ npx veodl "https://example.com/video.mp4" --output ./downloads
108
110
 
109
111
  ### Several URLs and playlists
110
112
 
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.
113
+ 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
114
 
113
115
  - Pass any number of URLs; up to two run concurrently by default. Use
114
116
  `--concurrent-downloads 1` for sequential processing. A failure is reported
@@ -125,7 +127,7 @@ Playlist downloads use two concurrent entries by default; use `--playlist-concur
125
127
  - `--batch-file links.txt` accepts a UTF-8 URL list, optionally alongside URLs on the command
126
128
  line. A final summary counts saved, skipped and failed videos. Successful files are opened
127
129
  with `--open` even if another URL or playlist entry fails.
128
- - Failed or cancelled jobs print a ready-to-use `veo --retry-failed "<job.json>"` command.
130
+ - Failed or cancelled jobs print a ready-to-use `veo --retry-failed <runId>` command. Saved job file paths are also accepted.
129
131
  - 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
132
  Jobs are stored under the per-user veo cache's `jobs` directory. Retries retain resolved
131
133
  output directories and settings, even from a different working directory, and explicit
@@ -141,6 +143,7 @@ veo --batch-file links.txt --profile archive
141
143
  veo "https://example.com/playlist" --playlist-items 1,3-5 --resume
142
144
  veo "https://example.com/playlist" --playlist --skip-existing
143
145
  veo --retry-failed "C:\path\to\job.json"
146
+ veo --retry-failed abc123
144
147
  veo retry --last
145
148
  ```
146
149
 
@@ -193,11 +196,11 @@ example through `veo config edit`. Enable it with `veo URL --profile kompatibel`
193
196
  reserved by concurrent downloads in the same process. Unknown sizes are reported as
194
197
  unknown; conversion sizes and other processes' disk usage cannot be predicted exactly.
195
198
  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.
199
+ - `--timings` shows phase times at the end of the run. Single downloads show
200
+ timing without a summary; multiple downloads show timing below the summary.
201
+ The phases cover setup, metadata, download/backend, processing, saving and retry waits.
202
+ Download/backend includes the backend's own startup and extraction overhead;
203
+ these are summed per-download times, not a diagnosis of network speed.
201
204
  JSON results include `timings` in milliseconds, or `entryTimings` for playlists.
202
205
  Use `--no-timings` to hide/omit them.
203
206
  - Terminal details are gray, titles bold, saves green and errors red. The same styling
@@ -205,6 +208,12 @@ example through `veo config edit`. Enable it with `veo URL --profile kompatibel`
205
208
  interactive prompts. For example, `veo stats --no-color` disables it for one command. Redirected output
206
209
  and JSON have no color escapes. `--no-color`, `"color": false`, `NO_COLOR`,
207
210
  and `TERM=dumb` disable colors.
211
+ Terminal reports shorten long URLs, paths and detail values to the current window
212
+ width. Titles can use up to three lines before an ellipsis is added. This also
213
+ applies with `--no-color`; JSON and redirected output retain complete values.
214
+ Downloads stay in the normal terminal flow. Only the current progress block is
215
+ updated in place; narrow windows put the statistics below the progress bar.
216
+ Existing logs remain in scrollback and are not replayed or rewritten on resize.
208
217
  This can be set independently per profile, for example
209
218
  `"profiles": { "default": { "color": true }, "plain": { "color": false } }`.
210
219
  Use `veo stats --profile plain` or `veo URL --profile plain`; `--color` or
@@ -232,7 +241,7 @@ veo config show --profile fast
232
241
  Config checks validate every effective profile (or the selected one), including unknown
233
242
  settings, ranges and conflicting options. Show prints merged built-in, global and profile
234
243
  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`.
244
+ video sites. All new options are also documented in `veo config guide`.
236
245
 
237
246
  ### Files, names and resume
238
247
 
@@ -309,10 +318,10 @@ download fails because a login is required, the error message points at these fl
309
318
 
310
319
  ### Inspection and scripting
311
320
 
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
321
+ - `veo <page-url> --list-sources` opens the page in a temporary headless Chrome,
322
+ Edge or Chromium profile, repeatedly checks for visible Play controls (including
323
+ controls added later or inside frames), and watches media requests after interaction.
324
+ Use `--json` for numbered source
316
325
  metadata. Each result includes its title, host, HLS/DASH/direct type, known
317
326
  resolutions, estimated MiB size and Mbit/s bitrate when the source provides them. Signed media
318
327
  URLs are not printed. Set `VEO_BROWSER_PATH` if the browser is not found.
@@ -324,17 +333,22 @@ download fails because a login is required, the error message points at these fl
324
333
  is reached, verified sources found so far are shown with a timeout notice.
325
334
  A deep scan covers observed requests; it cannot discover sources that the
326
335
  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.
336
+ - For an unsupported single page URL, veo searches for media automatically and
337
+ uses the only verified source when there is one. If several sources are found,
338
+ the terminal asks which one to use; scripts receive a numbered source list and
339
+ a nonzero exit. `veo <page-url> --source 2 --dry-run --json` previews a chosen
340
+ source, and `veo <page-url> --source 2 --json` downloads it. Scripts never
341
+ receive an interactive prompt.
333
342
  Retry jobs retain the page URL and selected number and discover a fresh media
334
343
  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`.
344
+ profile without copying browser cookies, and cannot unlock DRM content.
345
+ Misspelled flags and commands show a nearby valid spelling, for example
346
+ `--deepscan` suggests `--deep-scan`.
347
+ - `veo <url> --list-qualities` lists available video resolutions, highest first,
348
+ without downloading media. `--list-qualitys` is an alias. Add `--json` for
349
+ a `qualities` array (e.g. `["1080p", "720p"]`); use `--quality 720p` to select
350
+ an upper bound. Unknown resolutions are reported without guessing. Audio-only,
351
+ storyboard and DRM formats are excluded. Supports `--source <number>` for embedded players.
338
352
  - `--list-formats` prints the backend's own format table for one URL and exits.
339
353
  - `--dry-run` prints the title, the resolved quality and the destination path that would be
340
354
  used — without creating the output directory or downloading anything.
@@ -384,7 +398,8 @@ are not allowed.
384
398
  ```
385
399
 
386
400
  Supported keys: `output`, `quality`, `format`, `rename`, `audio`, `open`, `resume`,
387
- `closestQuality`, `cookies`, `cookiesFromBrowser`, `playlist`, `concurrentFragments`, `playlistConcurrency`, `recode`, `compatible`, `concurrentDownloads`, `adaptiveConcurrency`,
401
+ `closestQuality`, `cookies`, `cookiesFromBrowser`, `playlist`, `concurrentFragments`,
402
+ `experimentalFragments`, `playlistConcurrency`, `recode`, `compatible`, `concurrentDownloads`, `adaptiveConcurrency`,
388
403
  `filenameTemplate`, `folderTemplate`, `checkSpace`, `timings`, `color`,
389
404
  `subs`, `subLangs`, `embedSubs`, `embedMetadata`, `embedThumbnail`, `sponsorblockRemove`,
390
405
  `section`, `json`. An explicit command-line flag always wins over a stored default. An
@@ -394,11 +409,11 @@ silently ignoring a typo would be worse.
394
409
  Source discovery defaults are `deepScan` (boolean), `timeout` (string such as
395
410
  `"30s"` or `"2m"`), `listSources` (boolean) and `autoListSources` (boolean).
396
411
  `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
412
+ `--no-list-sources` to download for one invocation. `autoListSources` defaults
413
+ to `true` and searches when ordinary extraction finds no downloadable video.
414
+ Set it to `false` or pass `--no-auto-list-sources` to disable that fallback.
415
+ A single verified source is selected automatically; multiple sources require
416
+ a choice. `deepScan` and
402
417
  `timeout` apply to either kind of source search.
403
418
 
404
419
  Additional defaults are `skipExisting` and `playlistItems`. Boolean defaults can be disabled
@@ -407,16 +422,16 @@ disables stored subtitle languages and subtitle embedding for that invocation.
407
422
 
408
423
  ### Named profiles
409
424
 
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.
425
+ If no profile is selected, `profiles.default` is applied automatically. `veo profile music`
426
+ selects another named profile for future commands and stores it as `activeProfile` in the
427
+ config; `veo profile` shows the current choice, and `veo profile list` marks it in
428
+ the list. `veo profile reset` removes the stored choice and returns to `default`.
429
+ You can also use `veo profile default` to select it explicitly.
430
+ The names `list` and `reset` are reserved for these commands and cannot be used as profile names.
431
+ `--profile NAME` overrides this choice for one command. Named profiles use global defaults
432
+ rather than inheriting `default`. The wizard preselects the active profile.
433
+ New configurations include an empty `default` profile and the example profiles. Existing configurations are
434
+ left unchanged when opened. An empty profile does not change download behavior.
420
435
 
421
436
  ```json
422
437
  {
@@ -429,15 +444,15 @@ left unchanged when opened. An empty profile does not change download behavior.
429
444
  }
430
445
  ```
431
446
 
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.
447
+ `veo <url> --profile music` merges global defaults, then the selected profile, then explicit
448
+ CLI flags. `veo config profiles` lists profile names; `veo config path` prints the file path.
449
+ The download status shows `Profile: NAME` (or `global (no profile)` when none is configured).
450
+ `veo config edit` creates a small, valid configuration for new or empty files. Opening an
451
+ existing configuration does not add or update comments. The current option guide is kept in
452
+ the program; `veo config guide` prints it without changing the file. In the built-in editor,
453
+ F3 offers **A** to add or update the guide at the top and **R** to remove a previously
454
+ generated guide. Ctrl+S saves that choice. This can also clean up the long duplicate block
455
+ inserted by older versions. Personal settings and notes below a generated block are preserved.
441
456
  In an interactive terminal, it opens the built-in editor
442
457
  unless `VISUAL` or `EDITOR` is configured (an executable path, without shell arguments).
443
458
  The editor provides syntax colors, line numbers and live validation. Syntax errors mark
@@ -446,13 +461,13 @@ spelling suggestions, expected types and allowed values in the status area. Vali
446
461
  the same rules as the CLI, including profile overrides and audio/video formats.
447
462
  Press F2 on a property or value to open suggestions, use Up/Down to choose, Enter to apply
448
463
  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
464
+ resolutions such as `900p` remain supported. Ctrl+S validates and saves;
465
+ Ctrl+Z undoes edits, Ctrl+Y redoes them, and Ctrl+A selects the whole file.
466
+ Esc or Ctrl+Q exits, asking before discarding changes. Use arrows, Home/End and PageUp/PageDown
452
467
  to navigate. Invalid configurations cannot be saved. `--no-color` disables syntax colors.
453
468
  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
469
+ selects text, including across lines. Holding the pointer at the top or bottom while dragging
470
+ scrolls the file and extends the selection. Backspace/Delete removes the selection; typing replaces
456
471
  it. The mouse wheel scrolls without changing the editing position; Ctrl+Up/Down also scrolls.
457
472
  Ctrl+C copies selected text to the system clipboard, and Ctrl+V pastes clipboard text at the
458
473
  cursor or replaces the selection. Ctrl+Q or Esc exits the editor. The editor disables mouse
@@ -477,8 +492,8 @@ $env:VEO_CONFIG_EDITOR = 'external'
477
492
 
478
493
  Non-interactive sessions use the external editor unless `--terminal` is explicitly selected,
479
494
  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.
495
+ Generated guides and app messages are in English. Existing comments, profile names and
496
+ settings are preserved when opening the editor.
482
497
 
483
498
  ### Terminal output
484
499
 
@@ -514,14 +529,14 @@ settings are preserved when opening the editor.
514
529
  ```bash
515
530
  veo version # installed version (also: veo --version or veo -v)
516
531
  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
532
+ veo config edit # create/open config; F3 offers the optional guide
533
+ veo config guide # print the current option guide
519
534
  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)
535
+ veo config profiles # list available profiles
536
+ veo profile # show the currently selected profile
537
+ veo profile list # list all profiles and mark the active one
538
+ veo profile music # use music as the default for future commands
539
+ veo profile reset # return to default (or global settings if absent)
525
540
  veo config path # show the config file location
526
541
  veo doctor # diagnose the local setup; exit 1 if a check fails
527
542
  veo doctor fix # restore missing or damaged managed tools
@@ -814,3 +829,6 @@ replacing the CLI.
814
829
  ## License
815
830
 
816
831
  MIT for this CLI. yt-dlp and FFmpeg/FFprobe retain their respective upstream licenses.
832
+ # Clickable paths
833
+
834
+ 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.
@@ -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,7 +64,7 @@ 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. A failed history entry may contain a `job` path, which can be passed to `veo --retry-failed "<job-path>"`; `veo retry --last` finds the newest retryable job automatically. Running jobs are excluded from `retry --last`.
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
 
@@ -79,6 +85,9 @@ The run record is stored in veo's per-user cache on the device that ran the down
79
85
 
80
86
  ## Operational notes
81
87
 
88
+ - 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.
89
+ - Example profile: `"experimental": { "concurrentFragments": 32, "experimentalFragments": true }`. Run with `veo <URL> --profile experimental`; use `--no-experimental-fragments` to revoke a stored opt-in.
90
+
82
91
  - Run `veo doctor --offline` to check the local setup without network repair. `veo doctor fix` may install missing tools.
83
92
  - Use `--resume` for interrupted downloads and `--skip-existing` when repeated saves should be avoided.
84
93
  - `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.10.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
- }
1
+ {
2
+ "name": "veodl",
3
+ "version": "1.10.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
+ "devDependencies": {
59
+ "@xterm/headless": "6.0.0"
60
+ }
61
+ }