evo-cli 0.20.0__tar.gz → 0.20.2__tar.gz
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.
- {evo_cli-0.20.0 → evo_cli-0.20.2}/PKG-INFO +1 -1
- evo_cli-0.20.2/evo_cli/VERSION +1 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/download.py +9 -2
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/PKG-INFO +1 -1
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_download.py +20 -0
- evo_cli-0.20.0/evo_cli/VERSION +0 -1
- {evo_cli-0.20.0 → evo_cli-0.20.2}/Containerfile +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/HISTORY.md +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/LICENSE +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/MANIFEST.in +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/README.md +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/__main__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/base.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/cli.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/agent_toy.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/claude_code.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/cloudflare.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/cred.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/fix_claude.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/gdrive.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/gh.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_dag.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_git.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_model.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_mutate.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_paths.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_render.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_server.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/check.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/clone.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/edit.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/pull.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/serve.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/show.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/views.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/index-CsALFg16.css +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/index-DwEXL5pV.js +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/index.html +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/hwid.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/hwid_reset.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/localproxy.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/mcp.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/miniconda.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/netcheck.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/opencode.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/plantuml.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/serp.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/site2s.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/ssh.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/sysmon.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/tts.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/update.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/wifi.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/console.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/doctor.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/google_oauth.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/migrate.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/oauth_flow.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/registry.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/store.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/sync.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/mcp_registry.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/client.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/creds.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/errors.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/install.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/render.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/chunking.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/core.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/creds.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/errors.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/http.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/openai.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/player.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/vbee.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/SOURCES.txt +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/dependency_links.txt +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/entry_points.txt +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/requires.txt +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/top_level.txt +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/pyproject.toml +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/setup.cfg +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/__init__.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_agent_toy.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_claude_code.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_cli.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_console.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_cred.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_fix_claude.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_gh.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness_clone.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness_dag.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_mcp.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_opencode.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_plantuml.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_serp.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_sysmon.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_tts.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_update.py +0 -0
- {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_wifi.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.20.2
|
|
@@ -28,6 +28,12 @@ CONTAINERS = ["mp4", "mkv", "webm", "auto"]
|
|
|
28
28
|
BROWSERS = ["chrome", "edge", "firefox", "brave", "chromium", "opera", "vivaldi", "safari"]
|
|
29
29
|
JS_RUNTIMES = ["deno", "bun", "node"]
|
|
30
30
|
YTDLP_STALE_DAYS = 60
|
|
31
|
+
# Facebook reels and Instagram posts hand back the whole caption as the title,
|
|
32
|
+
# which walks straight past the 255-byte limit filesystems put on a single path
|
|
33
|
+
# component. `.<N>B` truncates the field to N bytes (before yt-dlp swaps `:` and
|
|
34
|
+
# friends for their fullwidth twins, so leave room for that) and the suffixes
|
|
35
|
+
# yt-dlp tacks on while downloading - `.f<format_id>`, `.mp4`, `.part`.
|
|
36
|
+
TITLE_BYTE_LIMIT = 120
|
|
31
37
|
|
|
32
38
|
DIRECT_EXTS = {
|
|
33
39
|
".7z",
|
|
@@ -256,12 +262,13 @@ def format_selector(quality, container, has_ffmpeg):
|
|
|
256
262
|
|
|
257
263
|
|
|
258
264
|
def output_template(outdir, playlist, name):
|
|
265
|
+
title = f"%(title).{TITLE_BYTE_LIMIT}B"
|
|
259
266
|
if name:
|
|
260
267
|
template = name
|
|
261
268
|
elif playlist:
|
|
262
|
-
template = "%(playlist_title)
|
|
269
|
+
template = f"%(playlist_title).{TITLE_BYTE_LIMIT}B/%(playlist_index)03d - {title}.%(ext)s"
|
|
263
270
|
else:
|
|
264
|
-
template = "
|
|
271
|
+
template = f"{title}.%(ext)s"
|
|
265
272
|
return str(Path(outdir) / template)
|
|
266
273
|
|
|
267
274
|
|
|
@@ -92,6 +92,26 @@ def test_output_template_respects_name(tmp_path):
|
|
|
92
92
|
assert dl.output_template(tmp_path, False, "%(id)s.%(ext)s").endswith("%(id)s.%(ext)s")
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
@pytest.mark.parametrize("playlist", [False, True])
|
|
96
|
+
def test_output_template_caps_the_title(tmp_path, playlist):
|
|
97
|
+
# A Facebook reel titles itself with its whole caption; uncapped, the file
|
|
98
|
+
# name overruns the 255-byte limit and yt-dlp dies with "File name too long".
|
|
99
|
+
template = dl.output_template(tmp_path, playlist, name=None)
|
|
100
|
+
assert f"%(title).{dl.TITLE_BYTE_LIMIT}B" in template
|
|
101
|
+
assert "%(title)s" not in template
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_output_template_caps_the_playlist_folder(tmp_path):
|
|
105
|
+
template = dl.output_template(tmp_path, playlist=True, name=None)
|
|
106
|
+
assert f"%(playlist_title).{dl.TITLE_BYTE_LIMIT}B" in template
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_title_cap_leaves_room_for_the_suffixes_ytdlp_appends():
|
|
110
|
+
# yt-dlp downloads to `<name>.f<format_id>.<ext>.part` and the sanitizer
|
|
111
|
+
# swaps `:` `|` `?` for 3-byte fullwidth twins before any of that.
|
|
112
|
+
assert dl.TITLE_BYTE_LIMIT + len(".f1049104804294604v.mp4.part") < 255
|
|
113
|
+
|
|
114
|
+
|
|
95
115
|
def test_build_args_default(opts):
|
|
96
116
|
args = dl.build_ytdlp_args(opts, has_ffmpeg=True)
|
|
97
117
|
assert "--no-playlist" in args
|
evo_cli-0.20.0/evo_cli/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.20.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|