veodl 1.12.1 → 2.0.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 +12 -12
- package/CHANGELOG.md +404 -373
- package/LICENSE +21 -21
- package/README.md +1040 -910
- package/bin/veo.js +47 -2
- package/docs/AGENT_GUIDE.md +135 -122
- package/native/android-arm64/veo +0 -0
- package/native/darwin-arm64/veo +0 -0
- package/native/darwin-x64/veo +0 -0
- package/native/linux-arm64/veo +0 -0
- package/native/linux-x64/veo +0 -0
- package/native/win32-arm64/veo.exe +0 -0
- package/native/win32-x64/veo.exe +0 -0
- package/package.json +53 -57
- package/src/alias.js +0 -258
- package/src/backend-update.js +0 -191
- package/src/backend.js +0 -572
- package/src/changes.js +0 -278
- package/src/cli.js +0 -785
- package/src/compatibility.js +0 -39
- package/src/config-clipboard.js +0 -67
- package/src/config-diagnostics.js +0 -155
- package/src/config-editor.js +0 -404
- package/src/config-errors.js +0 -64
- package/src/config-reset.js +0 -39
- package/src/config-template.js +0 -227
- package/src/config.js +0 -307
- package/src/disk-space.js +0 -68
- package/src/doctor.js +0 -306
- package/src/download-cache.js +0 -31
- package/src/downloader.js +0 -704
- package/src/execution.js +0 -68
- package/src/experimental-fragments.js +0 -29
- package/src/flush.js +0 -66
- package/src/history.js +0 -173
- package/src/inline-region.js +0 -72
- package/src/inspect-media.js +0 -179
- package/src/interactive.js +0 -120
- package/src/jobs.js +0 -218
- package/src/legacy-config-comments.js +0 -106
- package/src/media-assets.js +0 -272
- package/src/naming.js +0 -54
- package/src/open-file.js +0 -15
- package/src/option-suggestions.js +0 -43
- package/src/output.js +0 -81
- package/src/path-links.js +0 -53
- package/src/paths.js +0 -26
- package/src/playlist.js +0 -31
- package/src/progress.js +0 -341
- package/src/run-archive.js +0 -148
- package/src/runs.js +0 -346
- package/src/source-discovery.js +0 -305
- package/src/state.js +0 -27
- package/src/stats.js +0 -63
- package/src/terminal-size.js +0 -8
- package/src/terminal-title.js +0 -19
- package/src/tool-setup.js +0 -289
- package/src/uninstall.js +0 -222
- package/src/updater.js +0 -229
- package/src/utils.js +0 -208
- package/src/version.js +0 -38
package/bin/veo.js
CHANGED
|
@@ -1,4 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
// Automatically starts the matching native binary bundled in veodl.
|
|
3
|
+
// Exit codes and signals pass through.
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import path from 'node:path';
|
|
3
8
|
|
|
4
|
-
|
|
9
|
+
const root = fileURLToPath(new URL('../', import.meta.url));
|
|
10
|
+
const target = `${process.platform}-${process.arch}`;
|
|
11
|
+
const executable = process.platform === 'win32' ? 'veo.exe' : 'veo';
|
|
12
|
+
|
|
13
|
+
function binaryPath() {
|
|
14
|
+
if (process.env.VEO_BINARY) return process.env.VEO_BINARY;
|
|
15
|
+
// Windows on ARM can run the x64 build through emulation.
|
|
16
|
+
const candidates = [target, ...(target === 'win32-arm64' ? ['win32-x64'] : [])];
|
|
17
|
+
for (const candidate of candidates) {
|
|
18
|
+
const file = path.join(root, 'native', candidate, executable);
|
|
19
|
+
if (existsSync(file)) return file;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const binary = binaryPath();
|
|
25
|
+
if (!binary) {
|
|
26
|
+
process.stderr.write(`veo: no prebuilt binary for ${target} is installed.\n`
|
|
27
|
+
+ 'Reinstall with npm install -g veodl\n'
|
|
28
|
+
+ 'Or build from source: cargo install --git https://github.com/Mailo037/veodl\n');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const child = spawn(binary, process.argv.slice(2), { stdio: 'inherit', windowsHide: false });
|
|
33
|
+
// The terminal already delivers Ctrl+C to veo itself; keep this launcher alive
|
|
34
|
+
// until veo has cleaned up, and forward termination requests sent only to it.
|
|
35
|
+
for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
|
|
36
|
+
process.on(signal, () => { if (signal !== 'SIGINT') child.kill(signal); });
|
|
37
|
+
}
|
|
38
|
+
child.on('error', error => {
|
|
39
|
+
process.stderr.write(`veo: could not start ${binary}: ${error.message}\n`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
child.on('close', (code, signal) => {
|
|
43
|
+
if (signal) {
|
|
44
|
+
process.removeAllListeners(signal);
|
|
45
|
+
process.kill(process.pid, signal);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
process.exit(code ?? 1);
|
|
49
|
+
});
|
package/docs/AGENT_GUIDE.md
CHANGED
|
@@ -1,122 +1,135 @@
|
|
|
1
|
-
# veo for agents
|
|
2
|
-
|
|
3
|
-
veo is a command-line video downloader. Use it only for content the user is authorized to download. This guide covers the stable command flow and the difference between download state, media tracks and measured audio signal.
|
|
4
|
-
|
|
5
|
-
## Fast path
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
veo "https://example.com/video" --dry-run --json
|
|
9
|
-
veo "https://example.com/video" --json --output ./downloads
|
|
10
|
-
veo inspect "./downloads/video.mp4" --check-audio --json
|
|
11
|
-
```
|
|
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,
|
|
21
|
-
or `VEO_BROWSER_PATH`. A found source is verified by the backend; size may be
|
|
22
|
-
unknown, and DRM-protected media is excluded. Source numbers are tied to the
|
|
23
|
-
page's current discovery run and may change later.
|
|
24
|
-
|
|
25
|
-
Use `--deep-scan --timeout 2m` with `--list-sources` to check every observed
|
|
26
|
-
media candidate up to a two-minute source-search deadline. The JSON result
|
|
27
|
-
contains `timedOut: true` if the scan stopped at the deadline; any returned
|
|
28
|
-
sources were verified before it stopped. A timed-out listing exits nonzero,
|
|
29
|
-
even if it contains partial results. The timeout applies to discovery,
|
|
30
|
-
not to a later download.
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
## Output and failures
|
|
41
|
-
|
|
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.
|
|
43
|
-
|
|
44
|
-
Example success:
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
{"url":"https://example.com/video","status":"saved","title":"Example","files":["/downloads/Example.mp4"],"runId":"abc123"}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Example failure:
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{"url":"https://example.com/video","status":"failed","error":"HTTP Error 429","files":[]}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
These are abbreviated examples; fields such as timing and playlist counts may also be present. Exit code `0` means the command succeeded, `1` means at least one item failed, and `130` means cancellation. Validate both the exit code and each result's `status`; a command can fail before producing any stdout JSON. Never infer success from the presence of a file path alone.
|
|
57
|
-
|
|
58
|
-
## Inspect runs and results
|
|
59
|
-
|
|
60
|
-
```sh
|
|
61
|
-
veo runs --json
|
|
62
|
-
veo runs k3f9qa --json
|
|
63
|
-
veo history --failed --limit 20 --json
|
|
64
|
-
veo retry --last --json
|
|
65
|
-
```
|
|
66
|
-
|
|
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`.
|
|
68
|
-
|
|
69
|
-
## Release notes
|
|
70
|
-
|
|
71
|
-
```sh
|
|
72
|
-
veo changes --json
|
|
73
|
-
veo changes 1.10.1 --json
|
|
74
|
-
veo changes --since 1.9.0 --json
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
`veo changes` (alias `veo changelog`) parses the `CHANGELOG.md` shipped inside the installed
|
|
78
|
-
package, so it never touches the network and never prints an update hint. Bare, it lists every
|
|
79
|
-
released version, newest first, with the installed one marked as `installed`; a version argument
|
|
80
|
-
(or `--version`, also a partial version such as `1.10`) selects one release, `--latest` the newest,
|
|
81
|
-
and `--since <version>` with `--to <version>` or `--range <from>..<to>` everything between two
|
|
82
|
-
versions, newest first. An unknown version exits nonzero and lists the known ones.
|
|
83
|
-
|
|
84
|
-
The list form returns `{"current":…,"count":N,"versions":[{"version","date","installed","counts","summary"}]}`.
|
|
85
|
-
One version returns `{"current","version","date","installed","sections"}`, a range
|
|
86
|
-
`{"current","from","to","count","versions":[…]}`. `sections` is
|
|
87
|
-
`[{"type":"Added","items":[{"text":"…","items":[…]}]}]`; nested items are preserved and the text
|
|
88
|
-
is complete, so do not re-wrap it yourself. `date` is currently `null` because the changelog
|
|
89
|
-
headings carry no release date.
|
|
90
|
-
|
|
91
|
-
## Inspect saved media and audio
|
|
92
|
-
|
|
93
|
-
`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.
|
|
94
|
-
|
|
95
|
-
```sh
|
|
96
|
-
veo inspect "/downloads/Example.mp4" --json
|
|
97
|
-
veo inspect "/downloads/Example.mp4" --check-audio --json
|
|
98
|
-
veo inspect run abc123 --check-audio --json
|
|
99
|
-
veo inspect run abc123 --search "/moved/videos" --json
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
`inspect` uses local FFprobe/FFmpeg and never downloads a URL. Its JSON contains `format`, `durationSeconds`, `sizeBytes`, `streams`, `hasAudioTrack` and `hasVideoTrack`. Without `--check-audio`, `audioCheck` is `null`.
|
|
103
|
-
|
|
104
|
-
With `--check-audio`, veo decodes every audio track from start to end. `audioCheck.hasSignal` is true when at least one track's peak exceeds **−60 dBFS**. `audioCheck.tracks` lists each track's `streamIndex`, `maxDbfs` and `hasSignal`; digital silence may have `maxDbfs: null` or a very low level after conversion. A present audio track does not prove audible content. This is a signal-level check, not a listening or speech-quality test. Decoding long media can take time; if FFmpeg fails, the command exits nonzero instead of reporting silence.
|
|
105
|
-
|
|
106
|
-
`inspect run` reads the saved run record even after the download finishes. It checks whether each file still exists **before** probing it. If a media file was renamed, veo searches the original output tree using file identity, size and a three-part SHA-256 fingerprint. `--search` adds one more directory after a move. Missing or ambiguous matches are reported without probing a different file; missing files make the command exit with code `1`. The fingerprint lives in veo's run history, so this works across media formats without rewriting the media. Runs created before this feature do not have a persistent run record.
|
|
107
|
-
|
|
108
|
-
The run record is stored in veo's per-user cache on the device that ran the download. `inspect` works on Windows, macOS, Linux and Termux with locally available FFmpeg/FFprobe; set `VEO_FFMPEG_PATH` to their directory when they are not on the normal search path. Moving only the media to another device does not transfer the run record.
|
|
109
|
-
|
|
110
|
-
## Operational notes
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
- `
|
|
122
|
-
|
|
1
|
+
# veo for agents
|
|
2
|
+
|
|
3
|
+
veo is a command-line video downloader. Use it only for content the user is authorized to download. This guide covers the stable command flow and the difference between download state, media tracks and measured audio signal.
|
|
4
|
+
|
|
5
|
+
## Fast path
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
veo "https://example.com/video" --dry-run --json
|
|
9
|
+
veo "https://example.com/video" --json --output ./downloads
|
|
10
|
+
veo inspect "./downloads/video.mp4" --check-audio --json
|
|
11
|
+
```
|
|
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,
|
|
21
|
+
or `VEO_BROWSER_PATH`. A found source is verified by the backend; size may be
|
|
22
|
+
unknown, and DRM-protected media is excluded. Source numbers are tied to the
|
|
23
|
+
page's current discovery run and may change later.
|
|
24
|
+
|
|
25
|
+
Use `--deep-scan --timeout 2m` with `--list-sources` to check every observed
|
|
26
|
+
media candidate up to a two-minute source-search deadline. The JSON result
|
|
27
|
+
contains `timedOut: true` if the scan stopped at the deadline; any returned
|
|
28
|
+
sources were verified before it stopped. A timed-out listing exits nonzero,
|
|
29
|
+
even if it contains partial results. The timeout applies to discovery,
|
|
30
|
+
not to a later download.
|
|
31
|
+
|
|
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
|
+
|
|
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
|
+
|
|
40
|
+
## Output and failures
|
|
41
|
+
|
|
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.
|
|
43
|
+
|
|
44
|
+
Example success:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{"url":"https://example.com/video","status":"saved","title":"Example","files":["/downloads/Example.mp4"],"runId":"abc123"}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Example failure:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{"url":"https://example.com/video","status":"failed","error":"HTTP Error 429","files":[]}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
These are abbreviated examples; fields such as timing and playlist counts may also be present. Exit code `0` means the command succeeded, `1` means at least one item failed, and `130` means cancellation. Validate both the exit code and each result's `status`; a command can fail before producing any stdout JSON. Never infer success from the presence of a file path alone.
|
|
57
|
+
|
|
58
|
+
## Inspect runs and results
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
veo runs --json
|
|
62
|
+
veo runs k3f9qa --json
|
|
63
|
+
veo history --failed --limit 20 --json
|
|
64
|
+
veo retry --last --json
|
|
65
|
+
```
|
|
66
|
+
|
|
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`.
|
|
68
|
+
|
|
69
|
+
## Release notes
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
veo changes --json
|
|
73
|
+
veo changes 1.10.1 --json
|
|
74
|
+
veo changes --since 1.9.0 --json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`veo changes` (alias `veo changelog`) parses the `CHANGELOG.md` shipped inside the installed
|
|
78
|
+
package, so it never touches the network and never prints an update hint. Bare, it lists every
|
|
79
|
+
released version, newest first, with the installed one marked as `installed`; a version argument
|
|
80
|
+
(or `--version`, also a partial version such as `1.10`) selects one release, `--latest` the newest,
|
|
81
|
+
and `--since <version>` with `--to <version>` or `--range <from>..<to>` everything between two
|
|
82
|
+
versions, newest first. An unknown version exits nonzero and lists the known ones.
|
|
83
|
+
|
|
84
|
+
The list form returns `{"current":…,"count":N,"versions":[{"version","date","installed","counts","summary"}]}`.
|
|
85
|
+
One version returns `{"current","version","date","installed","sections"}`, a range
|
|
86
|
+
`{"current","from","to","count","versions":[…]}`. `sections` is
|
|
87
|
+
`[{"type":"Added","items":[{"text":"…","items":[…]}]}]`; nested items are preserved and the text
|
|
88
|
+
is complete, so do not re-wrap it yourself. `date` is currently `null` because the changelog
|
|
89
|
+
headings carry no release date.
|
|
90
|
+
|
|
91
|
+
## Inspect saved media and audio
|
|
92
|
+
|
|
93
|
+
`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.
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
veo inspect "/downloads/Example.mp4" --json
|
|
97
|
+
veo inspect "/downloads/Example.mp4" --check-audio --json
|
|
98
|
+
veo inspect run abc123 --check-audio --json
|
|
99
|
+
veo inspect run abc123 --search "/moved/videos" --json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`inspect` uses local FFprobe/FFmpeg and never downloads a URL. Its JSON contains `format`, `durationSeconds`, `sizeBytes`, `streams`, `hasAudioTrack` and `hasVideoTrack`. Without `--check-audio`, `audioCheck` is `null`.
|
|
103
|
+
|
|
104
|
+
With `--check-audio`, veo decodes every audio track from start to end. `audioCheck.hasSignal` is true when at least one track's peak exceeds **−60 dBFS**. `audioCheck.tracks` lists each track's `streamIndex`, `maxDbfs` and `hasSignal`; digital silence may have `maxDbfs: null` or a very low level after conversion. A present audio track does not prove audible content. This is a signal-level check, not a listening or speech-quality test. Decoding long media can take time; if FFmpeg fails, the command exits nonzero instead of reporting silence.
|
|
105
|
+
|
|
106
|
+
`inspect run` reads the saved run record even after the download finishes. It checks whether each file still exists **before** probing it. If a media file was renamed, veo searches the original output tree using file identity, size and a three-part SHA-256 fingerprint. `--search` adds one more directory after a move. Missing or ambiguous matches are reported without probing a different file; missing files make the command exit with code `1`. The fingerprint lives in veo's run history, so this works across media formats without rewriting the media. Runs created before this feature do not have a persistent run record.
|
|
107
|
+
|
|
108
|
+
The run record is stored in veo's per-user cache on the device that ran the download. `inspect` works on Windows, macOS, Linux and Termux with locally available FFmpeg/FFprobe; set `VEO_FFMPEG_PATH` to their directory when they are not on the normal search path. Moving only the media to another device does not transfer the run record.
|
|
109
|
+
|
|
110
|
+
## Operational notes
|
|
111
|
+
|
|
112
|
+
- Rust handles eligible anonymous direct HTTP video transfers by default. Use
|
|
113
|
+
`--http-connections 4` (1-16) to set its maximum or `--no-native-http` to keep
|
|
114
|
+
yt-dlp transfers. DASH/HLS, authentication and transformations remain with
|
|
115
|
+
yt-dlp. Host connection budgets are shared across downloads and fragments;
|
|
116
|
+
adaptive reductions recover gradually after successful operations.
|
|
117
|
+
- `--staging-dir output` stages beside the destination; an explicit directory
|
|
118
|
+
selects another staging drive. These roots are included in expiration cleanup
|
|
119
|
+
and `veo flush`. The local cache remains the default. `--resume` reuses native
|
|
120
|
+
HTTP byte ranges only when the source still has the same strong ETag.
|
|
121
|
+
- `--fast-cut` requires `--section` and opts into faster cuts at nearby keyframes;
|
|
122
|
+
omit it for precise cuts. Profiles use `nativeHttp`, `httpConnections`,
|
|
123
|
+
`stagingDir` and `fastCut`; CLI flags override profile defaults.
|
|
124
|
+
|
|
125
|
+
- `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.
|
|
126
|
+
- 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.
|
|
127
|
+
|
|
128
|
+
- 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.
|
|
129
|
+
- Example profile: `"experimental": { "concurrentFragments": 32, "experimentalFragments": true }`. Run with `veo <URL> --profile experimental`; use `--no-experimental-fragments` to revoke a stored opt-in.
|
|
130
|
+
|
|
131
|
+
- Run `veo doctor --offline` to check the local setup without network repair. `veo doctor fix` may install missing tools.
|
|
132
|
+
- Desktop media downloads use fixed release URLs and shipped SHA-256 hashes; both FFmpeg and FFprobe are verified before execution and on cache reuse. A rejected legacy cache requires `veo doctor fix`. Trusted PATH tools and `VEO_FFMPEG_PATH` remain explicit alternatives. The npm package runs no install scripts; it includes the native veo binaries and selects your platform automatically.
|
|
133
|
+
- Use `--resume` for interrupted downloads and `--skip-existing` when repeated saves should be avoided.
|
|
134
|
+
- `veo flush` removes temporary downloads and retry jobs; do not run it as routine maintenance in an agent workflow.
|
|
135
|
+
- Do not call bare `veo` in an interactive terminal from automation: it opens a wizard. Use explicit URLs and flags.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,57 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "veodl",
|
|
3
|
-
"version": "
|
|
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
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
],
|
|
19
|
-
"engines": {
|
|
20
|
-
"node": ">=
|
|
21
|
-
},
|
|
22
|
-
"scripts": {
|
|
23
|
-
"test": "
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"devDependencies": {
|
|
55
|
-
"@xterm/headless": "6.0.0"
|
|
56
|
-
}
|
|
57
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "veodl",
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "A clean, simple video downloader powered by yt-dlp. Native binary; no Node.js needed at runtime.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"veo": "bin/veo.js",
|
|
8
|
+
"veodl": "bin/veo.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin/",
|
|
12
|
+
"docs/",
|
|
13
|
+
"AGENTS.md",
|
|
14
|
+
"README.md",
|
|
15
|
+
"CHANGELOG.md",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"native/"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=16"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "cargo test",
|
|
24
|
+
"build": "cargo build --release",
|
|
25
|
+
"check:package": "node scripts/check-package.js",
|
|
26
|
+
"packages": "node scripts/npm-packages.mjs",
|
|
27
|
+
"release": "node scripts/release.mjs"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"cli",
|
|
31
|
+
"video",
|
|
32
|
+
"downloader",
|
|
33
|
+
"yt-dlp",
|
|
34
|
+
"audio",
|
|
35
|
+
"youtube",
|
|
36
|
+
"playlist",
|
|
37
|
+
"subtitles"
|
|
38
|
+
],
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"author": "Mailo037",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/Mailo037/veodl.git"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/Mailo037/veodl/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/Mailo037/veodl#readme",
|
|
49
|
+
"preferGlobal": true,
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|