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.
Files changed (119) hide show
  1. {evo_cli-0.20.0 → evo_cli-0.20.2}/PKG-INFO +1 -1
  2. evo_cli-0.20.2/evo_cli/VERSION +1 -0
  3. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/download.py +9 -2
  4. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/PKG-INFO +1 -1
  5. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_download.py +20 -0
  6. evo_cli-0.20.0/evo_cli/VERSION +0 -1
  7. {evo_cli-0.20.0 → evo_cli-0.20.2}/Containerfile +0 -0
  8. {evo_cli-0.20.0 → evo_cli-0.20.2}/HISTORY.md +0 -0
  9. {evo_cli-0.20.0 → evo_cli-0.20.2}/LICENSE +0 -0
  10. {evo_cli-0.20.0 → evo_cli-0.20.2}/MANIFEST.in +0 -0
  11. {evo_cli-0.20.0 → evo_cli-0.20.2}/README.md +0 -0
  12. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/__init__.py +0 -0
  13. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/__main__.py +0 -0
  14. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/base.py +0 -0
  15. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/cli.py +0 -0
  16. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/__init__.py +0 -0
  17. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/agent_toy.py +0 -0
  18. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/claude_code.py +0 -0
  19. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/cloudflare.py +0 -0
  20. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/cred.py +0 -0
  21. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/fix_claude.py +0 -0
  22. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/gdrive.py +0 -0
  23. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/gh.py +0 -0
  24. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/__init__.py +0 -0
  25. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_dag.py +0 -0
  26. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_git.py +0 -0
  27. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_model.py +0 -0
  28. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_mutate.py +0 -0
  29. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_paths.py +0 -0
  30. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_render.py +0 -0
  31. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/_server.py +0 -0
  32. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/check.py +0 -0
  33. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/clone.py +0 -0
  34. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/edit.py +0 -0
  35. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/pull.py +0 -0
  36. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/serve.py +0 -0
  37. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/show.py +0 -0
  38. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/views.py +0 -0
  39. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/index-CsALFg16.css +0 -0
  40. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/index-DwEXL5pV.js +0 -0
  41. {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
  42. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  43. {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
  44. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  45. {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
  46. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  47. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  48. {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
  49. {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
  50. {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
  51. {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
  52. {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
  53. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/harness/web/index.html +0 -0
  54. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/hwid.py +0 -0
  55. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/hwid_reset.py +0 -0
  56. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/localproxy.py +0 -0
  57. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/mcp.py +0 -0
  58. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/miniconda.py +0 -0
  59. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/netcheck.py +0 -0
  60. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/opencode.py +0 -0
  61. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/plantuml.py +0 -0
  62. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/serp.py +0 -0
  63. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/site2s.py +0 -0
  64. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/ssh.py +0 -0
  65. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/sysmon.py +0 -0
  66. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/tts.py +0 -0
  67. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/update.py +0 -0
  68. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/commands/wifi.py +0 -0
  69. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/console.py +0 -0
  70. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/__init__.py +0 -0
  71. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/doctor.py +0 -0
  72. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/google_oauth.py +0 -0
  73. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/migrate.py +0 -0
  74. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/oauth_flow.py +0 -0
  75. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/registry.py +0 -0
  76. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/store.py +0 -0
  77. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/credentials/sync.py +0 -0
  78. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/mcp_registry.py +0 -0
  79. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/__init__.py +0 -0
  80. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/client.py +0 -0
  81. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/creds.py +0 -0
  82. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/errors.py +0 -0
  83. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/install.py +0 -0
  84. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/serp/render.py +0 -0
  85. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/__init__.py +0 -0
  86. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/chunking.py +0 -0
  87. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/core.py +0 -0
  88. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/creds.py +0 -0
  89. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/errors.py +0 -0
  90. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/http.py +0 -0
  91. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/openai.py +0 -0
  92. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/player.py +0 -0
  93. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli/tts/vbee.py +0 -0
  94. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/SOURCES.txt +0 -0
  95. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/dependency_links.txt +0 -0
  96. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/entry_points.txt +0 -0
  97. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/requires.txt +0 -0
  98. {evo_cli-0.20.0 → evo_cli-0.20.2}/evo_cli.egg-info/top_level.txt +0 -0
  99. {evo_cli-0.20.0 → evo_cli-0.20.2}/pyproject.toml +0 -0
  100. {evo_cli-0.20.0 → evo_cli-0.20.2}/setup.cfg +0 -0
  101. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/__init__.py +0 -0
  102. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_agent_toy.py +0 -0
  103. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_claude_code.py +0 -0
  104. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_cli.py +0 -0
  105. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_console.py +0 -0
  106. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_cred.py +0 -0
  107. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_fix_claude.py +0 -0
  108. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_gh.py +0 -0
  109. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness.py +0 -0
  110. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness_clone.py +0 -0
  111. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_harness_dag.py +0 -0
  112. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_mcp.py +0 -0
  113. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_opencode.py +0 -0
  114. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_plantuml.py +0 -0
  115. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_serp.py +0 -0
  116. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_sysmon.py +0 -0
  117. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_tts.py +0 -0
  118. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_update.py +0 -0
  119. {evo_cli-0.20.0 → evo_cli-0.20.2}/tests/test_wifi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -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)s/%(playlist_index)03d - %(title)s.%(ext)s"
269
+ template = f"%(playlist_title).{TITLE_BYTE_LIMIT}B/%(playlist_index)03d - {title}.%(ext)s"
263
270
  else:
264
- template = "%(title)s.%(ext)s"
271
+ template = f"{title}.%(ext)s"
265
272
  return str(Path(outdir) / template)
266
273
 
267
274
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -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
@@ -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