veodl 1.8.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 ADDED
@@ -0,0 +1,11 @@
1
+ # Working with veo
2
+
3
+ Read [the agent guide](docs/AGENT_GUIDE.md) before automating downloads or media checks.
4
+
5
+ - Use `veo <url> --dry-run --json` to inspect the intended output, then `veo <url> --json` to download authorized content.
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
+ - 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
+ - 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
+ - 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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,264 @@
1
+ # Changelog
2
+
3
+ All notable changes to veo. This project follows [Semantic Versioning](https://semver.org/).
4
+
5
+ ## 1.8.1
6
+
7
+ ### Changed
8
+
9
+ - Renamed package to `veodl` on npm.
10
+ - Provided `veo`, `veod`, and `veodl` as parallel terminal commands (all execute the same CLI).
11
+
12
+ ## 1.8.0
13
+
14
+ ### Added
15
+
16
+ - **`veo inspect <file>` and `veo inspect run <id>`**: Inspect local container and stream metadata with `--json`. Add `--check-audio` to decode audio tracks and verify signals above -60 dBFS. `veo inspect run <id>` locates saved run files by file identity, size, and sampled SHA-256 fingerprint, even after renames or moves (`--search <directory>`).
17
+ - **`veo retry --last`**: Automatically retry the most recent failed or unfinished job without manually locating its job file.
18
+ - **`veo history` improvements**: Added `--limit <1-1000>` to customize history entries and `--failed` to view only failed or cancelled attempts with their retry command and persistent `runId`.
19
+ - **Config editor clipboard & mouse scrolling**: Added native system clipboard copy/paste (Ctrl+C / Ctrl+V) across Windows, macOS, Linux (Wayland/X11), and Termux, as well as mouse wheel and Ctrl+Up/Down scrolling.
20
+ - **Termux desktop opener**: Supported `--open` in Android/Termux using `termux-open`.
21
+ - **Agent guidelines**: Included AGENTS.md and docs/AGENT_GUIDE.md in the distributed package.
22
+
23
+ ## 1.7.2
24
+
25
+ ### Fixed
26
+
27
+ - Stale download-history records referencing deleted files are automatically pruned on subsequent downloads, and empty `.veo-history` directories are removed.
28
+ - `veo doctor` inspects `.veo-history` records, reports stale duplicate-detection records as warnings, and flags damaged history directories.
29
+
30
+ ## 1.7.1
31
+
32
+ ### Fixed
33
+
34
+ - Progress adapts to narrow terminals, updates one line for parallel downloads, and marks estimated sizes instead of showing premature completion.
35
+ - Download errors retain specific HTTP/network codes instead of replacing them with a generic network warning.
36
+ - Files announced by a failed yt-dlp process are retained as unconfirmed, not treated as completed transfers; retry requires a successful backend exit.
37
+
38
+ ## 1.7.0
39
+
40
+ ### Added
41
+
42
+ - Android/Termux automatically uses system yt-dlp and FFmpeg, with platform-specific doctor and backend-update instructions.
43
+ - First downloads and `veo doctor fix` automatically install missing Termux tools (including JavaScript support) or acquire missing desktop media binaries in veo's cache; offline mode never installs packages.
44
+
45
+ ### Changed
46
+
47
+ - Static desktop media tools are optional dependencies so unsupported binaries do not prevent npm installation.
48
+
49
+ ## 1.6.1
50
+
51
+ ### Added
52
+
53
+ - `veo config reset` restores the current template after confirmation and saves an exact backup of the previous configuration, including malformed files.
54
+
55
+ ## 1.6.0
56
+
57
+ ### Added
58
+
59
+ - Parallel URL and batch downloads with serialized jobs, per-item statistics, and adaptive retries with reduced concurrency.
60
+ - Parallel playlist downloads (two playlist entries concurrently by default, `--playlist-concurrency 1-4`), with per-entry progress, serialized job updates, and cancellation that waits for active workers.
61
+ - Concurrent DASH/HLS fragment downloads (up to eight DASH/HLS fragments concurrently by default; `-N` overrides this).
62
+ - Safe filename and folder templates, free-space estimates, and phase timings.
63
+ - Offline config commands: `veo config check` and `veo config show`, and full option documentation in the config editor.
64
+ - Prefer H.264/AAC for explicit MP4 downloads, report incompatible original codecs, and add opt-in `--compatible` / `kompatibel` profile with conditional H.264/AAC conversion.
65
+ - `--recode` flag for explicitly converting video formats when remuxing is incompatible.
66
+
67
+ ### Changed
68
+
69
+ - Video `--format` now remuxes without quality loss; incompatible codecs fail instead of being converted silently.
70
+ - Apply consistent terminal styling to all veo command reports and help, including stats; dim terminal status details and highlight titles, successful saves and failures; preserve plain JSON/piped output and honor `--no-color`, `NO_COLOR` and config color preferences.
71
+
72
+ ### Fixed
73
+
74
+ - Fix Node.js DEP0190 warnings during Windows self-updates by invoking cmd.exe explicitly with a fixed npm command.
75
+
76
+ ## 1.5.0
77
+
78
+ ### Added
79
+
80
+ - **`veo runs` and `veo stop`**: every run registers itself with a **6-character id** while
81
+ it works, so another terminal can watch and end it. `veo runs` lists active runs with PID,
82
+ state, start time, progress and output directory, `veo runs <id>` shows one run in detail
83
+ (URLs, media settings, job file and per-item state), `veo stop <id>` stops that run and
84
+ `veo stop` stops every run. A stop request is polled by the run itself, so no signals or
85
+ PIDs are needed; the stopped run exits like Ctrl+C and keeps its partial data and retry
86
+ job. Records of crashed runs are marked `stale` and removed by `veo stop`. Run records
87
+ never contain credentials or cookie settings, and an unknown or damaged record file is
88
+ ignored instead of breaking later runs.
89
+ - **`veo history`**: shows the last 5 download attempts, newest first, with title, status,
90
+ media type, date, duration, URL and the saved files. Saved, skipped, failed and cancelled
91
+ items are recorded, including the reported failure reason; playlist entries and retries
92
+ count individually. `veo history --json` prints `{"count":N,"entries":[…]}` with the
93
+ complete file list for scripting. Records live as one small file per attempt in the
94
+ per-user veo cache's `history` directory and are kept by `veo flush`.
95
+
96
+ ### Changed
97
+
98
+ - The run registry moved out of `veo flush` into `src/runs.js`; `veo flush` and `veo stop`
99
+ now stop the same registered runs, and `veo flush` keeps working with run records written
100
+ by older versions.
101
+
102
+ ## 1.4.0
103
+
104
+ ### Added
105
+
106
+ - **Local download cache**: downloads and media processing now finish in the per-user veo
107
+ cache before the destination is written, so the output location is only touched once the
108
+ media is ready. Saving uses a hard link where supported and an exclusive copy across
109
+ drives or cloud mounts, with copied sizes verified. Existing files are still never
110
+ overwritten. The local original is removed only after files and history are saved.
111
+ - **Recoverable transfers**: if saving fails or is cancelled after processing completed, the
112
+ finished local original and its sidecars are kept for **15 minutes** — with or without
113
+ `--resume`. Repeat the same command, or use the printed `--retry-failed` command, to retry
114
+ the transfer without contacting the source again. The same source, media settings and
115
+ destination identify a cached transfer; a repeated failure starts a fresh retention
116
+ period. Expired copies are removed on the next veo invocation, never by a background
117
+ timer, and active transfers are never expired.
118
+ - **`veo stats`**: persistent counters for saved videos and audio, failed attempts, skips,
119
+ cancellations and total elapsed download-request time. `veo stats --json` prints the
120
+ totals as JSON. Playlist entries count individually and retries are new attempts.
121
+ Statistics hold counters and timestamps, not URLs or filenames.
122
+ - **`veo flush [--stats]`**: stops active veo runs started with this version, then removes
123
+ temporary local downloads — including the 15-minute retained copies and unfinished resume
124
+ data — plus cached retry job files. Saved media, output history, config/profiles and
125
+ backend binaries are kept, and `--stats` additionally resets the statistics.
126
+ - **`veo doctor fix`**: restores missing or damaged managed tools and then checks again,
127
+ staging bundled FFmpeg/FFprobe and downloading hash-verified yt-dlp when needed. With
128
+ `--offline` only local binaries are used, and `-o PATH` creates and checks an output
129
+ directory.
130
+ - **Title placeholders** in `--rename` and the config/profile `rename` key: `-r "movie_*"`
131
+ inserts the original title (`movie_My Film.mp4`), and every `*` is substituted. Placeholders
132
+ make `--rename` usable with several URLs and playlists, where a plain name is still refused.
133
+ - **`profiles.default`** is applied automatically when no profile is selected; other named
134
+ profiles keep using the global defaults instead of inheriting `default`. `veo config edit`
135
+ adds an empty `default` profile to existing configurations without changing settings, and
136
+ the wizard preselects it.
137
+ - Config syntax errors now name the line and column and explain the likely mistake, such as
138
+ Markdown code fences, a trailing comma or an unescaped Windows path, without echoing
139
+ private config values.
140
+ - The packaged-tarball check now verifies that every relative import resolves inside the
141
+ tarball and that the tarball, `package.json` and CHANGELOG versions agree, so an
142
+ incompletely bumped or incompletely packed release fails before publishing.
143
+
144
+ ### Changed
145
+
146
+ - `veo doctor` no longer warns about a missing system FFmpeg when the selected FFmpeg and
147
+ FFprobe work, and it reports retained local downloads and copied-size mismatches.
148
+ - Resume state and partial data now live in the local per-user cache under `downloads`
149
+ instead of the output directory, and the request hash also separates destinations,
150
+ playlist entries and source URLs. Legacy `.veo-part-<video id>` folders in the output
151
+ directory are left untouched and are not migrated automatically.
152
+ - Unfinished downloads are discarded on failure or cancellation unless `--resume` is given;
153
+ a completed download is the only thing retained for a transfer retry. Local disk space is
154
+ therefore needed for the complete download and its processing files.
155
+
156
+ ## 1.3.0
157
+
158
+ ### Added
159
+
160
+ - **Interactive wizard**: run `veo` without arguments in a terminal to be guided through a
161
+ download — profile, link, video or audio, available resolution, output directory, and
162
+ playlist entry selection. It enables resume and offers to skip already downloaded files.
163
+ Redirected input never starts a prompt.
164
+ - **Named profiles** in the config file (`"profiles": { "music": {...} }`) plus
165
+ `veo config edit|path|profiles`. Global defaults are merged first, then the profile
166
+ selected with `--profile`, then explicit flags.
167
+ - **Negated boolean flags** such as `--no-open`, `--no-audio` or `--no-resume` switch off a
168
+ stored default for one invocation; `--no-subs` also disables stored subtitle languages
169
+ and subtitle embedding.
170
+ - **URL list files** with `--batch-file <file>` (one URL per line, blank lines and `#`
171
+ comments ignored), combinable with URLs on the command line.
172
+ - **Durable batch jobs and `--retry-failed <file>`**: failed or cancelled runs print a
173
+ ready-to-use retry command, and retries keep the resolved output directory and settings
174
+ even from another working directory. Completed playlist jobs retry only failed indices.
175
+ - **A final summary** per run, counting saved, skipped and failed items. With `--open`,
176
+ successful files are opened even when another URL or playlist entry fails.
177
+ - **Playlist entries one at a time**: a failed entry keeps previously saved files and does
178
+ not stop the remaining entries. `--playlist-items 1,3-5` selects entries by original
179
+ one-based index, and the selection count plus available size estimates are shown first.
180
+ - **`--skip-existing`** reuses the recorded source and settings history and re-checks that
181
+ the files are still on disk. A different quality or format, or a deleted output, is
182
+ downloaded again.
183
+ - **Resume by source and settings hash**: partial data lives in
184
+ `.veo-part-<hash>`, guarded by a lock and a manifest that records backend-confirmed
185
+ completion, so an unprocessed file is never mistaken for a finished video. Each playlist
186
+ entry has its own state; completed entries are skipped on a later run and unfinished ones
187
+ are preserved independently.
188
+ - **Labelled phases** in the terminal title and progress output: current item, source title,
189
+ video/audio/media stream, conversion or merge, and saving.
190
+ - **Workflow regression tests** and real-backend smoke coverage for URL lists, profiles,
191
+ retry, duplicate detection and playlist selection.
192
+
193
+ ### Changed
194
+
195
+ - Generated configuration comments, the example profiles (`music`, `archive`),
196
+ documentation and sample filenames are English throughout. Previously generated German
197
+ template comments are translated by the next `veo config edit`, preserving existing
198
+ settings, paths and custom profile names.
199
+ - `veo config edit` fills new or empty files with a commented template and gives existing
200
+ files a one-time commented reference guide, without changing stored settings. Config
201
+ files accept `//` line and `/* ... */` block comments.
202
+ - Ambiguous "resume folders" are replaced by the source/settings hash layout; only
203
+ backend-confirmed postprocessed media is reused.
204
+ - Other positive numeric resolutions, such as `-q 540p`, are accepted instead of only the
205
+ documented list.
206
+
207
+ ## 1.2.0
208
+
209
+ Everything below ships together: `1.1.0` was prepared but never published, so this
210
+ release is the first to contain these changes.
211
+
212
+ ### Changed
213
+
214
+ - **`--quality` is now an upper bound.** `-q 720p` downloads the best resolution at or
215
+ below 720p and never fetches 2160p instead. If a source offers nothing at or below the
216
+ request, veo stops before downloading and names the resolutions that do exist. The
217
+ historical "nearest available height" rule is still available as `--closest-quality`
218
+ and may pick a resolution above the request. Sources without resolution metadata fall
219
+ back to the best available stream, as before.
220
+ - A finished download is now linked into place instead of copied. Staging lives inside
221
+ the output directory, so a hard link is enough; filesystems without hard links still
222
+ fall back to a copy. This removes a full extra read and write per download, roughly
223
+ halves the peak disk usage, and makes saving cancellable.
224
+ - Fewer duplicated downloads in `veo update`: an explicitly installed backend release
225
+ is no longer pruned.
226
+ - Metadata and media tools are prepared before any network work, so an unusable local
227
+ setup fails before a backend download starts.
228
+
229
+ ### Added
230
+
231
+ - **Multiple URLs** in one invocation: `veo <url1> <url2> ...`. Downloads run
232
+ sequentially, a failure does not stop the remaining URLs, and the exit status is `1`
233
+ if any URL failed.
234
+ - **`--playlist`** to download every entry of a playlist or channel URL. Each entry keeps
235
+ its own title, and `--no-playlist` remains the default.
236
+ - **Subtitles**: `--subs`, `--sub-langs <langs>`, `--embed-subs`.
237
+ - **Metadata**: `--embed-metadata`, `--embed-thumbnail`, `--sponsorblock-remove <categories>`,
238
+ `--section <range>`, and `-N/--concurrent-fragments <n>` for faster fragmented downloads.
239
+ - **`--resume`** keeps partial data in `.veo-part-<video id>` and continues an interrupted
240
+ download, including one that was cancelled with Ctrl+C.
241
+ - **`--cookies <file>` and `--cookies-from-browser <browser[:profile]>`** for content you
242
+ are authorized to access. Cookie files are validated before any network work and a
243
+ world-readable file produces a warning.
244
+ - **`--dry-run`** reports the title, quality and destination path without downloading.
245
+ - **`--list-formats`** prints the backend's own format table.
246
+ - **`--json`** prints one JSON object per URL for scripting.
247
+ - **`veo doctor`** checks Node.js, the output directory, the backend cache, yt-dlp,
248
+ FFmpeg/FFprobe, the config file, leftover partial downloads and network reachability.
249
+ It downloads nothing and exits `1` when a check fails.
250
+ - **`veo backend update [--check]`** installs a newer yt-dlp release without waiting for a
251
+ new veo release, verified against that release's own `SHA2-256SUMS`. `veo backend reset`
252
+ returns to the release pinned and hash-verified at build time.
253
+ - **Config file** for defaults (output directory, quality, format, subtitle preferences,
254
+ and so on). Explicit command-line flags always win.
255
+ - **Windows on ARM** is no longer rejected: when the bundled static media tools are
256
+ unavailable, veo uses a system FFmpeg installation found on `PATH`.
257
+
258
+ ### Fixed
259
+
260
+ - `--rename` is applied again; it had stopped affecting the saved filename.
261
+
262
+ ## 1.0.2
263
+
264
+ - Initial published release.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 veo contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.