adanvil 0.2.0__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 (205) hide show
  1. adanvil-0.2.0/.gitattributes +5 -0
  2. adanvil-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +34 -0
  3. adanvil-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. adanvil-0.2.0/.github/pull_request_template.md +11 -0
  5. adanvil-0.2.0/.github/workflows/ci.yml +25 -0
  6. adanvil-0.2.0/.github/workflows/publish.yml +24 -0
  7. adanvil-0.2.0/.gitignore +39 -0
  8. adanvil-0.2.0/AGENTS.md +382 -0
  9. adanvil-0.2.0/CHANGELOG.md +168 -0
  10. adanvil-0.2.0/CONTRIBUTING.md +71 -0
  11. adanvil-0.2.0/LICENSE +21 -0
  12. adanvil-0.2.0/PKG-INFO +275 -0
  13. adanvil-0.2.0/README.md +249 -0
  14. adanvil-0.2.0/THIRD_PARTY.md +147 -0
  15. adanvil-0.2.0/docs/ARCHITECTURE.md +115 -0
  16. adanvil-0.2.0/docs/EDITING_GUIDE.md +292 -0
  17. adanvil-0.2.0/docs/demo.gif +0 -0
  18. adanvil-0.2.0/examples/demo/README.md +36 -0
  19. adanvil-0.2.0/examples/demo/fetch_demo.py +336 -0
  20. adanvil-0.2.0/examples/demo/pack.json +54 -0
  21. adanvil-0.2.0/examples/sfx/README.md +52 -0
  22. adanvil-0.2.0/pyproject.toml +56 -0
  23. adanvil-0.2.0/scripts/bench.py +147 -0
  24. adanvil-0.2.0/skill/SKILL.md +336 -0
  25. adanvil-0.2.0/src/adanvil/__init__.py +1 -0
  26. adanvil-0.2.0/src/adanvil/_bin.py +39 -0
  27. adanvil-0.2.0/src/adanvil/_proc.py +20 -0
  28. adanvil-0.2.0/src/adanvil/assets/EDITING_GUIDE.md +292 -0
  29. adanvil-0.2.0/src/adanvil/assets/fonts/Montserrat-VF.ttf +0 -0
  30. adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Montserrat.txt +93 -0
  31. adanvil-0.2.0/src/adanvil/assets/fonts/OFL-PlusJakartaSans.txt +93 -0
  32. adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Poppins.txt +93 -0
  33. adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Roboto.txt +93 -0
  34. adanvil-0.2.0/src/adanvil/assets/fonts/OFL-TikTokSans.txt +93 -0
  35. adanvil-0.2.0/src/adanvil/assets/fonts/PlusJakartaSans-VF.ttf +0 -0
  36. adanvil-0.2.0/src/adanvil/assets/fonts/Poppins-Bold.ttf +0 -0
  37. adanvil-0.2.0/src/adanvil/assets/fonts/Poppins-SemiBold.ttf +0 -0
  38. adanvil-0.2.0/src/adanvil/assets/fonts/Roboto-VF.ttf +0 -0
  39. adanvil-0.2.0/src/adanvil/assets/fonts/TikTokSans-VF.ttf +0 -0
  40. adanvil-0.2.0/src/adanvil/assets/sfx_pack.json +166 -0
  41. adanvil-0.2.0/src/adanvil/audio.py +1096 -0
  42. adanvil-0.2.0/src/adanvil/batch.py +512 -0
  43. adanvil-0.2.0/src/adanvil/brand.py +292 -0
  44. adanvil-0.2.0/src/adanvil/busy.py +175 -0
  45. adanvil-0.2.0/src/adanvil/captionfaces.py +334 -0
  46. adanvil-0.2.0/src/adanvil/cli.py +540 -0
  47. adanvil-0.2.0/src/adanvil/config.py +97 -0
  48. adanvil-0.2.0/src/adanvil/endcard.py +779 -0
  49. adanvil-0.2.0/src/adanvil/ffmpeg.py +481 -0
  50. adanvil-0.2.0/src/adanvil/formats.py +1104 -0
  51. adanvil-0.2.0/src/adanvil/jobs.py +687 -0
  52. adanvil-0.2.0/src/adanvil/library/__init__.py +53 -0
  53. adanvil-0.2.0/src/adanvil/library/annotate.py +189 -0
  54. adanvil-0.2.0/src/adanvil/library/catalog.py +395 -0
  55. adanvil-0.2.0/src/adanvil/library/index.py +879 -0
  56. adanvil-0.2.0/src/adanvil/library/onepass.py +113 -0
  57. adanvil-0.2.0/src/adanvil/library/overview.py +184 -0
  58. adanvil-0.2.0/src/adanvil/library/separate_audio.py +128 -0
  59. adanvil-0.2.0/src/adanvil/library/vision_index.py +336 -0
  60. adanvil-0.2.0/src/adanvil/library/vision_search.py +225 -0
  61. adanvil-0.2.0/src/adanvil/media/__init__.py +67 -0
  62. adanvil-0.2.0/src/adanvil/media/cache.py +80 -0
  63. adanvil-0.2.0/src/adanvil/media/facefocus.py +155 -0
  64. adanvil-0.2.0/src/adanvil/media/filters.py +189 -0
  65. adanvil-0.2.0/src/adanvil/media/reveal.py +709 -0
  66. adanvil-0.2.0/src/adanvil/media/segment.py +744 -0
  67. adanvil-0.2.0/src/adanvil/media/sheet.py +423 -0
  68. adanvil-0.2.0/src/adanvil/media/split.py +388 -0
  69. adanvil-0.2.0/src/adanvil/music.py +834 -0
  70. adanvil-0.2.0/src/adanvil/musicgen.py +300 -0
  71. adanvil-0.2.0/src/adanvil/musicgen_worker.py +89 -0
  72. adanvil-0.2.0/src/adanvil/onboard/__init__.py +18 -0
  73. adanvil-0.2.0/src/adanvil/onboard/build.py +461 -0
  74. adanvil-0.2.0/src/adanvil/onboard/questionnaire.py +356 -0
  75. adanvil-0.2.0/src/adanvil/onboard/site.py +959 -0
  76. adanvil-0.2.0/src/adanvil/project.py +192 -0
  77. adanvil-0.2.0/src/adanvil/qc/__init__.py +16 -0
  78. adanvil-0.2.0/src/adanvil/qc/pair.py +435 -0
  79. adanvil-0.2.0/src/adanvil/qc/report.py +888 -0
  80. adanvil-0.2.0/src/adanvil/qc/score.py +1341 -0
  81. adanvil-0.2.0/src/adanvil/reference/__init__.py +13 -0
  82. adanvil-0.2.0/src/adanvil/reference/breakdown.py +263 -0
  83. adanvil-0.2.0/src/adanvil/reference/decode.py +517 -0
  84. adanvil-0.2.0/src/adanvil/render/__init__.py +5 -0
  85. adanvil-0.2.0/src/adanvil/render/animated.py +158 -0
  86. adanvil-0.2.0/src/adanvil/render/cards.py +312 -0
  87. adanvil-0.2.0/src/adanvil/render/compose.py +1128 -0
  88. adanvil-0.2.0/src/adanvil/render/inset.py +250 -0
  89. adanvil-0.2.0/src/adanvil/render/stickers.py +535 -0
  90. adanvil-0.2.0/src/adanvil/safezones.py +225 -0
  91. adanvil-0.2.0/src/adanvil/server.py +2888 -0
  92. adanvil-0.2.0/src/adanvil/sfx.py +651 -0
  93. adanvil-0.2.0/src/adanvil/speech/__init__.py +9 -0
  94. adanvil-0.2.0/src/adanvil/speech/analyze.py +465 -0
  95. adanvil-0.2.0/src/adanvil/speech/captions.py +253 -0
  96. adanvil-0.2.0/src/adanvil/speech/corrections.py +136 -0
  97. adanvil-0.2.0/src/adanvil/speech/library.py +67 -0
  98. adanvil-0.2.0/src/adanvil/speech/model.py +44 -0
  99. adanvil-0.2.0/src/adanvil/speech/store.py +107 -0
  100. adanvil-0.2.0/src/adanvil/speech/takes.py +257 -0
  101. adanvil-0.2.0/src/adanvil/speech/transcribe.py +433 -0
  102. adanvil-0.2.0/src/adanvil/storyboard/__init__.py +98 -0
  103. adanvil-0.2.0/src/adanvil/storyboard/craft.py +776 -0
  104. adanvil-0.2.0/src/adanvil/storyboard/devices.py +560 -0
  105. adanvil-0.2.0/src/adanvil/storyboard/patch.py +151 -0
  106. adanvil-0.2.0/src/adanvil/storyboard/recipes/before_after.yaml +101 -0
  107. adanvil-0.2.0/src/adanvil/storyboard/recipes/comment_reply.yaml +138 -0
  108. adanvil-0.2.0/src/adanvil/storyboard/recipes/customer_diary.yaml +109 -0
  109. adanvil-0.2.0/src/adanvil/storyboard/recipes/hook_plus_product.yaml +81 -0
  110. adanvil-0.2.0/src/adanvil/storyboard/recipes/meme_text.yaml +100 -0
  111. adanvil-0.2.0/src/adanvil/storyboard/recipes/remake_long.yaml +134 -0
  112. adanvil-0.2.0/src/adanvil/storyboard/recipes/text_hook.yaml +98 -0
  113. adanvil-0.2.0/src/adanvil/storyboard/recipes/ugc_talking.yaml +129 -0
  114. adanvil-0.2.0/src/adanvil/storyboard/recipes/voiceover_ad.yaml +150 -0
  115. adanvil-0.2.0/src/adanvil/storyboard/recipes.py +168 -0
  116. adanvil-0.2.0/src/adanvil/storyboard/schema.py +1293 -0
  117. adanvil-0.2.0/src/adanvil/storyboard/sfx.py +96 -0
  118. adanvil-0.2.0/src/adanvil/storyboard/snap.py +247 -0
  119. adanvil-0.2.0/src/adanvil/storyboard/validate.py +2059 -0
  120. adanvil-0.2.0/src/adanvil/text/__init__.py +29 -0
  121. adanvil-0.2.0/src/adanvil/text/animate.py +203 -0
  122. adanvil-0.2.0/src/adanvil/text/chunking.py +228 -0
  123. adanvil-0.2.0/src/adanvil/text/emoji.py +194 -0
  124. adanvil-0.2.0/src/adanvil/text/fonts.py +92 -0
  125. adanvil-0.2.0/src/adanvil/text/gallery.py +142 -0
  126. adanvil-0.2.0/src/adanvil/text/layout.py +105 -0
  127. adanvil-0.2.0/src/adanvil/text/styles.py +1207 -0
  128. adanvil-0.2.0/src/adanvil/textremoval/__init__.py +19 -0
  129. adanvil-0.2.0/src/adanvil/textremoval/core.py +456 -0
  130. adanvil-0.2.0/src/adanvil/variants.py +662 -0
  131. adanvil-0.2.0/src/adanvil/vision/__init__.py +30 -0
  132. adanvil-0.2.0/src/adanvil/vision/analyse.py +97 -0
  133. adanvil-0.2.0/src/adanvil/vision/client.py +349 -0
  134. adanvil-0.2.0/src/adanvil/vision/engine.py +208 -0
  135. adanvil-0.2.0/src/adanvil/vision/framing.py +250 -0
  136. adanvil-0.2.0/src/adanvil/vision/labels.py +112 -0
  137. adanvil-0.2.0/src/adanvil/vision/setup.py +111 -0
  138. adanvil-0.2.0/src/adanvil/vision/store.py +145 -0
  139. adanvil-0.2.0/src/adanvil/vision/versions.py +146 -0
  140. adanvil-0.2.0/src/adanvil/vision/worker.py +342 -0
  141. adanvil-0.2.0/src/adanvil/vocab.py +108 -0
  142. adanvil-0.2.0/src/adanvil/voice/__init__.py +34 -0
  143. adanvil-0.2.0/src/adanvil/voice/engines.py +830 -0
  144. adanvil-0.2.0/src/adanvil/voice/generate.py +779 -0
  145. adanvil-0.2.0/src/adanvil/voice/setup.py +106 -0
  146. adanvil-0.2.0/src/adanvil/voice/worker.py +304 -0
  147. adanvil-0.2.0/tests/__init__.py +0 -0
  148. adanvil-0.2.0/tests/conftest.py +59 -0
  149. adanvil-0.2.0/tests/fixtures/__init__.py +0 -0
  150. adanvil-0.2.0/tests/fixtures/make.py +477 -0
  151. adanvil-0.2.0/tests/fixtures/site/plain/index.html +8 -0
  152. adanvil-0.2.0/tests/fixtures/site/plain/products/x.html +9 -0
  153. adanvil-0.2.0/tests/fixtures/site/shopify/index.html +32 -0
  154. adanvil-0.2.0/tests/fixtures/site/shopify/products.json +25 -0
  155. adanvil-0.2.0/tests/fixtures/site/shopify/styles.css +2 -0
  156. adanvil-0.2.0/tests/fixtures/site/shopify-regressions/index.html +43 -0
  157. adanvil-0.2.0/tests/fixtures/site/shopify-regressions/products.json +11 -0
  158. adanvil-0.2.0/tests/fixtures/site/shopify-regressions/styles.css +2 -0
  159. adanvil-0.2.0/tests/speech_helpers.py +130 -0
  160. adanvil-0.2.0/tests/test_animated_captions.py +877 -0
  161. adanvil-0.2.0/tests/test_audio.py +190 -0
  162. adanvil-0.2.0/tests/test_cli.py +190 -0
  163. adanvil-0.2.0/tests/test_compose.py +208 -0
  164. adanvil-0.2.0/tests/test_demo_pack.py +108 -0
  165. adanvil-0.2.0/tests/test_endcard.py +225 -0
  166. adanvil-0.2.0/tests/test_ffmpeg.py +118 -0
  167. adanvil-0.2.0/tests/test_fixtures.py +230 -0
  168. adanvil-0.2.0/tests/test_jobs.py +131 -0
  169. adanvil-0.2.0/tests/test_library.py +248 -0
  170. adanvil-0.2.0/tests/test_media.py +222 -0
  171. adanvil-0.2.0/tests/test_onboard.py +266 -0
  172. adanvil-0.2.0/tests/test_package.py +21 -0
  173. adanvil-0.2.0/tests/test_paths.py +110 -0
  174. adanvil-0.2.0/tests/test_qc.py +248 -0
  175. adanvil-0.2.0/tests/test_r11_shot_choice.py +331 -0
  176. adanvil-0.2.0/tests/test_r7_usability.py +562 -0
  177. adanvil-0.2.0/tests/test_r9_catalog_paths_voice.py +342 -0
  178. adanvil-0.2.0/tests/test_reference.py +406 -0
  179. adanvil-0.2.0/tests/test_reference_checks.py +358 -0
  180. adanvil-0.2.0/tests/test_server.py +310 -0
  181. adanvil-0.2.0/tests/test_sound_design.py +1001 -0
  182. adanvil-0.2.0/tests/test_speech.py +811 -0
  183. adanvil-0.2.0/tests/test_speech_edit.py +785 -0
  184. adanvil-0.2.0/tests/test_speed.py +136 -0
  185. adanvil-0.2.0/tests/test_still_smoothness.py +267 -0
  186. adanvil-0.2.0/tests/test_storyboard_rules.py +287 -0
  187. adanvil-0.2.0/tests/test_text.py +379 -0
  188. adanvil-0.2.0/tests/test_textremoval.py +194 -0
  189. adanvil-0.2.0/tests/test_ugc_iteration.py +1236 -0
  190. adanvil-0.2.0/tests/test_v24b_fixes.py +484 -0
  191. adanvil-0.2.0/tests/test_v24c_reveal.py +881 -0
  192. adanvil-0.2.0/tests/test_v25_ad_score.py +890 -0
  193. adanvil-0.2.0/tests/test_v27_vision.py +782 -0
  194. adanvil-0.2.0/tests/test_v28_variants_formats.py +732 -0
  195. adanvil-0.2.0/tests/test_v28b_format_text.py +169 -0
  196. adanvil-0.2.0/tests/test_v28c_variants_usability.py +537 -0
  197. adanvil-0.2.0/tests/test_v28d_placement_faces.py +227 -0
  198. adanvil-0.2.0/tests/test_v28e_layout_selfcheck.py +320 -0
  199. adanvil-0.2.0/tests/test_v29_music.py +570 -0
  200. adanvil-0.2.0/tests/test_v29b_music_fixes.py +357 -0
  201. adanvil-0.2.0/tests/test_visual_grammar.py +770 -0
  202. adanvil-0.2.0/tests/test_voice.py +320 -0
  203. adanvil-0.2.0/tests/test_voice_speed.py +534 -0
  204. adanvil-0.2.0/tests/test_voice_storyboard.py +238 -0
  205. adanvil-0.2.0/uv.lock +1454 -0
