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.
- adanvil-0.2.0/.gitattributes +5 -0
- adanvil-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +34 -0
- adanvil-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
- adanvil-0.2.0/.github/pull_request_template.md +11 -0
- adanvil-0.2.0/.github/workflows/ci.yml +25 -0
- adanvil-0.2.0/.github/workflows/publish.yml +24 -0
- adanvil-0.2.0/.gitignore +39 -0
- adanvil-0.2.0/AGENTS.md +382 -0
- adanvil-0.2.0/CHANGELOG.md +168 -0
- adanvil-0.2.0/CONTRIBUTING.md +71 -0
- adanvil-0.2.0/LICENSE +21 -0
- adanvil-0.2.0/PKG-INFO +275 -0
- adanvil-0.2.0/README.md +249 -0
- adanvil-0.2.0/THIRD_PARTY.md +147 -0
- adanvil-0.2.0/docs/ARCHITECTURE.md +115 -0
- adanvil-0.2.0/docs/EDITING_GUIDE.md +292 -0
- adanvil-0.2.0/docs/demo.gif +0 -0
- adanvil-0.2.0/examples/demo/README.md +36 -0
- adanvil-0.2.0/examples/demo/fetch_demo.py +336 -0
- adanvil-0.2.0/examples/demo/pack.json +54 -0
- adanvil-0.2.0/examples/sfx/README.md +52 -0
- adanvil-0.2.0/pyproject.toml +56 -0
- adanvil-0.2.0/scripts/bench.py +147 -0
- adanvil-0.2.0/skill/SKILL.md +336 -0
- adanvil-0.2.0/src/adanvil/__init__.py +1 -0
- adanvil-0.2.0/src/adanvil/_bin.py +39 -0
- adanvil-0.2.0/src/adanvil/_proc.py +20 -0
- adanvil-0.2.0/src/adanvil/assets/EDITING_GUIDE.md +292 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/Montserrat-VF.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Montserrat.txt +93 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/OFL-PlusJakartaSans.txt +93 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Poppins.txt +93 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/OFL-Roboto.txt +93 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/OFL-TikTokSans.txt +93 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/PlusJakartaSans-VF.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/Poppins-Bold.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/Poppins-SemiBold.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/Roboto-VF.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/fonts/TikTokSans-VF.ttf +0 -0
- adanvil-0.2.0/src/adanvil/assets/sfx_pack.json +166 -0
- adanvil-0.2.0/src/adanvil/audio.py +1096 -0
- adanvil-0.2.0/src/adanvil/batch.py +512 -0
- adanvil-0.2.0/src/adanvil/brand.py +292 -0
- adanvil-0.2.0/src/adanvil/busy.py +175 -0
- adanvil-0.2.0/src/adanvil/captionfaces.py +334 -0
- adanvil-0.2.0/src/adanvil/cli.py +540 -0
- adanvil-0.2.0/src/adanvil/config.py +97 -0
- adanvil-0.2.0/src/adanvil/endcard.py +779 -0
- adanvil-0.2.0/src/adanvil/ffmpeg.py +481 -0
- adanvil-0.2.0/src/adanvil/formats.py +1104 -0
- adanvil-0.2.0/src/adanvil/jobs.py +687 -0
- adanvil-0.2.0/src/adanvil/library/__init__.py +53 -0
- adanvil-0.2.0/src/adanvil/library/annotate.py +189 -0
- adanvil-0.2.0/src/adanvil/library/catalog.py +395 -0
- adanvil-0.2.0/src/adanvil/library/index.py +879 -0
- adanvil-0.2.0/src/adanvil/library/onepass.py +113 -0
- adanvil-0.2.0/src/adanvil/library/overview.py +184 -0
- adanvil-0.2.0/src/adanvil/library/separate_audio.py +128 -0
- adanvil-0.2.0/src/adanvil/library/vision_index.py +336 -0
- adanvil-0.2.0/src/adanvil/library/vision_search.py +225 -0
- adanvil-0.2.0/src/adanvil/media/__init__.py +67 -0
- adanvil-0.2.0/src/adanvil/media/cache.py +80 -0
- adanvil-0.2.0/src/adanvil/media/facefocus.py +155 -0
- adanvil-0.2.0/src/adanvil/media/filters.py +189 -0
- adanvil-0.2.0/src/adanvil/media/reveal.py +709 -0
- adanvil-0.2.0/src/adanvil/media/segment.py +744 -0
- adanvil-0.2.0/src/adanvil/media/sheet.py +423 -0
- adanvil-0.2.0/src/adanvil/media/split.py +388 -0
- adanvil-0.2.0/src/adanvil/music.py +834 -0
- adanvil-0.2.0/src/adanvil/musicgen.py +300 -0
- adanvil-0.2.0/src/adanvil/musicgen_worker.py +89 -0
- adanvil-0.2.0/src/adanvil/onboard/__init__.py +18 -0
- adanvil-0.2.0/src/adanvil/onboard/build.py +461 -0
- adanvil-0.2.0/src/adanvil/onboard/questionnaire.py +356 -0
- adanvil-0.2.0/src/adanvil/onboard/site.py +959 -0
- adanvil-0.2.0/src/adanvil/project.py +192 -0
- adanvil-0.2.0/src/adanvil/qc/__init__.py +16 -0
- adanvil-0.2.0/src/adanvil/qc/pair.py +435 -0
- adanvil-0.2.0/src/adanvil/qc/report.py +888 -0
- adanvil-0.2.0/src/adanvil/qc/score.py +1341 -0
- adanvil-0.2.0/src/adanvil/reference/__init__.py +13 -0
- adanvil-0.2.0/src/adanvil/reference/breakdown.py +263 -0
- adanvil-0.2.0/src/adanvil/reference/decode.py +517 -0
- adanvil-0.2.0/src/adanvil/render/__init__.py +5 -0
- adanvil-0.2.0/src/adanvil/render/animated.py +158 -0
- adanvil-0.2.0/src/adanvil/render/cards.py +312 -0
- adanvil-0.2.0/src/adanvil/render/compose.py +1128 -0
- adanvil-0.2.0/src/adanvil/render/inset.py +250 -0
- adanvil-0.2.0/src/adanvil/render/stickers.py +535 -0
- adanvil-0.2.0/src/adanvil/safezones.py +225 -0
- adanvil-0.2.0/src/adanvil/server.py +2888 -0
- adanvil-0.2.0/src/adanvil/sfx.py +651 -0
- adanvil-0.2.0/src/adanvil/speech/__init__.py +9 -0
- adanvil-0.2.0/src/adanvil/speech/analyze.py +465 -0
- adanvil-0.2.0/src/adanvil/speech/captions.py +253 -0
- adanvil-0.2.0/src/adanvil/speech/corrections.py +136 -0
- adanvil-0.2.0/src/adanvil/speech/library.py +67 -0
- adanvil-0.2.0/src/adanvil/speech/model.py +44 -0
- adanvil-0.2.0/src/adanvil/speech/store.py +107 -0
- adanvil-0.2.0/src/adanvil/speech/takes.py +257 -0
- adanvil-0.2.0/src/adanvil/speech/transcribe.py +433 -0
- adanvil-0.2.0/src/adanvil/storyboard/__init__.py +98 -0
- adanvil-0.2.0/src/adanvil/storyboard/craft.py +776 -0
- adanvil-0.2.0/src/adanvil/storyboard/devices.py +560 -0
- adanvil-0.2.0/src/adanvil/storyboard/patch.py +151 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/before_after.yaml +101 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/comment_reply.yaml +138 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/customer_diary.yaml +109 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/hook_plus_product.yaml +81 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/meme_text.yaml +100 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/remake_long.yaml +134 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/text_hook.yaml +98 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/ugc_talking.yaml +129 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes/voiceover_ad.yaml +150 -0
- adanvil-0.2.0/src/adanvil/storyboard/recipes.py +168 -0
- adanvil-0.2.0/src/adanvil/storyboard/schema.py +1293 -0
- adanvil-0.2.0/src/adanvil/storyboard/sfx.py +96 -0
- adanvil-0.2.0/src/adanvil/storyboard/snap.py +247 -0
- adanvil-0.2.0/src/adanvil/storyboard/validate.py +2059 -0
- adanvil-0.2.0/src/adanvil/text/__init__.py +29 -0
- adanvil-0.2.0/src/adanvil/text/animate.py +203 -0
- adanvil-0.2.0/src/adanvil/text/chunking.py +228 -0
- adanvil-0.2.0/src/adanvil/text/emoji.py +194 -0
- adanvil-0.2.0/src/adanvil/text/fonts.py +92 -0
- adanvil-0.2.0/src/adanvil/text/gallery.py +142 -0
- adanvil-0.2.0/src/adanvil/text/layout.py +105 -0
- adanvil-0.2.0/src/adanvil/text/styles.py +1207 -0
- adanvil-0.2.0/src/adanvil/textremoval/__init__.py +19 -0
- adanvil-0.2.0/src/adanvil/textremoval/core.py +456 -0
- adanvil-0.2.0/src/adanvil/variants.py +662 -0
- adanvil-0.2.0/src/adanvil/vision/__init__.py +30 -0
- adanvil-0.2.0/src/adanvil/vision/analyse.py +97 -0
- adanvil-0.2.0/src/adanvil/vision/client.py +349 -0
- adanvil-0.2.0/src/adanvil/vision/engine.py +208 -0
- adanvil-0.2.0/src/adanvil/vision/framing.py +250 -0
- adanvil-0.2.0/src/adanvil/vision/labels.py +112 -0
- adanvil-0.2.0/src/adanvil/vision/setup.py +111 -0
- adanvil-0.2.0/src/adanvil/vision/store.py +145 -0
- adanvil-0.2.0/src/adanvil/vision/versions.py +146 -0
- adanvil-0.2.0/src/adanvil/vision/worker.py +342 -0
- adanvil-0.2.0/src/adanvil/vocab.py +108 -0
- adanvil-0.2.0/src/adanvil/voice/__init__.py +34 -0
- adanvil-0.2.0/src/adanvil/voice/engines.py +830 -0
- adanvil-0.2.0/src/adanvil/voice/generate.py +779 -0
- adanvil-0.2.0/src/adanvil/voice/setup.py +106 -0
- adanvil-0.2.0/src/adanvil/voice/worker.py +304 -0
- adanvil-0.2.0/tests/__init__.py +0 -0
- adanvil-0.2.0/tests/conftest.py +59 -0
- adanvil-0.2.0/tests/fixtures/__init__.py +0 -0
- adanvil-0.2.0/tests/fixtures/make.py +477 -0
- adanvil-0.2.0/tests/fixtures/site/plain/index.html +8 -0
- adanvil-0.2.0/tests/fixtures/site/plain/products/x.html +9 -0
- adanvil-0.2.0/tests/fixtures/site/shopify/index.html +32 -0
- adanvil-0.2.0/tests/fixtures/site/shopify/products.json +25 -0
- adanvil-0.2.0/tests/fixtures/site/shopify/styles.css +2 -0
- adanvil-0.2.0/tests/fixtures/site/shopify-regressions/index.html +43 -0
- adanvil-0.2.0/tests/fixtures/site/shopify-regressions/products.json +11 -0
- adanvil-0.2.0/tests/fixtures/site/shopify-regressions/styles.css +2 -0
- adanvil-0.2.0/tests/speech_helpers.py +130 -0
- adanvil-0.2.0/tests/test_animated_captions.py +877 -0
- adanvil-0.2.0/tests/test_audio.py +190 -0
- adanvil-0.2.0/tests/test_cli.py +190 -0
- adanvil-0.2.0/tests/test_compose.py +208 -0
- adanvil-0.2.0/tests/test_demo_pack.py +108 -0
- adanvil-0.2.0/tests/test_endcard.py +225 -0
- adanvil-0.2.0/tests/test_ffmpeg.py +118 -0
- adanvil-0.2.0/tests/test_fixtures.py +230 -0
- adanvil-0.2.0/tests/test_jobs.py +131 -0
- adanvil-0.2.0/tests/test_library.py +248 -0
- adanvil-0.2.0/tests/test_media.py +222 -0
- adanvil-0.2.0/tests/test_onboard.py +266 -0
- adanvil-0.2.0/tests/test_package.py +21 -0
- adanvil-0.2.0/tests/test_paths.py +110 -0
- adanvil-0.2.0/tests/test_qc.py +248 -0
- adanvil-0.2.0/tests/test_r11_shot_choice.py +331 -0
- adanvil-0.2.0/tests/test_r7_usability.py +562 -0
- adanvil-0.2.0/tests/test_r9_catalog_paths_voice.py +342 -0
- adanvil-0.2.0/tests/test_reference.py +406 -0
- adanvil-0.2.0/tests/test_reference_checks.py +358 -0
- adanvil-0.2.0/tests/test_server.py +310 -0
- adanvil-0.2.0/tests/test_sound_design.py +1001 -0
- adanvil-0.2.0/tests/test_speech.py +811 -0
- adanvil-0.2.0/tests/test_speech_edit.py +785 -0
- adanvil-0.2.0/tests/test_speed.py +136 -0
- adanvil-0.2.0/tests/test_still_smoothness.py +267 -0
- adanvil-0.2.0/tests/test_storyboard_rules.py +287 -0
- adanvil-0.2.0/tests/test_text.py +379 -0
- adanvil-0.2.0/tests/test_textremoval.py +194 -0
- adanvil-0.2.0/tests/test_ugc_iteration.py +1236 -0
- adanvil-0.2.0/tests/test_v24b_fixes.py +484 -0
- adanvil-0.2.0/tests/test_v24c_reveal.py +881 -0
- adanvil-0.2.0/tests/test_v25_ad_score.py +890 -0
- adanvil-0.2.0/tests/test_v27_vision.py +782 -0
- adanvil-0.2.0/tests/test_v28_variants_formats.py +732 -0
- adanvil-0.2.0/tests/test_v28b_format_text.py +169 -0
- adanvil-0.2.0/tests/test_v28c_variants_usability.py +537 -0
- adanvil-0.2.0/tests/test_v28d_placement_faces.py +227 -0
- adanvil-0.2.0/tests/test_v28e_layout_selfcheck.py +320 -0
- adanvil-0.2.0/tests/test_v29_music.py +570 -0
- adanvil-0.2.0/tests/test_v29b_music_fixes.py +357 -0
- adanvil-0.2.0/tests/test_visual_grammar.py +770 -0
- adanvil-0.2.0/tests/test_voice.py +320 -0
- adanvil-0.2.0/tests/test_voice_speed.py +534 -0
- adanvil-0.2.0/tests/test_voice_storyboard.py +238 -0
- adanvil-0.2.0/uv.lock +1454 -0
|
@@ -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
|
adanvil-0.2.0/.gitignore
ADDED
|
@@ -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/
|