@@ -0,0 +1,5 @@
1
+ * text=auto eol=lf
2
+ *.png binary
3
+ *.jpg binary
4
+ *.mp4 binary
5
+ *.ttf binary
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something fails or renders wrongly
4
+ labels: bug
5
+ ---
6
+
7
+ **What happened**
8
+
9
+ **What you expected**
10
+
11
+ **Environment**
12
+
13
+ - OS:
14
+ - AdAnvil version (`adanvil --version`):
15
+ - ffmpeg version (first line of `ffmpeg -version`):
16
+ - MCP client and model (for example Claude Code with Opus, Codex, Cursor):
17
+
18
+ **Storyboard excerpt**
19
+
20
+ ```json
21
+
22
+ ```
23
+
24
+ **`job_status` error**
25
+
26
+ Paste the `error` field (and the tool name you called) from `job_status`, or the CLI message.
27
+
28
+ ```text
29
+
30
+ ```
31
+
32
+ **Anything else**
33
+
34
+ Screenshots or contact sheets help. Do not attach footage you do not have the right to share.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an improvement
4
+ labels: enhancement
5
+ ---
6
+
7
+ **The problem**
8
+
9
+ What are you trying to do, and what gets in the way?
10
+
11
+ **What you would like**
12
+
13
+ **Alternatives you tried**
14
+
15
+ **Context**
16
+
17
+ Ad type or recipe, MCP client, and anything else that helps.
@@ -0,0 +1,11 @@
1
+ ## What and why
2
+
3
+ ## Checklist
4
+
5
+ - [ ] `uv run ruff check .` is clean
6
+ - [ ] `uv run pytest` passes (or the relevant files, noted here)
7
+ - [ ] New behaviour has a test, brand-neutral (fictional brand, neutral prices)
8
+ - [ ] `docs/EDITING_GUIDE.md` and `src/adanvil/assets/EDITING_GUIDE.md` are identical
9
+ - [ ] `AGENTS.md` and `skill/SKILL.md` are in sync
10
+ - [ ] README and `CHANGELOG.md` updated if behaviour, tools or settings changed
11
+ - [ ] No media, secrets or unlicensed third-party material added
@@ -0,0 +1,25 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - name: Install ffmpeg
13
+ run: sudo apt-get update && sudo apt-get install -y ffmpeg
14
+ - name: Set up uv
15
+ uses: astral-sh/setup-uv@v6
16
+ with:
17
+ python-version: "3.12"
18
+ - name: Show ffmpeg version
19
+ run: ffmpeg -version | head -1
20
+ - name: Install dependencies
21
+ run: uv sync
22
+ - name: Lint
23
+ run: uv run ruff check .
24
+ - name: Test
25
+ run: uv run pytest -q
@@ -0,0 +1,24 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ inputs:
7
+ index:
8
+ description: "testpypi or pypi"
9
+ default: "testpypi"
10
+ jobs:
11
+ publish:
12
+ if: github.repository == 'maxbuildog/adanvil'
13
+ runs-on: ubuntu-latest
14
+ environment: pypi
15
+ permissions:
16
+ id-token: write
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: astral-sh/setup-uv@v6
20
+ - run: uv build
21
+ - if: github.event_name == 'workflow_dispatch' && inputs.index == 'testpypi'
22
+ run: uv publish --trusted-publishing always --publish-url https://test.pypi.org/legacy/
23
+ - if: github.event_name == 'release' || inputs.index == 'pypi'
24
+ run: uv publish --trusted-publishing always
@@ -0,0 +1,39 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ tests/fixtures/out/
10
+ .adanvil-cache/
11
+ .pytest_tmp/
12
+ .pytest_tmp_codex/
13
+
14
+ # Local scratch folders (test base temps, manual runs, agent sandboxes)
15
+ /pytest_tmp*/
16
+ /pytest_current_run/
17
+ /pytest-cache-files-*/
18
+ /_pytest*/
19
+ /_test*/
20
+ /adanvil-*/
21
+ /_codex*/
22
+ /_manual*/
23
+ /_paths*/
24
+ /.pytest*/
25
+ /.pytesttmp*/
26
+ /.pytest-*/
27
+ /.codex*/
28
+ /.manual*/
29
+ /.jobtest*/
30
+ /.uv-cache*/
31
+ /.qc-basetemp/
32
+ /.run-visible/
33
+ /.tmp-*/
34
+ /.new-basetemp/
35
+ /.onboard_pytest_base/
36
+ /.compose_runtime/
37
+ /.adanvil-text-assets/
38
+ /cache/
39
+ /voice/