yap-studio 1.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.
- yap_studio-1.2.0/.agents/plugins/marketplace.json +20 -0
- yap_studio-1.2.0/.claude-plugin/marketplace.json +18 -0
- yap_studio-1.2.0/.github/FUNDING.yml +1 -0
- yap_studio-1.2.0/.github/ISSUE_TEMPLATE/bug.md +20 -0
- yap_studio-1.2.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- yap_studio-1.2.0/.github/ISSUE_TEMPLATE/feature.md +19 -0
- yap_studio-1.2.0/.github/ISSUE_TEMPLATE/feedback.md +26 -0
- yap_studio-1.2.0/.github/pull_request_template.md +20 -0
- yap_studio-1.2.0/.github/release-check-paths.json +145 -0
- yap_studio-1.2.0/.github/workflows/ci.yml +93 -0
- yap_studio-1.2.0/.github/workflows/hyperframes-bump.yml +272 -0
- yap_studio-1.2.0/.github/workflows/pypi.yml +46 -0
- yap_studio-1.2.0/.github/workflows/release-checks.yml +154 -0
- yap_studio-1.2.0/.github/workflows/release.yml +57 -0
- yap_studio-1.2.0/.gitignore +49 -0
- yap_studio-1.2.0/.python-version +1 -0
- yap_studio-1.2.0/CHANGELOG.md +290 -0
- yap_studio-1.2.0/CODE_OF_CONDUCT.md +24 -0
- yap_studio-1.2.0/CONTRIBUTING.md +94 -0
- yap_studio-1.2.0/LICENSE +202 -0
- yap_studio-1.2.0/LICENSES/Apache-2.0.txt +202 -0
- yap_studio-1.2.0/LICENSES/OFL-alata.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-antonsc.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-archivoblack.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-geist.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-gelasio.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-instrumentserif.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-inter.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-spacemono.txt +93 -0
- yap_studio-1.2.0/LICENSES/OFL-titanone.txt +94 -0
- yap_studio-1.2.0/NOTICE +56 -0
- yap_studio-1.2.0/PKG-INFO +346 -0
- yap_studio-1.2.0/README.md +307 -0
- yap_studio-1.2.0/SECURITY.md +11 -0
- yap_studio-1.2.0/changes/README.md +17 -0
- yap_studio-1.2.0/docs/audio.md +174 -0
- yap_studio-1.2.0/docs/camera3d-pilot.md +74 -0
- yap_studio-1.2.0/docs/captions-and-cards.md +558 -0
- yap_studio-1.2.0/docs/commands.md +122 -0
- yap_studio-1.2.0/docs/design/style-page/README.md +101 -0
- yap_studio-1.2.0/docs/design/style-page/app.js +1642 -0
- yap_studio-1.2.0/docs/design/style-page/caption-ports.css +105 -0
- yap_studio-1.2.0/docs/design/style-page/caption-ports.js +237 -0
- yap_studio-1.2.0/docs/design/style-page/frame-person.svg +58 -0
- yap_studio-1.2.0/docs/design/style-page/frame-room.svg +62 -0
- yap_studio-1.2.0/docs/design/style-page/index.html +111 -0
- yap_studio-1.2.0/docs/design/style-page/learned.js +179 -0
- yap_studio-1.2.0/docs/design/style-page/looks.js +95 -0
- yap_studio-1.2.0/docs/design/style-page/phrases.js +170 -0
- yap_studio-1.2.0/docs/design/style-page/proposed-presets/order.json +1 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-1-top.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-2-full-page.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-3-words-on-screen-hover.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-4-font.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-4b-highlight-none.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-7-preset-switch-undo.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-1-top.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-2-presets-and-type.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-3-highlight.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-4-colors.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-5-hex-codes.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-6-saved.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/preview-interaction.gif +0 -0
- yap_studio-1.2.0/docs/design/style-page/screenshots/tablet-top.webp +0 -0
- yap_studio-1.2.0/docs/design/style-page/serve.py +607 -0
- yap_studio-1.2.0/docs/design/style-page/style-data.js +1731 -0
- yap_studio-1.2.0/docs/design/style-page/styles.css +538 -0
- yap_studio-1.2.0/docs/design/style-page/sync_data.py +156 -0
- yap_studio-1.2.0/docs/edit-lists.md +168 -0
- yap_studio-1.2.0/docs/editing.md +387 -0
- yap_studio-1.2.0/docs/feedback.md +81 -0
- yap_studio-1.2.0/docs/home.md +107 -0
- yap_studio-1.2.0/docs/how-it-works.md +62 -0
- yap_studio-1.2.0/docs/images/demo.gif +0 -0
- yap_studio-1.2.0/docs/images/how-it-works.png +0 -0
- yap_studio-1.2.0/docs/images/how-it-works.svg +91 -0
- yap_studio-1.2.0/docs/images/journey/1-start-here.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/2-what.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/3-footage.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/4-look.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/5-make.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/6-progress.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/7-review.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/8-done.jpg +0 -0
- yap_studio-1.2.0/docs/images/journey/9-phone.jpg +0 -0
- yap_studio-1.2.0/docs/install.md +315 -0
- yap_studio-1.2.0/docs/limits.md +48 -0
- yap_studio-1.2.0/docs/recipes/voiceover.md +67 -0
- yap_studio-1.2.0/docs/review.md +193 -0
- yap_studio-1.2.0/docs/style-page.md +300 -0
- yap_studio-1.2.0/docs/styles.md +171 -0
- yap_studio-1.2.0/docs/verify.md +184 -0
- yap_studio-1.2.0/mcpb/manifest.json +47 -0
- yap_studio-1.2.0/plugins/yap-studio/.claude-plugin/plugin.json +10 -0
- yap_studio-1.2.0/plugins/yap-studio/.codex-plugin/plugin.json +9 -0
- yap_studio-1.2.0/plugins/yap-studio/.mcp.json +8 -0
- yap_studio-1.2.0/plugins/yap-studio/commands/verify.md +8 -0
- yap_studio-1.2.0/plugins/yap-studio/skills/verify-video/SKILL.md +76 -0
- yap_studio-1.2.0/pyproject.toml +65 -0
- yap_studio-1.2.0/release-notes.md +31 -0
- yap_studio-1.2.0/scripts/accept_workspace.py +63 -0
- yap_studio-1.2.0/scripts/build_mcpb.py +96 -0
- yap_studio-1.2.0/scripts/build_workspace.py +132 -0
- yap_studio-1.2.0/scripts/bump_hyperframes.py +340 -0
- yap_studio-1.2.0/scripts/bump_version.py +238 -0
- yap_studio-1.2.0/scripts/camera3d_pilot.py +152 -0
- yap_studio-1.2.0/scripts/camera3d_plan_sheet.py +169 -0
- yap_studio-1.2.0/scripts/check_release_ci.py +51 -0
- yap_studio-1.2.0/scripts/check_version_bump.py +67 -0
- yap_studio-1.2.0/scripts/gen_camera3d_metrics.py +54 -0
- yap_studio-1.2.0/scripts/gen_project_schemas.py +50 -0
- yap_studio-1.2.0/scripts/gen_text_metrics.py +111 -0
- yap_studio-1.2.0/scripts/release_check_scope.py +128 -0
- yap_studio-1.2.0/src/yap_studio/__init__.py +12 -0
- yap_studio-1.2.0/src/yap_studio/__main__.py +8 -0
- yap_studio-1.2.0/src/yap_studio/affiliate.py +4 -0
- yap_studio-1.2.0/src/yap_studio/audio.py +601 -0
- yap_studio-1.2.0/src/yap_studio/audio_chain.py +60 -0
- yap_studio-1.2.0/src/yap_studio/background.py +213 -0
- yap_studio-1.2.0/src/yap_studio/brand_command.py +99 -0
- yap_studio-1.2.0/src/yap_studio/brand_words.py +129 -0
- yap_studio-1.2.0/src/yap_studio/cache.py +28 -0
- yap_studio-1.2.0/src/yap_studio/canvas.py +113 -0
- yap_studio-1.2.0/src/yap_studio/captions.py +496 -0
- yap_studio-1.2.0/src/yap_studio/card_motion.py +219 -0
- yap_studio-1.2.0/src/yap_studio/card_project.py +145 -0
- yap_studio-1.2.0/src/yap_studio/card_stills.py +94 -0
- yap_studio-1.2.0/src/yap_studio/cards.py +2455 -0
- yap_studio-1.2.0/src/yap_studio/cards_video.py +185 -0
- yap_studio-1.2.0/src/yap_studio/checks/__init__.py +5 -0
- yap_studio-1.2.0/src/yap_studio/checks/caption_contrast.py +515 -0
- yap_studio-1.2.0/src/yap_studio/checks/caption_layout.py +281 -0
- yap_studio-1.2.0/src/yap_studio/checks/caption_words.py +207 -0
- yap_studio-1.2.0/src/yap_studio/checks/declared.py +313 -0
- yap_studio-1.2.0/src/yap_studio/checks/detect.py +569 -0
- yap_studio-1.2.0/src/yap_studio/checks/face_clearance.py +133 -0
- yap_studio-1.2.0/src/yap_studio/checks/fillers_gold.py +450 -0
- yap_studio-1.2.0/src/yap_studio/checks/flash.py +225 -0
- yap_studio-1.2.0/src/yap_studio/checks/grade.py +114 -0
- yap_studio-1.2.0/src/yap_studio/checks/joins.py +2121 -0
- yap_studio-1.2.0/src/yap_studio/checks/kept_words.py +133 -0
- yap_studio-1.2.0/src/yap_studio/checks/model.py +152 -0
- yap_studio-1.2.0/src/yap_studio/checks/platform.py +188 -0
- yap_studio-1.2.0/src/yap_studio/checks/relisten.py +368 -0
- yap_studio-1.2.0/src/yap_studio/checks/spans.py +164 -0
- yap_studio-1.2.0/src/yap_studio/checks/structure.py +1055 -0
- yap_studio-1.2.0/src/yap_studio/checks/sync.py +648 -0
- yap_studio-1.2.0/src/yap_studio/cli.py +2023 -0
- yap_studio-1.2.0/src/yap_studio/covers/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/covers/command.py +221 -0
- yap_studio-1.2.0/src/yap_studio/covers/layout.py +532 -0
- yap_studio-1.2.0/src/yap_studio/covers/pick.py +282 -0
- yap_studio-1.2.0/src/yap_studio/covers/render.py +521 -0
- yap_studio-1.2.0/src/yap_studio/covers/wide.py +314 -0
- yap_studio-1.2.0/src/yap_studio/editor_cards.py +168 -0
- yap_studio-1.2.0/src/yap_studio/edl/__init__.py +127 -0
- yap_studio-1.2.0/src/yap_studio/edl/fcpxml.py +239 -0
- yap_studio-1.2.0/src/yap_studio/edl/model.py +312 -0
- yap_studio-1.2.0/src/yap_studio/edl/rangesjson.py +310 -0
- yap_studio-1.2.0/src/yap_studio/edl/xmeml.py +264 -0
- yap_studio-1.2.0/src/yap_studio/edl/yapjson.py +149 -0
- yap_studio-1.2.0/src/yap_studio/elevenlabs.py +181 -0
- yap_studio-1.2.0/src/yap_studio/errors.py +331 -0
- yap_studio-1.2.0/src/yap_studio/faces/__init__.py +104 -0
- yap_studio-1.2.0/src/yap_studio/faces/clearance.py +685 -0
- yap_studio-1.2.0/src/yap_studio/faces/command.py +254 -0
- yap_studio-1.2.0/src/yap_studio/faces/detect.py +402 -0
- yap_studio-1.2.0/src/yap_studio/faces/face_boxes.swift +273 -0
- yap_studio-1.2.0/src/yap_studio/faces/final.py +87 -0
- yap_studio-1.2.0/src/yap_studio/faces/mapping.py +179 -0
- yap_studio-1.2.0/src/yap_studio/faces/model.py +389 -0
- yap_studio-1.2.0/src/yap_studio/faces/placement.py +235 -0
- yap_studio-1.2.0/src/yap_studio/faces/project.py +145 -0
- yap_studio-1.2.0/src/yap_studio/feedback/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/feedback/apply.py +500 -0
- yap_studio-1.2.0/src/yap_studio/feedback/audio.py +145 -0
- yap_studio-1.2.0/src/yap_studio/feedback/batch.py +639 -0
- yap_studio-1.2.0/src/yap_studio/feedback/broll.py +306 -0
- yap_studio-1.2.0/src/yap_studio/feedback/clarify.py +178 -0
- yap_studio-1.2.0/src/yap_studio/feedback/cli.py +346 -0
- yap_studio-1.2.0/src/yap_studio/feedback/edits.py +649 -0
- yap_studio-1.2.0/src/yap_studio/feedback/keeps.py +286 -0
- yap_studio-1.2.0/src/yap_studio/feedback/locate.py +89 -0
- yap_studio-1.2.0/src/yap_studio/feedback/moments.py +118 -0
- yap_studio-1.2.0/src/yap_studio/feedback/outline.py +614 -0
- yap_studio-1.2.0/src/yap_studio/feedback/pins.py +366 -0
- yap_studio-1.2.0/src/yap_studio/feedback/release.py +321 -0
- yap_studio-1.2.0/src/yap_studio/feedback/removed.py +81 -0
- yap_studio-1.2.0/src/yap_studio/feedback/replies.py +386 -0
- yap_studio-1.2.0/src/yap_studio/feedback/spelling.py +124 -0
- yap_studio-1.2.0/src/yap_studio/feedback/taste.py +152 -0
- yap_studio-1.2.0/src/yap_studio/feedback/versions.py +814 -0
- yap_studio-1.2.0/src/yap_studio/ffmpeg.py +475 -0
- yap_studio-1.2.0/src/yap_studio/file_cards.py +187 -0
- yap_studio-1.2.0/src/yap_studio/fonts/alata-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/anton-sc-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/archivo-black-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/geist-italic-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/geist-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/gelasio-italic-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/gelasio-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/instrument-serif-italic.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/instrument-serif-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/inter-italic-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/inter-variable.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/permanent-marker-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/space-mono-italic.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/space-mono-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/fonts/titan-one-regular.woff2 +0 -0
- yap_studio-1.2.0/src/yap_studio/gallery/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/gallery/command.py +339 -0
- yap_studio-1.2.0/src/yap_studio/gallery/cutout.py +84 -0
- yap_studio-1.2.0/src/yap_studio/gallery/detach.py +232 -0
- yap_studio-1.2.0/src/yap_studio/gallery/face_landmarks.swift +78 -0
- yap_studio-1.2.0/src/yap_studio/gallery/live.py +326 -0
- yap_studio-1.2.0/src/yap_studio/gallery/sample-still.jpg +0 -0
- yap_studio-1.2.0/src/yap_studio/gallery/server.py +881 -0
- yap_studio-1.2.0/src/yap_studio/gallery/static/choices.mjs +1216 -0
- yap_studio-1.2.0/src/yap_studio/gallery/static/pick.css +482 -0
- yap_studio-1.2.0/src/yap_studio/gallery/static/pick.html +61 -0
- yap_studio-1.2.0/src/yap_studio/gallery/static/pick.js +2242 -0
- yap_studio-1.2.0/src/yap_studio/gallery/static/shot.jpg +0 -0
- yap_studio-1.2.0/src/yap_studio/gallery/still.py +587 -0
- yap_studio-1.2.0/src/yap_studio/gallery/still_command.py +69 -0
- yap_studio-1.2.0/src/yap_studio/grade.py +407 -0
- yap_studio-1.2.0/src/yap_studio/grade_command.py +124 -0
- yap_studio-1.2.0/src/yap_studio/hdr.py +190 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/cards.py +228 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/catalog.json +122 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/catalog.py +308 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/install.py +255 -0
- yap_studio-1.2.0/src/yap_studio/hf_registry/localize.py +471 -0
- yap_studio-1.2.0/src/yap_studio/homepage/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/homepage/bridge.py +656 -0
- yap_studio-1.2.0/src/yap_studio/homepage/command.py +173 -0
- yap_studio-1.2.0/src/yap_studio/homepage/detach.py +164 -0
- yap_studio-1.2.0/src/yap_studio/homepage/link.py +87 -0
- yap_studio-1.2.0/src/yap_studio/homepage/server.py +625 -0
- yap_studio-1.2.0/src/yap_studio/homepage/state.py +452 -0
- yap_studio-1.2.0/src/yap_studio/homepage/static/home-model.mjs +365 -0
- yap_studio-1.2.0/src/yap_studio/homepage/static/home.css +334 -0
- yap_studio-1.2.0/src/yap_studio/homepage/static/home.html +38 -0
- yap_studio-1.2.0/src/yap_studio/homepage/static/home.js +1079 -0
- yap_studio-1.2.0/src/yap_studio/install_info.py +175 -0
- yap_studio-1.2.0/src/yap_studio/jiggle_cards.py +185 -0
- yap_studio-1.2.0/src/yap_studio/joins/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/joins/assembly.py +39 -0
- yap_studio-1.2.0/src/yap_studio/joins/command.py +57 -0
- yap_studio-1.2.0/src/yap_studio/joins/helper.py +142 -0
- yap_studio-1.2.0/src/yap_studio/joins/plan.py +260 -0
- yap_studio-1.2.0/src/yap_studio/joins/render.py +210 -0
- yap_studio-1.2.0/src/yap_studio/joins/smooth_frames.swift +196 -0
- yap_studio-1.2.0/src/yap_studio/joins/steps.py +183 -0
- yap_studio-1.2.0/src/yap_studio/letters.py +417 -0
- yap_studio-1.2.0/src/yap_studio/local_http.py +20 -0
- yap_studio-1.2.0/src/yap_studio/matte/__init__.py +21 -0
- yap_studio-1.2.0/src/yap_studio/matte/check.py +582 -0
- yap_studio-1.2.0/src/yap_studio/matte/chroma.py +393 -0
- yap_studio-1.2.0/src/yap_studio/matte/command.py +169 -0
- yap_studio-1.2.0/src/yap_studio/matte/composite.py +417 -0
- yap_studio-1.2.0/src/yap_studio/matte/edge_colour.py +212 -0
- yap_studio-1.2.0/src/yap_studio/matte/frames.py +252 -0
- yap_studio-1.2.0/src/yap_studio/matte/hyperframes.py +292 -0
- yap_studio-1.2.0/src/yap_studio/matte/ink.py +20 -0
- yap_studio-1.2.0/src/yap_studio/matte/make.py +452 -0
- yap_studio-1.2.0/src/yap_studio/matte/model.py +280 -0
- yap_studio-1.2.0/src/yap_studio/matte/person_matte.swift +197 -0
- yap_studio-1.2.0/src/yap_studio/matte/project.py +207 -0
- yap_studio-1.2.0/src/yap_studio/matte/refine.py +247 -0
- yap_studio-1.2.0/src/yap_studio/matte/timing.py +34 -0
- yap_studio-1.2.0/src/yap_studio/matte/vision.py +105 -0
- yap_studio-1.2.0/src/yap_studio/mcp_server.py +112 -0
- yap_studio-1.2.0/src/yap_studio/media/__init__.py +34 -0
- yap_studio-1.2.0/src/yap_studio/media/album.py +353 -0
- yap_studio-1.2.0/src/yap_studio/media/captured.py +325 -0
- yap_studio-1.2.0/src/yap_studio/media/catalog.py +791 -0
- yap_studio-1.2.0/src/yap_studio/media/commands.py +315 -0
- yap_studio-1.2.0/src/yap_studio/media/describe.py +209 -0
- yap_studio-1.2.0/src/yap_studio/media/frame.py +54 -0
- yap_studio-1.2.0/src/yap_studio/media/inventory.py +353 -0
- yap_studio-1.2.0/src/yap_studio/media/select.py +376 -0
- yap_studio-1.2.0/src/yap_studio/media/sheet.py +404 -0
- yap_studio-1.2.0/src/yap_studio/media/sound.py +117 -0
- yap_studio-1.2.0/src/yap_studio/opening_push.py +60 -0
- yap_studio-1.2.0/src/yap_studio/paths.py +456 -0
- yap_studio-1.2.0/src/yap_studio/pictures/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/pictures/attempts.py +71 -0
- yap_studio-1.2.0/src/yap_studio/pictures/command.py +196 -0
- yap_studio-1.2.0/src/yap_studio/pictures/guard.py +208 -0
- yap_studio-1.2.0/src/yap_studio/pictures/make.py +526 -0
- yap_studio-1.2.0/src/yap_studio/pictures/metadata.py +40 -0
- yap_studio-1.2.0/src/yap_studio/pictures/sheet.py +273 -0
- yap_studio-1.2.0/src/yap_studio/pictures/wavespeed.py +372 -0
- yap_studio-1.2.0/src/yap_studio/plan.py +256 -0
- yap_studio-1.2.0/src/yap_studio/planner/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/planner/anchors.py +74 -0
- yap_studio-1.2.0/src/yap_studio/planner/broll.py +681 -0
- yap_studio-1.2.0/src/yap_studio/planner/broll_placement.py +30 -0
- yap_studio-1.2.0/src/yap_studio/planner/broll_timing.py +45 -0
- yap_studio-1.2.0/src/yap_studio/planner/cards.py +1388 -0
- yap_studio-1.2.0/src/yap_studio/planner/command.py +236 -0
- yap_studio-1.2.0/src/yap_studio/planner/number_behind.py +281 -0
- yap_studio-1.2.0/src/yap_studio/planner/number_spoken.py +49 -0
- yap_studio-1.2.0/src/yap_studio/platforms.json +131 -0
- yap_studio-1.2.0/src/yap_studio/process.py +75 -0
- yap_studio-1.2.0/src/yap_studio/product_feedback.py +387 -0
- yap_studio-1.2.0/src/yap_studio/project/__init__.py +181 -0
- yap_studio-1.2.0/src/yap_studio/project/anchors.py +254 -0
- yap_studio-1.2.0/src/yap_studio/project/edit_format.py +93 -0
- yap_studio-1.2.0/src/yap_studio/project/lock.py +153 -0
- yap_studio-1.2.0/src/yap_studio/project/model.py +940 -0
- yap_studio-1.2.0/src/yap_studio/project/receipts.py +542 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/cut-words.schema.json +78 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/edit.schema.json +169 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/project.schema.json +487 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/removals.schema.json +84 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/text-hook.schema.json +78 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/timeline-fragment.schema.json +3128 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/timeline.schema.json +3145 -0
- yap_studio-1.2.0/src/yap_studio/project/schemas/words.schema.json +101 -0
- yap_studio-1.2.0/src/yap_studio/project/status.py +889 -0
- yap_studio-1.2.0/src/yap_studio/project/word_fixes.py +39 -0
- yap_studio-1.2.0/src/yap_studio/receipt.py +80 -0
- yap_studio-1.2.0/src/yap_studio/registry.py +205 -0
- yap_studio-1.2.0/src/yap_studio/render/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/render/alpha.py +98 -0
- yap_studio-1.2.0/src/yap_studio/render/beats.py +112 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d.py +2319 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_clearance.py +112 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_fallback.py +136 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_geometry.py +77 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_look.py +395 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_matte.py +54 -0
- yap_studio-1.2.0/src/yap_studio/render/camera3d_motion.py +113 -0
- yap_studio-1.2.0/src/yap_studio/render/fonts.py +307 -0
- yap_studio-1.2.0/src/yap_studio/render/hyperframes.py +1075 -0
- yap_studio-1.2.0/src/yap_studio/render/layer_checks.py +315 -0
- yap_studio-1.2.0/src/yap_studio/render/moment_clones.py +453 -0
- yap_studio-1.2.0/src/yap_studio/render/moments.py +531 -0
- yap_studio-1.2.0/src/yap_studio/render/renderer-lock/package-lock.json +1933 -0
- yap_studio-1.2.0/src/yap_studio/render/renderer-lock/package.json +11 -0
- yap_studio-1.2.0/src/yap_studio/render/text_metrics.json +10442 -0
- yap_studio-1.2.0/src/yap_studio/render/text_metrics.py +94 -0
- yap_studio-1.2.0/src/yap_studio/render/user_fonts.py +310 -0
- yap_studio-1.2.0/src/yap_studio/report.py +595 -0
- yap_studio-1.2.0/src/yap_studio/review/__init__.py +85 -0
- yap_studio-1.2.0/src/yap_studio/review/captions.py +61 -0
- yap_studio-1.2.0/src/yap_studio/review/detach.py +224 -0
- yap_studio-1.2.0/src/yap_studio/review/export.py +403 -0
- yap_studio-1.2.0/src/yap_studio/review/findings.py +349 -0
- yap_studio-1.2.0/src/yap_studio/review/launch.py +108 -0
- yap_studio-1.2.0/src/yap_studio/review/media.py +262 -0
- yap_studio-1.2.0/src/yap_studio/review/model.py +456 -0
- yap_studio-1.2.0/src/yap_studio/review/outline_server.py +339 -0
- yap_studio-1.2.0/src/yap_studio/review/phone.py +178 -0
- yap_studio-1.2.0/src/yap_studio/review/rounds.py +162 -0
- yap_studio-1.2.0/src/yap_studio/review/send.py +77 -0
- yap_studio-1.2.0/src/yap_studio/review/series.py +247 -0
- yap_studio-1.2.0/src/yap_studio/review/server.py +1428 -0
- yap_studio-1.2.0/src/yap_studio/review/static/app.css +445 -0
- yap_studio-1.2.0/src/yap_studio/review/static/app.mjs +2893 -0
- yap_studio-1.2.0/src/yap_studio/review/static/index.html +269 -0
- yap_studio-1.2.0/src/yap_studio/review/static/list.html +27 -0
- yap_studio-1.2.0/src/yap_studio/review/static/outline-view.mjs +63 -0
- yap_studio-1.2.0/src/yap_studio/review/static/outline.html +52 -0
- yap_studio-1.2.0/src/yap_studio/review/static/outline.mjs +359 -0
- yap_studio-1.2.0/src/yap_studio/review/static/taste.mjs +111 -0
- yap_studio-1.2.0/src/yap_studio/review/static/text-hook.mjs +70 -0
- yap_studio-1.2.0/src/yap_studio/review/static/timeline.mjs +588 -0
- yap_studio-1.2.0/src/yap_studio/review/store.py +922 -0
- yap_studio-1.2.0/src/yap_studio/review/video_map.py +122 -0
- yap_studio-1.2.0/src/yap_studio/setup_checks.py +75 -0
- yap_studio-1.2.0/src/yap_studio/sfx/__init__.py +376 -0
- yap_studio-1.2.0/src/yap_studio/sfx/bleep.py +469 -0
- yap_studio-1.2.0/src/yap_studio/sfx/commands.py +77 -0
- yap_studio-1.2.0/src/yap_studio/sfx/kits/extras.json +70 -0
- yap_studio-1.2.0/src/yap_studio/sfx/kits/made.json +311 -0
- yap_studio-1.2.0/src/yap_studio/sfx/kits/soft.json +43 -0
- yap_studio-1.2.0/src/yap_studio/sfx/made.py +250 -0
- yap_studio-1.2.0/src/yap_studio/sfx/place.py +356 -0
- yap_studio-1.2.0/src/yap_studio/sfx/swear-words.json +48 -0
- yap_studio-1.2.0/src/yap_studio/stages/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/stages/assemble.py +1759 -0
- yap_studio-1.2.0/src/yap_studio/stages/assemble_audio.py +653 -0
- yap_studio-1.2.0/src/yap_studio/stages/assemble_grade.py +62 -0
- yap_studio-1.2.0/src/yap_studio/stages/assemble_picture.py +1467 -0
- yap_studio-1.2.0/src/yap_studio/stages/behind_window.py +58 -0
- yap_studio-1.2.0/src/yap_studio/stages/broll_framing.py +93 -0
- yap_studio-1.2.0/src/yap_studio/stages/broll_limits.py +109 -0
- yap_studio-1.2.0/src/yap_studio/stages/broll_match.py +385 -0
- yap_studio-1.2.0/src/yap_studio/stages/broll_split.py +213 -0
- yap_studio-1.2.0/src/yap_studio/stages/captions.py +2010 -0
- yap_studio-1.2.0/src/yap_studio/stages/captions_3d.py +348 -0
- yap_studio-1.2.0/src/yap_studio/stages/coverage.py +210 -0
- yap_studio-1.2.0/src/yap_studio/stages/cut.py +1466 -0
- yap_studio-1.2.0/src/yap_studio/stages/edges.py +752 -0
- yap_studio-1.2.0/src/yap_studio/stages/fillers.py +2322 -0
- yap_studio-1.2.0/src/yap_studio/stages/graphics.py +1048 -0
- yap_studio-1.2.0/src/yap_studio/stages/green_screen.py +355 -0
- yap_studio-1.2.0/src/yap_studio/stages/ingest.py +816 -0
- yap_studio-1.2.0/src/yap_studio/stages/music.py +650 -0
- yap_studio-1.2.0/src/yap_studio/stages/number_graphics.py +157 -0
- yap_studio-1.2.0/src/yap_studio/stages/number_visibility.py +69 -0
- yap_studio-1.2.0/src/yap_studio/stages/rebase.py +789 -0
- yap_studio-1.2.0/src/yap_studio/stages/repeats.py +140 -0
- yap_studio-1.2.0/src/yap_studio/stages/run.py +336 -0
- yap_studio-1.2.0/src/yap_studio/stages/run_detach.py +407 -0
- yap_studio-1.2.0/src/yap_studio/stages/take_levels.py +227 -0
- yap_studio-1.2.0/src/yap_studio/stages/tall_box.py +144 -0
- yap_studio-1.2.0/src/yap_studio/stages/timeline.py +1527 -0
- yap_studio-1.2.0/src/yap_studio/stages/transitions.py +148 -0
- yap_studio-1.2.0/src/yap_studio/stages/voiceover.py +59 -0
- yap_studio-1.2.0/src/yap_studio/stock/__init__.py +1 -0
- yap_studio-1.2.0/src/yap_studio/stock/command.py +135 -0
- yap_studio-1.2.0/src/yap_studio/stock/credits.py +67 -0
- yap_studio-1.2.0/src/yap_studio/stock/fetch.py +118 -0
- yap_studio-1.2.0/src/yap_studio/stock/get.py +273 -0
- yap_studio-1.2.0/src/yap_studio/stock/guard.py +144 -0
- yap_studio-1.2.0/src/yap_studio/stock/metadata.py +53 -0
- yap_studio-1.2.0/src/yap_studio/stock/pexels.py +191 -0
- yap_studio-1.2.0/src/yap_studio/stock/provider.py +158 -0
- yap_studio-1.2.0/src/yap_studio/stock/sheet.py +451 -0
- yap_studio-1.2.0/src/yap_studio/studio/__init__.py +5 -0
- yap_studio-1.2.0/src/yap_studio/studio/commands.py +70 -0
- yap_studio-1.2.0/src/yap_studio/studio/export.py +409 -0
- yap_studio-1.2.0/src/yap_studio/style/PROVENANCE.json +141 -0
- yap_studio-1.2.0/src/yap_studio/style/__init__.py +63 -0
- yap_studio-1.2.0/src/yap_studio/style/answers.py +358 -0
- yap_studio-1.2.0/src/yap_studio/style/library.py +415 -0
- yap_studio-1.2.0/src/yap_studio/style/loader.py +316 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/candy.json +42 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/clean_minimal.json +26 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/cobalt.json +42 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/editorial_serif.json +43 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/electric.json +29 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/headline.json +43 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/hf_bold.json +35 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/hf_editorial.json +35 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/hf_neutral.json +35 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/marker.json +42 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/mono.json +42 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/one_word.json +44 -0
- yap_studio-1.2.0/src/yap_studio/style/presets/warm_editorial.json +28 -0
- yap_studio-1.2.0/src/yap_studio/style/schema-v1.json +1095 -0
- yap_studio-1.2.0/src/yap_studio/style/site_colors.py +463 -0
- yap_studio-1.2.0/src/yap_studio/taste/__init__.py +82 -0
- yap_studio-1.2.0/src/yap_studio/taste/check.py +242 -0
- yap_studio-1.2.0/src/yap_studio/taste/cli.py +249 -0
- yap_studio-1.2.0/src/yap_studio/taste/frames.py +296 -0
- yap_studio-1.2.0/src/yap_studio/taste/inbox.py +269 -0
- yap_studio-1.2.0/src/yap_studio/taste/learn.py +1237 -0
- yap_studio-1.2.0/src/yap_studio/taste/learned.py +119 -0
- yap_studio-1.2.0/src/yap_studio/taste/measure_pacing.py +306 -0
- yap_studio-1.2.0/src/yap_studio/taste/measure_panels.py +360 -0
- yap_studio-1.2.0/src/yap_studio/taste/measure_shapes.py +377 -0
- yap_studio-1.2.0/src/yap_studio/taste/measure_text.py +488 -0
- yap_studio-1.2.0/src/yap_studio/taste/measure_words.py +357 -0
- yap_studio-1.2.0/src/yap_studio/taste/model.py +585 -0
- yap_studio-1.2.0/src/yap_studio/taste/render.py +162 -0
- yap_studio-1.2.0/src/yap_studio/taste/resolve.py +132 -0
- yap_studio-1.2.0/src/yap_studio/taste/store.py +436 -0
- yap_studio-1.2.0/src/yap_studio/templates/PROVENANCE.json +519 -0
- yap_studio-1.2.0/src/yap_studio/templates/big_number/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/big_number/template.html +96 -0
- yap_studio-1.2.0/src/yap_studio/templates/big_number/template.json +289 -0
- yap_studio-1.2.0/src/yap_studio/templates/callout_circle/preview.json +8 -0
- yap_studio-1.2.0/src/yap_studio/templates/callout_circle/template.html +82 -0
- yap_studio-1.2.0/src/yap_studio/templates/callout_circle/template.json +196 -0
- yap_studio-1.2.0/src/yap_studio/templates/camera3d/PROVENANCE.json +42 -0
- yap_studio-1.2.0/src/yap_studio/templates/camera3d/cam3d.js +360 -0
- yap_studio-1.2.0/src/yap_studio/templates/camera3d/finish.js +35 -0
- yap_studio-1.2.0/src/yap_studio/templates/camera3d/metrics.json +312 -0
- yap_studio-1.2.0/src/yap_studio/templates/camera3d/tables.js +29 -0
- yap_studio-1.2.0/src/yap_studio/templates/captions/template.html +1077 -0
- yap_studio-1.2.0/src/yap_studio/templates/captions/template.json +396 -0
- yap_studio-1.2.0/src/yap_studio/templates/card-motion-drawn.js +35 -0
- yap_studio-1.2.0/src/yap_studio/templates/card-motion-host.js +100 -0
- yap_studio-1.2.0/src/yap_studio/templates/chapter/template.html +74 -0
- yap_studio-1.2.0/src/yap_studio/templates/chapter/template.json +67 -0
- yap_studio-1.2.0/src/yap_studio/templates/chart/preview.json +20 -0
- yap_studio-1.2.0/src/yap_studio/templates/chart/template.html +88 -0
- yap_studio-1.2.0/src/yap_studio/templates/chart/template.json +202 -0
- yap_studio-1.2.0/src/yap_studio/templates/checklist/preview.json +9 -0
- yap_studio-1.2.0/src/yap_studio/templates/checklist/template.html +141 -0
- yap_studio-1.2.0/src/yap_studio/templates/checklist/template.json +148 -0
- yap_studio-1.2.0/src/yap_studio/templates/choices/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/choices/template.html +102 -0
- yap_studio-1.2.0/src/yap_studio/templates/choices/template.json +239 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_cta/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_cta/template.html +140 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_cta/template.json +198 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_drop/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_drop/template.html +118 -0
- yap_studio-1.2.0/src/yap_studio/templates/comment_drop/template.json +214 -0
- yap_studio-1.2.0/src/yap_studio/templates/cover/template.html +104 -0
- yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/preview.json +13 -0
- yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/template.html +142 -0
- yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/template.json +242 -0
- yap_studio-1.2.0/src/yap_studio/templates/file_drop/preview.json +5 -0
- yap_studio-1.2.0/src/yap_studio/templates/file_drop/template.html +124 -0
- yap_studio-1.2.0/src/yap_studio/templates/file_drop/template.json +264 -0
- yap_studio-1.2.0/src/yap_studio/templates/flow/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/flow/template.html +326 -0
- yap_studio-1.2.0/src/yap_studio/templates/flow/template.json +184 -0
- yap_studio-1.2.0/src/yap_studio/templates/glow-shadow.js +9 -0
- yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/preview.json +18 -0
- yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/template.html +63 -0
- yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/template.json +141 -0
- yap_studio-1.2.0/src/yap_studio/templates/icon_strike/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/icon_strike/template.html +144 -0
- yap_studio-1.2.0/src/yap_studio/templates/icon_strike/template.json +193 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_card/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_card/template.html +231 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_card/template.json +244 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_compare/preview.json +8 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_compare/template.html +131 -0
- yap_studio-1.2.0/src/yap_studio/templates/image_compare/template.json +231 -0
- yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/preview.json +18 -0
- yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/template.html +118 -0
- yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/template.json +217 -0
- yap_studio-1.2.0/src/yap_studio/templates/letters/template.html +128 -0
- yap_studio-1.2.0/src/yap_studio/templates/letters/template.json +66 -0
- yap_studio-1.2.0/src/yap_studio/templates/name_tag/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/name_tag/template.html +74 -0
- yap_studio-1.2.0/src/yap_studio/templates/name_tag/template.json +148 -0
- yap_studio-1.2.0/src/yap_studio/templates/playing_grid/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/playing_grid/template.html +94 -0
- yap_studio-1.2.0/src/yap_studio/templates/playing_grid/template.json +182 -0
- yap_studio-1.2.0/src/yap_studio/templates/progress_stat/preview.json +7 -0
- yap_studio-1.2.0/src/yap_studio/templates/progress_stat/template.html +75 -0
- yap_studio-1.2.0/src/yap_studio/templates/progress_stat/template.json +160 -0
- yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/preview.json +6 -0
- yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/template.html +134 -0
- yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/template.json +183 -0
- yap_studio-1.2.0/src/yap_studio/templates/quote/preview.json +7 -0
- yap_studio-1.2.0/src/yap_studio/templates/quote/template.html +79 -0
- yap_studio-1.2.0/src/yap_studio/templates/quote/template.json +166 -0
- yap_studio-1.2.0/src/yap_studio/templates/reel_feed/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/reel_feed/template.html +172 -0
- yap_studio-1.2.0/src/yap_studio/templates/reel_feed/template.json +271 -0
- yap_studio-1.2.0/src/yap_studio/templates/specs_list/preview.json +19 -0
- yap_studio-1.2.0/src/yap_studio/templates/specs_list/template.html +157 -0
- yap_studio-1.2.0/src/yap_studio/templates/specs_list/template.json +188 -0
- yap_studio-1.2.0/src/yap_studio/templates/stat/preview.json +8 -0
- yap_studio-1.2.0/src/yap_studio/templates/stat/template.html +305 -0
- yap_studio-1.2.0/src/yap_studio/templates/stat/template.json +290 -0
- yap_studio-1.2.0/src/yap_studio/templates/steps/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/steps/template.html +129 -0
- yap_studio-1.2.0/src/yap_studio/templates/steps/template.json +144 -0
- yap_studio-1.2.0/src/yap_studio/templates/storyboard/preview.json +59 -0
- yap_studio-1.2.0/src/yap_studio/templates/storyboard/template.html +107 -0
- yap_studio-1.2.0/src/yap_studio/templates/storyboard/template.json +188 -0
- yap_studio-1.2.0/src/yap_studio/templates/success_check/preview.json +5 -0
- yap_studio-1.2.0/src/yap_studio/templates/success_check/template.html +73 -0
- yap_studio-1.2.0/src/yap_studio/templates/success_check/template.json +129 -0
- yap_studio-1.2.0/src/yap_studio/templates/terminal/preview.json +12 -0
- yap_studio-1.2.0/src/yap_studio/templates/terminal/template.html +149 -0
- yap_studio-1.2.0/src/yap_studio/templates/terminal/template.json +229 -0
- yap_studio-1.2.0/src/yap_studio/templates/text_tag/preview.json +7 -0
- yap_studio-1.2.0/src/yap_studio/templates/text_tag/template.html +281 -0
- yap_studio-1.2.0/src/yap_studio/templates/text_tag/template.json +229 -0
- yap_studio-1.2.0/src/yap_studio/templates/title/template.html +541 -0
- yap_studio-1.2.0/src/yap_studio/templates/title/template.json +269 -0
- yap_studio-1.2.0/src/yap_studio/templates/transfer/preview.json +7 -0
- yap_studio-1.2.0/src/yap_studio/templates/transfer/template.html +244 -0
- yap_studio-1.2.0/src/yap_studio/templates/transfer/template.json +347 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_cinematic_zoom/template.html +106 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_cinematic_zoom/template.json +29 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_light_leak/template.html +106 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_light_leak/template.json +29 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_whip_pan/template.html +106 -0
- yap_studio-1.2.0/src/yap_studio/templates/transition_whip_pan/template.json +29 -0
- yap_studio-1.2.0/src/yap_studio/templates/video_card/preview.json +1 -0
- yap_studio-1.2.0/src/yap_studio/templates/video_card/template.html +101 -0
- yap_studio-1.2.0/src/yap_studio/templates/video_card/template.json +183 -0
- yap_studio-1.2.0/src/yap_studio/templates/wide_titles/template.html +39 -0
- yap_studio-1.2.0/src/yap_studio/templates/wide_titles/template.json +114 -0
- yap_studio-1.2.0/src/yap_studio/templates_command.py +410 -0
- yap_studio-1.2.0/src/yap_studio/text_hook.py +103 -0
- yap_studio-1.2.0/src/yap_studio/text_rules.py +406 -0
- yap_studio-1.2.0/src/yap_studio/tools.py +227 -0
- yap_studio-1.2.0/src/yap_studio/transcript/__init__.py +46 -0
- yap_studio-1.2.0/src/yap_studio/transcript/backends.py +941 -0
- yap_studio-1.2.0/src/yap_studio/transcript/child.py +52 -0
- yap_studio-1.2.0/src/yap_studio/transcript/engine_child.py +213 -0
- yap_studio-1.2.0/src/yap_studio/transcript/isolated.py +191 -0
- yap_studio-1.2.0/src/yap_studio/transcript/mappers.py +183 -0
- yap_studio-1.2.0/src/yap_studio/transcript/model.py +95 -0
- yap_studio-1.2.0/src/yap_studio/transcript/shared.py +283 -0
- yap_studio-1.2.0/src/yap_studio/transcript/take_job.py +176 -0
- yap_studio-1.2.0/src/yap_studio/transcript/words.py +130 -0
- yap_studio-1.2.0/src/yap_studio/verify.py +1025 -0
- yap_studio-1.2.0/src/yap_studio/video.py +551 -0
- yap_studio-1.2.0/src/yap_studio/video_type.py +225 -0
- yap_studio-1.2.0/src/yap_studio/video_type_command.py +145 -0
- yap_studio-1.2.0/src/yap_studio/watch/__init__.py +90 -0
- yap_studio-1.2.0/src/yap_studio/watch/command.py +198 -0
- yap_studio-1.2.0/src/yap_studio/watch/findings.py +527 -0
- yap_studio-1.2.0/src/yap_studio/watch/images.py +271 -0
- yap_studio-1.2.0/src/yap_studio/watch/measure.py +264 -0
- yap_studio-1.2.0/src/yap_studio/watch/pack.py +1038 -0
- yap_studio-1.2.0/src/yap_studio/watch/scan.py +429 -0
- yap_studio-1.2.0/src/yap_studio/wide_cards.py +600 -0
- yap_studio-1.2.0/src/yap_studio/wide_titles.py +116 -0
- yap_studio-1.2.0/src/yap_studio/youtube_chapters.py +70 -0
- yap_studio-1.2.0/src/yap_studio/zoom_curve.py +289 -0
- yap_studio-1.2.0/tests/conftest.py +1076 -0
- yap_studio-1.2.0/tests/fakes/elevenlabs-pp-cli +118 -0
- yap_studio-1.2.0/tests/fakes/osxphotos +78 -0
- yap_studio-1.2.0/tests/fakes/pexels-pp-cli +25 -0
- yap_studio-1.2.0/tests/fakes/wavespeed-pp-cli +147 -0
- yap_studio-1.2.0/tests/fixtures/broll_insert_graphs.json +31 -0
- yap_studio-1.2.0/tests/fixtures/caption-case-cases.json +29 -0
- yap_studio-1.2.0/tests/fixtures/caption_spoken.mjs +59 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/callout_circle.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/chapter.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/chart.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/checklist.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/choices.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/comment_cta.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/comment_drop.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/edit_timeline.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/file_drop.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/flow.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/gravity_drop.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/icon_strike.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_card-collage.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_card.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_compare.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/jiggle_delete.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/name_tag.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/playing_grid.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/progress_stat.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/prompt_bar.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/quote.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/reel_feed.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/specs_list.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/stat-slot.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/stat.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/steps.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/storyboard.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/success_check.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/terminal.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-bar.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-block.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-card.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-plain.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-rule.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-tag.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-title.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/transfer.png +0 -0
- yap_studio-1.2.0/tests/fixtures/card-frames/darwin/video_card.png +0 -0
- yap_studio-1.2.0/tests/fixtures/chapter_probe.mjs +35 -0
- yap_studio-1.2.0/tests/fixtures/chapter_viewport.mjs +83 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/clean/gold.json +10 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/clean/removals.json +9 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/keep-cut/gold.json +8 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/keep-cut/removals.json +6 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/partial/gold.json +11 -0
- yap_studio-1.2.0/tests/fixtures/filler-gold/partial/removals.json +13 -0
- yap_studio-1.2.0/tests/fixtures/gallery_viewport.mjs +489 -0
- yap_studio-1.2.0/tests/fixtures/heic_fixture.swift +16 -0
- yap_studio-1.2.0/tests/fixtures/hf_card_capture.mjs +67 -0
- yap_studio-1.2.0/tests/fixtures/live_capture.mjs +36 -0
- yap_studio-1.2.0/tests/fixtures/motion_capture.mjs +67 -0
- yap_studio-1.2.0/tests/fixtures/origin-examples.json +354 -0
- yap_studio-1.2.0/tests/fixtures/phrase-cases.json +2596 -0
- yap_studio-1.2.0/tests/fixtures/pictures/auth.json +11 -0
- yap_studio-1.2.0/tests/fixtures/pictures/billings.json +36 -0
- yap_studio-1.2.0/tests/fixtures/pictures/dry-run.json +4 -0
- yap_studio-1.2.0/tests/fixtures/pictures/price.json +9 -0
- yap_studio-1.2.0/tests/fixtures/pictures/run.json +38 -0
- yap_studio-1.2.0/tests/fixtures/stock/101.json +46 -0
- yap_studio-1.2.0/tests/fixtures/stock/102.json +46 -0
- yap_studio-1.2.0/tests/fixtures/stock/103.json +46 -0
- yap_studio-1.2.0/tests/fixtures/stock/104.json +46 -0
- yap_studio-1.2.0/tests/fixtures/stock/105.json +46 -0
- yap_studio-1.2.0/tests/fixtures/stock/large.json +218 -0
- yap_studio-1.2.0/tests/fixtures/stock/portrait.json +177 -0
- yap_studio-1.2.0/tests/fixtures/top_text_browser.mjs +140 -0
- yap_studio-1.2.0/tests/fixtures/wide_card_probe.mjs +76 -0
- yap_studio-1.2.0/tests/fixtures/youtube_chapters_browser.mjs +41 -0
- yap_studio-1.2.0/tests/hygiene_patterns.py +73 -0
- yap_studio-1.2.0/tests/js/caption-ports.test.mjs +117 -0
- yap_studio-1.2.0/tests/js/caption-spoken.test.mjs +25 -0
- yap_studio-1.2.0/tests/js/card-motion.test.mjs +161 -0
- yap_studio-1.2.0/tests/js/fresh-user-browser.mjs +140 -0
- yap_studio-1.2.0/tests/js/fresh-user-fixes.test.mjs +60 -0
- yap_studio-1.2.0/tests/js/gallery-choices.test.mjs +1257 -0
- yap_studio-1.2.0/tests/js/gallery-flow.test.mjs +4854 -0
- yap_studio-1.2.0/tests/js/gallery-pick.test.mjs +275 -0
- yap_studio-1.2.0/tests/js/home-browser.mjs +170 -0
- yap_studio-1.2.0/tests/js/home-model.test.mjs +305 -0
- yap_studio-1.2.0/tests/js/learned.test.mjs +464 -0
- yap_studio-1.2.0/tests/js/looks.test.mjs +820 -0
- yap_studio-1.2.0/tests/js/outline.test.mjs +96 -0
- yap_studio-1.2.0/tests/js/phrases.test.mjs +87 -0
- yap_studio-1.2.0/tests/js/privacy.test.mjs +134 -0
- yap_studio-1.2.0/tests/js/review-approval.test.mjs +116 -0
- yap_studio-1.2.0/tests/js/review-caption-browser.mjs +119 -0
- yap_studio-1.2.0/tests/js/review-copy.test.mjs +152 -0
- yap_studio-1.2.0/tests/js/review-cut.test.mjs +531 -0
- yap_studio-1.2.0/tests/js/review-join-browser.mjs +101 -0
- yap_studio-1.2.0/tests/js/review-list.test.mjs +259 -0
- yap_studio-1.2.0/tests/js/review-pin-browser.mjs +206 -0
- yap_studio-1.2.0/tests/js/review-pin.test.mjs +801 -0
- yap_studio-1.2.0/tests/js/style-frame.test.mjs +121 -0
- yap_studio-1.2.0/tests/js/taste.test.mjs +581 -0
- yap_studio-1.2.0/tests/js/text-hook.test.mjs +60 -0
- yap_studio-1.2.0/tests/js/timeline.test.mjs +2062 -0
- yap_studio-1.2.0/tests/js/top-text.test.mjs +36 -0
- yap_studio-1.2.0/tests/offline_renderer.py +68 -0
- yap_studio-1.2.0/tests/pictures_helpers.py +14 -0
- yap_studio-1.2.0/tests/release_notes.py +13 -0
- yap_studio-1.2.0/tests/synth.py +1966 -0
- yap_studio-1.2.0/tests/synth_broll.py +120 -0
- yap_studio-1.2.0/tests/taste_finals.py +606 -0
- yap_studio-1.2.0/tests/test_anchors.py +48 -0
- yap_studio-1.2.0/tests/test_answers_brand.py +309 -0
- yap_studio-1.2.0/tests/test_asr_exit.py +56 -0
- yap_studio-1.2.0/tests/test_assemble.py +3964 -0
- yap_studio-1.2.0/tests/test_assemble_audio.py +493 -0
- yap_studio-1.2.0/tests/test_assemble_picture.py +3206 -0
- yap_studio-1.2.0/tests/test_attribution.py +221 -0
- yap_studio-1.2.0/tests/test_audio.py +281 -0
- yap_studio-1.2.0/tests/test_audio_chain.py +158 -0
- yap_studio-1.2.0/tests/test_backends.py +1342 -0
- yap_studio-1.2.0/tests/test_background_timeline.py +148 -0
- yap_studio-1.2.0/tests/test_beats.py +246 -0
- yap_studio-1.2.0/tests/test_bleep.py +563 -0
- yap_studio-1.2.0/tests/test_brand.py +396 -0
- yap_studio-1.2.0/tests/test_brand_words.py +71 -0
- yap_studio-1.2.0/tests/test_broll_e2e.py +149 -0
- yap_studio-1.2.0/tests/test_broll_limits.py +165 -0
- yap_studio-1.2.0/tests/test_broll_loop.py +393 -0
- yap_studio-1.2.0/tests/test_broll_match.py +1046 -0
- yap_studio-1.2.0/tests/test_broll_split.py +515 -0
- yap_studio-1.2.0/tests/test_cache.py +84 -0
- yap_studio-1.2.0/tests/test_calibration.py +238 -0
- yap_studio-1.2.0/tests/test_camera3d.py +1304 -0
- yap_studio-1.2.0/tests/test_camera3d_look.py +1538 -0
- yap_studio-1.2.0/tests/test_caption_backing.py +520 -0
- yap_studio-1.2.0/tests/test_caption_case.py +156 -0
- yap_studio-1.2.0/tests/test_caption_contrast.py +649 -0
- yap_studio-1.2.0/tests/test_caption_contrast_render.py +87 -0
- yap_studio-1.2.0/tests/test_caption_layout_checks.py +682 -0
- yap_studio-1.2.0/tests/test_caption_layout_render.py +162 -0
- yap_studio-1.2.0/tests/test_caption_legibility.py +202 -0
- yap_studio-1.2.0/tests/test_caption_placement_render.py +68 -0
- yap_studio-1.2.0/tests/test_caption_registry_ports.py +319 -0
- yap_studio-1.2.0/tests/test_caption_rise.py +237 -0
- yap_studio-1.2.0/tests/test_caption_rise_render.py +179 -0
- yap_studio-1.2.0/tests/test_caption_spoken.py +146 -0
- yap_studio-1.2.0/tests/test_caption_spoken_render.py +85 -0
- yap_studio-1.2.0/tests/test_caption_words.py +404 -0
- yap_studio-1.2.0/tests/test_captions.py +408 -0
- yap_studio-1.2.0/tests/test_captions_ground.py +282 -0
- yap_studio-1.2.0/tests/test_captions_render.py +2156 -0
- yap_studio-1.2.0/tests/test_card_motion.py +287 -0
- yap_studio-1.2.0/tests/test_card_motion_render.py +365 -0
- yap_studio-1.2.0/tests/test_card_project.py +68 -0
- yap_studio-1.2.0/tests/test_cards.py +6588 -0
- yap_studio-1.2.0/tests/test_cards_render.py +2168 -0
- yap_studio-1.2.0/tests/test_chapters.py +248 -0
- yap_studio-1.2.0/tests/test_chapters_render.py +210 -0
- yap_studio-1.2.0/tests/test_ci_release_gate.py +174 -0
- yap_studio-1.2.0/tests/test_ci_shards.py +141 -0
- yap_studio-1.2.0/tests/test_cli.py +487 -0
- yap_studio-1.2.0/tests/test_cli_captions.py +1292 -0
- yap_studio-1.2.0/tests/test_cli_cut.py +195 -0
- yap_studio-1.2.0/tests/test_cli_faces.py +763 -0
- yap_studio-1.2.0/tests/test_cli_fillers.py +431 -0
- yap_studio-1.2.0/tests/test_cli_ingest.py +181 -0
- yap_studio-1.2.0/tests/test_cli_matte.py +477 -0
- yap_studio-1.2.0/tests/test_cli_planner.py +333 -0
- yap_studio-1.2.0/tests/test_cli_review.py +717 -0
- yap_studio-1.2.0/tests/test_cli_taste.py +666 -0
- yap_studio-1.2.0/tests/test_cli_timeline.py +190 -0
- yap_studio-1.2.0/tests/test_cli_verify.py +201 -0
- yap_studio-1.2.0/tests/test_coverage.py +157 -0
- yap_studio-1.2.0/tests/test_covers_cli.py +194 -0
- yap_studio-1.2.0/tests/test_covers_layout.py +514 -0
- yap_studio-1.2.0/tests/test_covers_pick.py +187 -0
- yap_studio-1.2.0/tests/test_covers_render.py +228 -0
- yap_studio-1.2.0/tests/test_covers_wide.py +621 -0
- yap_studio-1.2.0/tests/test_cut.py +2279 -0
- yap_studio-1.2.0/tests/test_declared.py +244 -0
- yap_studio-1.2.0/tests/test_detect.py +769 -0
- yap_studio-1.2.0/tests/test_edges.py +1031 -0
- yap_studio-1.2.0/tests/test_edit_schema.py +63 -0
- yap_studio-1.2.0/tests/test_editor_cards.py +231 -0
- yap_studio-1.2.0/tests/test_edl.py +505 -0
- yap_studio-1.2.0/tests/test_engine_child.py +474 -0
- yap_studio-1.2.0/tests/test_errors.py +315 -0
- yap_studio-1.2.0/tests/test_exit.py +319 -0
- yap_studio-1.2.0/tests/test_eyedropper_command.py +81 -0
- yap_studio-1.2.0/tests/test_face_clearance_check.py +505 -0
- yap_studio-1.2.0/tests/test_faces_caption_modes.py +271 -0
- yap_studio-1.2.0/tests/test_faces_clearance.py +758 -0
- yap_studio-1.2.0/tests/test_faces_detect.py +931 -0
- yap_studio-1.2.0/tests/test_faces_final.py +92 -0
- yap_studio-1.2.0/tests/test_faces_mapping.py +217 -0
- yap_studio-1.2.0/tests/test_faces_placement.py +460 -0
- yap_studio-1.2.0/tests/test_faces_project.py +155 -0
- yap_studio-1.2.0/tests/test_fcpxml.py +242 -0
- yap_studio-1.2.0/tests/test_feedback_apply.py +1170 -0
- yap_studio-1.2.0/tests/test_feedback_audio.py +376 -0
- yap_studio-1.2.0/tests/test_feedback_batch.py +776 -0
- yap_studio-1.2.0/tests/test_feedback_broll.py +461 -0
- yap_studio-1.2.0/tests/test_feedback_clarify.py +314 -0
- yap_studio-1.2.0/tests/test_feedback_cli.py +601 -0
- yap_studio-1.2.0/tests/test_feedback_edits.py +1128 -0
- yap_studio-1.2.0/tests/test_feedback_keeps.py +403 -0
- yap_studio-1.2.0/tests/test_feedback_locate.py +104 -0
- yap_studio-1.2.0/tests/test_feedback_moments.py +152 -0
- yap_studio-1.2.0/tests/test_feedback_outline.py +769 -0
- yap_studio-1.2.0/tests/test_feedback_pins.py +556 -0
- yap_studio-1.2.0/tests/test_feedback_release.py +377 -0
- yap_studio-1.2.0/tests/test_feedback_removed.py +160 -0
- yap_studio-1.2.0/tests/test_feedback_replies.py +799 -0
- yap_studio-1.2.0/tests/test_feedback_spelling.py +437 -0
- yap_studio-1.2.0/tests/test_feedback_versions.py +998 -0
- yap_studio-1.2.0/tests/test_ffmpeg.py +712 -0
- yap_studio-1.2.0/tests/test_file_drop.py +651 -0
- yap_studio-1.2.0/tests/test_fillers.py +3081 -0
- yap_studio-1.2.0/tests/test_fillers_gold.py +777 -0
- yap_studio-1.2.0/tests/test_fillers_rules.py +720 -0
- yap_studio-1.2.0/tests/test_flash.py +787 -0
- yap_studio-1.2.0/tests/test_fonts.py +344 -0
- yap_studio-1.2.0/tests/test_fresh_user_browser.py +88 -0
- yap_studio-1.2.0/tests/test_fresh_user_fixes.py +157 -0
- yap_studio-1.2.0/tests/test_gallery_cutout.py +211 -0
- yap_studio-1.2.0/tests/test_gallery_live.py +543 -0
- yap_studio-1.2.0/tests/test_gallery_pick.py +2200 -0
- yap_studio-1.2.0/tests/test_gallery_still.py +638 -0
- yap_studio-1.2.0/tests/test_grade.py +129 -0
- yap_studio-1.2.0/tests/test_grade_caption_contrast.py +135 -0
- yap_studio-1.2.0/tests/test_grade_command.py +52 -0
- yap_studio-1.2.0/tests/test_grade_compare.py +85 -0
- yap_studio-1.2.0/tests/test_grade_compare_timeline.py +150 -0
- yap_studio-1.2.0/tests/test_grade_eyedropper.py +92 -0
- yap_studio-1.2.0/tests/test_grade_schemas.py +57 -0
- yap_studio-1.2.0/tests/test_graphics_clearance.py +898 -0
- yap_studio-1.2.0/tests/test_green_screen.py +450 -0
- yap_studio-1.2.0/tests/test_hdr.py +361 -0
- yap_studio-1.2.0/tests/test_hf_registry.py +690 -0
- yap_studio-1.2.0/tests/test_hf_registry_cards.py +854 -0
- yap_studio-1.2.0/tests/test_hf_registry_cards_render.py +383 -0
- yap_studio-1.2.0/tests/test_hf_registry_cli.py +106 -0
- yap_studio-1.2.0/tests/test_hf_registry_render.py +171 -0
- yap_studio-1.2.0/tests/test_home_bridge.py +703 -0
- yap_studio-1.2.0/tests/test_home_browser.py +65 -0
- yap_studio-1.2.0/tests/test_home_command.py +151 -0
- yap_studio-1.2.0/tests/test_home_link.py +154 -0
- yap_studio-1.2.0/tests/test_home_server.py +680 -0
- yap_studio-1.2.0/tests/test_home_state.py +422 -0
- yap_studio-1.2.0/tests/test_hygiene.py +117 -0
- yap_studio-1.2.0/tests/test_hyperframes_bump.py +738 -0
- yap_studio-1.2.0/tests/test_ingest.py +1388 -0
- yap_studio-1.2.0/tests/test_install_info.py +271 -0
- yap_studio-1.2.0/tests/test_isolated.py +361 -0
- yap_studio-1.2.0/tests/test_jiggle_delete.py +221 -0
- yap_studio-1.2.0/tests/test_joins.py +3246 -0
- yap_studio-1.2.0/tests/test_joins_cards.py +294 -0
- yap_studio-1.2.0/tests/test_kept_words.py +304 -0
- yap_studio-1.2.0/tests/test_landscape.py +322 -0
- yap_studio-1.2.0/tests/test_layer_checks.py +749 -0
- yap_studio-1.2.0/tests/test_leftovers.py +368 -0
- yap_studio-1.2.0/tests/test_letters.py +488 -0
- yap_studio-1.2.0/tests/test_letters_render.py +234 -0
- yap_studio-1.2.0/tests/test_local_http.py +39 -0
- yap_studio-1.2.0/tests/test_matte_check.py +716 -0
- yap_studio-1.2.0/tests/test_matte_chroma.py +267 -0
- yap_studio-1.2.0/tests/test_matte_composite.py +677 -0
- yap_studio-1.2.0/tests/test_matte_edge_colour.py +368 -0
- yap_studio-1.2.0/tests/test_matte_hyperframes.py +563 -0
- yap_studio-1.2.0/tests/test_matte_make.py +583 -0
- yap_studio-1.2.0/tests/test_matte_model.py +288 -0
- yap_studio-1.2.0/tests/test_matte_project.py +627 -0
- yap_studio-1.2.0/tests/test_matte_refine.py +270 -0
- yap_studio-1.2.0/tests/test_matte_timing.py +85 -0
- yap_studio-1.2.0/tests/test_mcp.py +290 -0
- yap_studio-1.2.0/tests/test_media_album.py +572 -0
- yap_studio-1.2.0/tests/test_media_captured.py +373 -0
- yap_studio-1.2.0/tests/test_media_catalog.py +900 -0
- yap_studio-1.2.0/tests/test_media_describe.py +268 -0
- yap_studio-1.2.0/tests/test_media_frame.py +24 -0
- yap_studio-1.2.0/tests/test_media_inventory.py +872 -0
- yap_studio-1.2.0/tests/test_media_select.py +812 -0
- yap_studio-1.2.0/tests/test_media_sheet.py +836 -0
- yap_studio-1.2.0/tests/test_media_sound.py +206 -0
- yap_studio-1.2.0/tests/test_moment_clones.py +569 -0
- yap_studio-1.2.0/tests/test_moment_picture.py +166 -0
- yap_studio-1.2.0/tests/test_moment_receipts.py +150 -0
- yap_studio-1.2.0/tests/test_moment_timeline.py +263 -0
- yap_studio-1.2.0/tests/test_moments.py +129 -0
- yap_studio-1.2.0/tests/test_music_elevenlabs.py +604 -0
- yap_studio-1.2.0/tests/test_music_file.py +625 -0
- yap_studio-1.2.0/tests/test_number_behind.py +387 -0
- yap_studio-1.2.0/tests/test_number_stages.py +492 -0
- yap_studio-1.2.0/tests/test_opening_push.py +82 -0
- yap_studio-1.2.0/tests/test_outline_server.py +386 -0
- yap_studio-1.2.0/tests/test_overlay_timeline.py +308 -0
- yap_studio-1.2.0/tests/test_owner_folders.py +1369 -0
- yap_studio-1.2.0/tests/test_paths.py +1173 -0
- yap_studio-1.2.0/tests/test_pause_threshold.py +235 -0
- yap_studio-1.2.0/tests/test_pictures_guard.py +283 -0
- yap_studio-1.2.0/tests/test_pictures_imagery.py +174 -0
- yap_studio-1.2.0/tests/test_pictures_make.py +359 -0
- yap_studio-1.2.0/tests/test_pictures_provider.py +175 -0
- yap_studio-1.2.0/tests/test_pictures_review.py +677 -0
- yap_studio-1.2.0/tests/test_pictures_sheet.py +176 -0
- yap_studio-1.2.0/tests/test_plan.py +192 -0
- yap_studio-1.2.0/tests/test_planner_anchors.py +110 -0
- yap_studio-1.2.0/tests/test_planner_broll.py +1071 -0
- yap_studio-1.2.0/tests/test_planner_cards.py +1882 -0
- yap_studio-1.2.0/tests/test_platform.py +217 -0
- yap_studio-1.2.0/tests/test_plugins.py +151 -0
- yap_studio-1.2.0/tests/test_presets.py +174 -0
- yap_studio-1.2.0/tests/test_privacy.py +177 -0
- yap_studio-1.2.0/tests/test_process.py +31 -0
- yap_studio-1.2.0/tests/test_product_feedback.py +476 -0
- yap_studio-1.2.0/tests/test_project.py +579 -0
- yap_studio-1.2.0/tests/test_readme.py +137 -0
- yap_studio-1.2.0/tests/test_rebase.py +1180 -0
- yap_studio-1.2.0/tests/test_receipt.py +80 -0
- yap_studio-1.2.0/tests/test_registry.py +118 -0
- yap_studio-1.2.0/tests/test_registry_scanner.py +206 -0
- yap_studio-1.2.0/tests/test_release.py +556 -0
- yap_studio-1.2.0/tests/test_release_check_scope.py +124 -0
- yap_studio-1.2.0/tests/test_relisten.py +1053 -0
- yap_studio-1.2.0/tests/test_render.py +2622 -0
- yap_studio-1.2.0/tests/test_repeats.py +192 -0
- yap_studio-1.2.0/tests/test_report.py +379 -0
- yap_studio-1.2.0/tests/test_review_caption_fix.py +462 -0
- yap_studio-1.2.0/tests/test_review_detach.py +455 -0
- yap_studio-1.2.0/tests/test_review_export.py +643 -0
- yap_studio-1.2.0/tests/test_review_findings.py +865 -0
- yap_studio-1.2.0/tests/test_review_join_findings.py +201 -0
- yap_studio-1.2.0/tests/test_review_js.py +228 -0
- yap_studio-1.2.0/tests/test_review_map.py +184 -0
- yap_studio-1.2.0/tests/test_review_media.py +366 -0
- yap_studio-1.2.0/tests/test_review_model.py +749 -0
- yap_studio-1.2.0/tests/test_review_phone.py +477 -0
- yap_studio-1.2.0/tests/test_review_pin_browser.py +110 -0
- yap_studio-1.2.0/tests/test_review_rounds.py +492 -0
- yap_studio-1.2.0/tests/test_review_series.py +287 -0
- yap_studio-1.2.0/tests/test_review_server.py +2720 -0
- yap_studio-1.2.0/tests/test_review_store.py +826 -0
- yap_studio-1.2.0/tests/test_review_taste.py +280 -0
- yap_studio-1.2.0/tests/test_run.py +771 -0
- yap_studio-1.2.0/tests/test_run_detach.py +932 -0
- yap_studio-1.2.0/tests/test_scripts.py +66 -0
- yap_studio-1.2.0/tests/test_setup_checks.py +91 -0
- yap_studio-1.2.0/tests/test_sfx.py +784 -0
- yap_studio-1.2.0/tests/test_sfx_extras.py +522 -0
- yap_studio-1.2.0/tests/test_sfx_made.py +413 -0
- yap_studio-1.2.0/tests/test_smooth_joins.py +761 -0
- yap_studio-1.2.0/tests/test_spans.py +252 -0
- yap_studio-1.2.0/tests/test_stage_captions.py +2600 -0
- yap_studio-1.2.0/tests/test_stage_fingerprints.py +249 -0
- yap_studio-1.2.0/tests/test_stage_graphics.py +2217 -0
- yap_studio-1.2.0/tests/test_status.py +2042 -0
- yap_studio-1.2.0/tests/test_step_in.py +181 -0
- yap_studio-1.2.0/tests/test_stock_get.py +466 -0
- yap_studio-1.2.0/tests/test_stock_guard_cards.py +367 -0
- yap_studio-1.2.0/tests/test_stock_provider.py +400 -0
- yap_studio-1.2.0/tests/test_stock_sheet.py +452 -0
- yap_studio-1.2.0/tests/test_storyboard.py +354 -0
- yap_studio-1.2.0/tests/test_structure.py +1325 -0
- yap_studio-1.2.0/tests/test_studio_export.py +788 -0
- yap_studio-1.2.0/tests/test_style.py +841 -0
- yap_studio-1.2.0/tests/test_style_answers.py +495 -0
- yap_studio-1.2.0/tests/test_style_broll.py +332 -0
- yap_studio-1.2.0/tests/test_style_caption_ground.py +135 -0
- yap_studio-1.2.0/tests/test_style_giant.py +211 -0
- yap_studio-1.2.0/tests/test_style_page.py +292 -0
- yap_studio-1.2.0/tests/test_style_pick_detach.py +443 -0
- yap_studio-1.2.0/tests/test_style_save.py +620 -0
- yap_studio-1.2.0/tests/test_sync.py +732 -0
- yap_studio-1.2.0/tests/test_synth.py +326 -0
- yap_studio-1.2.0/tests/test_take_levels.py +501 -0
- yap_studio-1.2.0/tests/test_tall_box.py +520 -0
- yap_studio-1.2.0/tests/test_taste.py +1334 -0
- yap_studio-1.2.0/tests/test_taste_check.py +662 -0
- yap_studio-1.2.0/tests/test_taste_inbox.py +583 -0
- yap_studio-1.2.0/tests/test_taste_learn.py +3360 -0
- yap_studio-1.2.0/tests/test_taste_learned.py +166 -0
- yap_studio-1.2.0/tests/test_taste_render.py +1173 -0
- yap_studio-1.2.0/tests/test_templates_cli.py +857 -0
- yap_studio-1.2.0/tests/test_templates_command.py +445 -0
- yap_studio-1.2.0/tests/test_text_hook.py +192 -0
- yap_studio-1.2.0/tests/test_text_hook_overlaps.py +291 -0
- yap_studio-1.2.0/tests/test_text_hook_surfaces.py +72 -0
- yap_studio-1.2.0/tests/test_text_rules.py +181 -0
- yap_studio-1.2.0/tests/test_timeline.py +2826 -0
- yap_studio-1.2.0/tests/test_timeline_broll_facts.py +194 -0
- yap_studio-1.2.0/tests/test_title_looks.py +761 -0
- yap_studio-1.2.0/tests/test_tools.py +558 -0
- yap_studio-1.2.0/tests/test_top_text.py +207 -0
- yap_studio-1.2.0/tests/test_top_text_browser.py +57 -0
- yap_studio-1.2.0/tests/test_transcript.py +154 -0
- yap_studio-1.2.0/tests/test_transcript_shared.py +438 -0
- yap_studio-1.2.0/tests/test_transcript_take_job.py +259 -0
- yap_studio-1.2.0/tests/test_transitions.py +213 -0
- yap_studio-1.2.0/tests/test_verify.py +1320 -0
- yap_studio-1.2.0/tests/test_verify_eyedropper.py +54 -0
- yap_studio-1.2.0/tests/test_verify_grade.py +228 -0
- yap_studio-1.2.0/tests/test_verify_grade_limit.py +202 -0
- yap_studio-1.2.0/tests/test_video.py +494 -0
- yap_studio-1.2.0/tests/test_video_kinds.py +426 -0
- yap_studio-1.2.0/tests/test_video_type.py +392 -0
- yap_studio-1.2.0/tests/test_voiceover.py +354 -0
- yap_studio-1.2.0/tests/test_watch_findings.py +689 -0
- yap_studio-1.2.0/tests/test_watch_images.py +175 -0
- yap_studio-1.2.0/tests/test_watch_pack.py +1040 -0
- yap_studio-1.2.0/tests/test_watch_publish.py +563 -0
- yap_studio-1.2.0/tests/test_watch_scan.py +748 -0
- yap_studio-1.2.0/tests/test_wide_broll.py +331 -0
- yap_studio-1.2.0/tests/test_wide_broll_review.py +247 -0
- yap_studio-1.2.0/tests/test_wide_cards.py +640 -0
- yap_studio-1.2.0/tests/test_wide_titles.py +383 -0
- yap_studio-1.2.0/tests/test_word_fixes.py +248 -0
- yap_studio-1.2.0/tests/test_words.py +92 -0
- yap_studio-1.2.0/tests/test_workspace.py +3220 -0
- yap_studio-1.2.0/tests/test_workspace_update.py +352 -0
- yap_studio-1.2.0/tests/test_xmeml.py +413 -0
- yap_studio-1.2.0/tests/test_youtube_chapters.py +66 -0
- yap_studio-1.2.0/tests/test_youtube_chapters_browser.py +98 -0
- yap_studio-1.2.0/tests/test_zoom_curve.py +311 -0
- yap_studio-1.2.0/uv.lock +1823 -0
- yap_studio-1.2.0/workspace/.claude/commands/edit.md +17 -0
- yap_studio-1.2.0/workspace/.claude/settings.json +10 -0
- yap_studio-1.2.0/workspace/.claude/skills/edit-video/SKILL.md +484 -0
- yap_studio-1.2.0/workspace/.claude/skills/voiceover-video/SKILL.md +154 -0
- yap_studio-1.2.0/workspace/.codex/config.toml +14 -0
- yap_studio-1.2.0/workspace/.codex/rules/yap-studio.rules +13 -0
- yap_studio-1.2.0/workspace/.cursor/cli.json +9 -0
- yap_studio-1.2.0/workspace/.cursor/permissions.json +15 -0
- yap_studio-1.2.0/workspace/AGENTS.md +316 -0
- yap_studio-1.2.0/workspace/CLAUDE.md +1 -0
- yap_studio-1.2.0/workspace/Start here.html +136 -0
- yap_studio-1.2.0/workspace/brand/fonts/README.md +1 -0
- yap_studio-1.2.0/workspace/inbox/README.md +1 -0
- yap_studio-1.2.0/workspace/new_project.py +493 -0
- yap_studio-1.2.0/workspace/setup.py +855 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yap-studio",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Yap Studio"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "yap-studio",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./plugins/yap-studio"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yap-studio",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Cathryn Lavery"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "Checks every cut in a finished video: clicks, sync, frames, loudness and platform rules.",
|
|
8
|
+
"version": "1.2.0"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
{
|
|
12
|
+
"name": "yap-studio",
|
|
13
|
+
"description": "Checks every cut in a finished video: clicks, sync, frames, loudness and platform rules.",
|
|
14
|
+
"version": "1.2.0",
|
|
15
|
+
"source": "./plugins/yap-studio"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: cathrynlavery
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a reproducible problem
|
|
4
|
+
title: ""
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What happened
|
|
10
|
+
|
|
11
|
+
Describe the problem and what you expected.
|
|
12
|
+
|
|
13
|
+
## How to reproduce
|
|
14
|
+
|
|
15
|
+
List the commands or steps. Use synthetic media where possible. Do not attach
|
|
16
|
+
private footage, transcripts or taste files.
|
|
17
|
+
|
|
18
|
+
## Environment
|
|
19
|
+
|
|
20
|
+
Include `yap-studio --version`, operating system, and `yap-studio doctor` output.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest a change to the editing or review flow
|
|
4
|
+
title: ""
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem
|
|
10
|
+
|
|
11
|
+
What is hard to do today?
|
|
12
|
+
|
|
13
|
+
## Proposed behavior
|
|
14
|
+
|
|
15
|
+
Describe the command or review step and the result you need.
|
|
16
|
+
|
|
17
|
+
## Example
|
|
18
|
+
|
|
19
|
+
Give a small synthetic example if it helps explain the request.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Product feedback
|
|
3
|
+
about: A scrubbed note from real use
|
|
4
|
+
title: ""
|
|
5
|
+
labels: feedback
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Product feedback
|
|
10
|
+
|
|
11
|
+
Describe the tool problem only. Do not include footage, transcripts, spoken words,
|
|
12
|
+
names, file names, paths or secrets.
|
|
13
|
+
|
|
14
|
+
## Environment
|
|
15
|
+
|
|
16
|
+
Time (UTC):
|
|
17
|
+
Yap Studio version:
|
|
18
|
+
macOS version:
|
|
19
|
+
CPU arch:
|
|
20
|
+
Step:
|
|
21
|
+
Code:
|
|
22
|
+
Kind:
|
|
23
|
+
Agent:
|
|
24
|
+
Count:
|
|
25
|
+
|
|
26
|
+
Fingerprint:
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Related issue (if any):
|
|
2
|
+
|
|
3
|
+
## What this does
|
|
4
|
+
|
|
5
|
+
Describe the behavior and the files it changes.
|
|
6
|
+
|
|
7
|
+
## Acceptance
|
|
8
|
+
|
|
9
|
+
State how you checked the behavior, including a synthetic example when useful.
|
|
10
|
+
|
|
11
|
+
## Gates
|
|
12
|
+
|
|
13
|
+
- `uv run ruff check src tests`:
|
|
14
|
+
- `uv run pytest -q -p no:cacheprovider -n 4 -m "not render"`:
|
|
15
|
+
- `node --test tests/js/*.mjs`:
|
|
16
|
+
- Render suite, if applicable:
|
|
17
|
+
|
|
18
|
+
## What is left
|
|
19
|
+
|
|
20
|
+
List follow-up work or write "None."
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
{
|
|
2
|
+
"render": [
|
|
3
|
+
".github/workflows/release-checks.yml",
|
|
4
|
+
".github/release-check-paths.json",
|
|
5
|
+
"scripts/release_check_scope.py",
|
|
6
|
+
"pyproject.toml",
|
|
7
|
+
"uv.lock",
|
|
8
|
+
"tests/conftest.py",
|
|
9
|
+
"tests/synth.py",
|
|
10
|
+
"src/yap_studio/tools.py",
|
|
11
|
+
"src/yap_studio/process.py",
|
|
12
|
+
"src/yap_studio/paths.py",
|
|
13
|
+
"src/yap_studio/ffmpeg.py",
|
|
14
|
+
"src/yap_studio/audio.py",
|
|
15
|
+
"src/yap_studio/templates/*",
|
|
16
|
+
"src/yap_studio/render/*",
|
|
17
|
+
"src/yap_studio/stages/*",
|
|
18
|
+
"src/yap_studio/caption*",
|
|
19
|
+
"src/yap_studio/card*",
|
|
20
|
+
"src/yap_studio/jiggle_cards*",
|
|
21
|
+
"src/yap_studio/editor_cards*",
|
|
22
|
+
"src/yap_studio/file_cards*",
|
|
23
|
+
"src/yap_studio/letters*",
|
|
24
|
+
"src/yap_studio/text_hook*",
|
|
25
|
+
"src/yap_studio/joins/*",
|
|
26
|
+
"src/yap_studio/matte/*",
|
|
27
|
+
"src/yap_studio/faces/*",
|
|
28
|
+
"src/yap_studio/covers/*",
|
|
29
|
+
"src/yap_studio/grade*",
|
|
30
|
+
"src/yap_studio/zoom_curve*",
|
|
31
|
+
"src/yap_studio/hf_registry/*",
|
|
32
|
+
"src/yap_studio/fonts/*",
|
|
33
|
+
"src/yap_studio/hdr*",
|
|
34
|
+
"src/yap_studio/video*",
|
|
35
|
+
"src/yap_studio/gallery/*",
|
|
36
|
+
"src/yap_studio/opening_push*",
|
|
37
|
+
"tests/test_assemble.py",
|
|
38
|
+
"tests/test_assemble_picture.py",
|
|
39
|
+
"tests/test_beats.py",
|
|
40
|
+
"tests/test_brand.py",
|
|
41
|
+
"tests/test_broll_e2e.py",
|
|
42
|
+
"tests/test_camera3d.py",
|
|
43
|
+
"tests/test_camera3d_look.py",
|
|
44
|
+
"tests/test_caption_contrast_render.py",
|
|
45
|
+
"tests/test_caption_layout_render.py",
|
|
46
|
+
"tests/test_caption_legibility.py",
|
|
47
|
+
"tests/test_caption_placement_render.py",
|
|
48
|
+
"tests/test_caption_registry_ports.py",
|
|
49
|
+
"tests/test_caption_rise_render.py",
|
|
50
|
+
"tests/test_caption_spoken_render.py",
|
|
51
|
+
"tests/test_captions_ground.py",
|
|
52
|
+
"tests/test_captions_render.py",
|
|
53
|
+
"tests/test_card_motion_render.py",
|
|
54
|
+
"tests/test_cards_render.py",
|
|
55
|
+
"tests/test_chapters_render.py",
|
|
56
|
+
"tests/test_covers_render.py",
|
|
57
|
+
"tests/test_faces_caption_modes.py",
|
|
58
|
+
"tests/test_file_drop.py",
|
|
59
|
+
"tests/test_gallery_live.py",
|
|
60
|
+
"tests/test_grade_caption_contrast.py",
|
|
61
|
+
"tests/test_hf_registry_cards_render.py",
|
|
62
|
+
"tests/test_hf_registry_render.py",
|
|
63
|
+
"tests/test_letters_render.py",
|
|
64
|
+
"tests/test_media_inventory.py",
|
|
65
|
+
"tests/test_moment_clones.py",
|
|
66
|
+
"tests/test_number_stages.py",
|
|
67
|
+
"tests/test_owner_folders.py",
|
|
68
|
+
"tests/test_planner_cards.py",
|
|
69
|
+
"tests/test_presets.py",
|
|
70
|
+
"tests/test_render.py",
|
|
71
|
+
"tests/test_smooth_joins.py",
|
|
72
|
+
"tests/test_stage_graphics.py",
|
|
73
|
+
"tests/test_studio_export.py",
|
|
74
|
+
"tests/test_tall_box.py",
|
|
75
|
+
"tests/test_taste_check.py",
|
|
76
|
+
"tests/test_taste_learn.py",
|
|
77
|
+
"tests/test_templates_cli.py",
|
|
78
|
+
"tests/test_text_hook.py",
|
|
79
|
+
"tests/test_title_looks.py",
|
|
80
|
+
"tests/test_transitions.py",
|
|
81
|
+
"tests/test_verify_eyedropper.py",
|
|
82
|
+
"tests/test_verify_grade_limit.py",
|
|
83
|
+
"tests/test_voiceover.py"
|
|
84
|
+
],
|
|
85
|
+
"speech": [
|
|
86
|
+
".github/workflows/release-checks.yml",
|
|
87
|
+
".github/release-check-paths.json",
|
|
88
|
+
"scripts/release_check_scope.py",
|
|
89
|
+
"pyproject.toml",
|
|
90
|
+
"uv.lock",
|
|
91
|
+
"tests/conftest.py",
|
|
92
|
+
"tests/synth.py",
|
|
93
|
+
"src/yap_studio/tools.py",
|
|
94
|
+
"src/yap_studio/process.py",
|
|
95
|
+
"src/yap_studio/paths.py",
|
|
96
|
+
"src/yap_studio/ffmpeg.py",
|
|
97
|
+
"src/yap_studio/audio.py",
|
|
98
|
+
"src/yap_studio/transcript/*",
|
|
99
|
+
"src/yap_studio/cli.py",
|
|
100
|
+
"src/yap_studio/stages/ingest.py",
|
|
101
|
+
"src/yap_studio/stages/cut.py",
|
|
102
|
+
"src/yap_studio/stages/fillers.py",
|
|
103
|
+
"src/yap_studio/setup_checks.py",
|
|
104
|
+
"tests/test_transcript*.py",
|
|
105
|
+
"tests/test_backends.py",
|
|
106
|
+
"tests/test_asr*.py",
|
|
107
|
+
"tests/test_asr_exit.py",
|
|
108
|
+
"tests/test_cut.py",
|
|
109
|
+
"tests/test_declared.py",
|
|
110
|
+
"tests/test_fillers.py",
|
|
111
|
+
"tests/test_ingest.py",
|
|
112
|
+
"tests/test_joins.py",
|
|
113
|
+
"tests/test_pause_threshold.py"
|
|
114
|
+
],
|
|
115
|
+
"helpers": [
|
|
116
|
+
".github/workflows/release-checks.yml",
|
|
117
|
+
".github/release-check-paths.json",
|
|
118
|
+
"scripts/release_check_scope.py",
|
|
119
|
+
"pyproject.toml",
|
|
120
|
+
"uv.lock",
|
|
121
|
+
"tests/conftest.py",
|
|
122
|
+
"tests/synth.py",
|
|
123
|
+
"src/yap_studio/tools.py",
|
|
124
|
+
"src/yap_studio/process.py",
|
|
125
|
+
"src/yap_studio/paths.py",
|
|
126
|
+
"src/yap_studio/ffmpeg.py",
|
|
127
|
+
"src/yap_studio/audio.py",
|
|
128
|
+
"src/yap_studio/*.swift",
|
|
129
|
+
"src/yap_studio/faces/*",
|
|
130
|
+
"src/yap_studio/matte/*",
|
|
131
|
+
"src/yap_studio/joins/*",
|
|
132
|
+
"src/yap_studio/gallery/*",
|
|
133
|
+
"src/yap_studio/hdr.py",
|
|
134
|
+
"src/yap_studio/pictures/*",
|
|
135
|
+
"tests/fixtures/*.swift",
|
|
136
|
+
"tests/pictures_helpers.py",
|
|
137
|
+
"tests/test_assemble_picture.py",
|
|
138
|
+
"tests/test_faces_detect.py",
|
|
139
|
+
"tests/test_gallery_cutout.py",
|
|
140
|
+
"tests/test_gallery_still.py",
|
|
141
|
+
"tests/test_hdr.py",
|
|
142
|
+
"tests/test_matte_make.py",
|
|
143
|
+
"tests/test_smooth_joins.py"
|
|
144
|
+
]
|
|
145
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
types: [opened, synchronize, reopened, ready_for_review]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ci-${{ github.event_name == 'pull_request' && github.ref || github.sha }}
|
|
12
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
checks:
|
|
19
|
+
runs-on: macos-15
|
|
20
|
+
if: github.event_name != 'pull_request' || !github.event.pull_request.draft
|
|
21
|
+
timeout-minutes: 15
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v7
|
|
24
|
+
# Test temp stays outside the checkout and home: the engine refuses config folders inside a
|
|
25
|
+
# repository, and the owner-folder guard treats anything under home as the owner's.
|
|
26
|
+
- name: Use the runner temp folder
|
|
27
|
+
run: |
|
|
28
|
+
mkdir -p /private/tmp/yap-ci
|
|
29
|
+
echo "TMPDIR=/private/tmp/yap-ci" >> "$GITHUB_ENV"
|
|
30
|
+
echo "PYTEST_ADDOPTS=--basetemp=/private/tmp/yap-ci/pytest -o tmp_path_retention_policy=failed" >> "$GITHUB_ENV"
|
|
31
|
+
- uses: astral-sh/setup-uv@v10.2.0
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.12"
|
|
34
|
+
enable-cache: true
|
|
35
|
+
- uses: actions/setup-node@v6
|
|
36
|
+
with:
|
|
37
|
+
node-version: "22"
|
|
38
|
+
- run: uv sync --locked
|
|
39
|
+
- run: uv run ruff check .
|
|
40
|
+
- run: node --test tests/js/*.mjs
|
|
41
|
+
- run: uv build
|
|
42
|
+
|
|
43
|
+
tests:
|
|
44
|
+
runs-on: macos-15
|
|
45
|
+
if: github.event_name != 'pull_request' || !github.event.pull_request.draft
|
|
46
|
+
timeout-minutes: 30
|
|
47
|
+
strategy:
|
|
48
|
+
fail-fast: false
|
|
49
|
+
matrix:
|
|
50
|
+
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
51
|
+
env:
|
|
52
|
+
YAP_STUDIO_TEST_SHARD: ${{ matrix.shard }}/10
|
|
53
|
+
# A hung test fails with its traceback instead of stalling the shard.
|
|
54
|
+
YAP_STUDIO_TEST_TIMEOUT: "300"
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v7
|
|
57
|
+
# Test temp stays outside the checkout and home: the engine refuses config folders inside a
|
|
58
|
+
# repository, and the owner-folder guard treats anything under home as the owner's.
|
|
59
|
+
- name: Use the runner temp folder
|
|
60
|
+
run: |
|
|
61
|
+
mkdir -p /private/tmp/yap-ci
|
|
62
|
+
echo "TMPDIR=/private/tmp/yap-ci" >> "$GITHUB_ENV"
|
|
63
|
+
echo "PYTEST_ADDOPTS=--basetemp=/private/tmp/yap-ci/pytest -o tmp_path_retention_policy=failed" >> "$GITHUB_ENV"
|
|
64
|
+
- uses: astral-sh/setup-uv@v10.2.0
|
|
65
|
+
with:
|
|
66
|
+
python-version: "3.12"
|
|
67
|
+
enable-cache: true
|
|
68
|
+
- uses: actions/setup-node@v6
|
|
69
|
+
with:
|
|
70
|
+
node-version: "22"
|
|
71
|
+
- name: Install pin test browser
|
|
72
|
+
run: |
|
|
73
|
+
npm install --prefix "$RUNNER_TEMP/pin-browser" --no-save puppeteer@25.12.0
|
|
74
|
+
echo "YAP_STUDIO_PUPPETEER=$RUNNER_TEMP/pin-browser/node_modules/puppeteer" >> "$GITHUB_ENV"
|
|
75
|
+
node -e 'Promise.resolve(require(process.argv[1]).executablePath()).then((path) => console.log("YAP_STUDIO_CHROME=" + path))' "$RUNNER_TEMP/pin-browser/node_modules/puppeteer" >> "$GITHUB_ENV"
|
|
76
|
+
- name: Install media and speech tools
|
|
77
|
+
# Retry once: bottle downloads occasionally fail on hosted runners.
|
|
78
|
+
run: brew install ffmpeg espeak-ng || { sleep 20; brew install ffmpeg espeak-ng; }
|
|
79
|
+
- run: ffmpeg -version
|
|
80
|
+
- run: uv sync --locked --extra mcp
|
|
81
|
+
- name: Install shared renderer
|
|
82
|
+
run: uv run yap-studio renderer install
|
|
83
|
+
- run: uv cache prune --ci
|
|
84
|
+
# Idle workers take queued tests from busy ones: test_assemble.py alone takes over 30 minutes on one.
|
|
85
|
+
- run: uv run pytest -v -n 3 --dist=worksteal -m "not render and not asr and not helpers" --durations=20 -o faulthandler_timeout=600
|
|
86
|
+
- name: Keep logs from failed tests
|
|
87
|
+
if: failure()
|
|
88
|
+
uses: actions/upload-artifact@v7
|
|
89
|
+
with:
|
|
90
|
+
name: failed-tests-shard-${{ matrix.shard }}
|
|
91
|
+
path: /private/tmp/yap-ci/pytest/**/detached/*
|
|
92
|
+
if-no-files-found: ignore
|
|
93
|
+
retention-days: 7
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
name: HyperFrames bump
|
|
2
|
+
|
|
3
|
+
# Once a day, rebuild one standing draft PR from main that moves the renderer
|
|
4
|
+
# pin to the newest HyperFrames release, and close older bump PRs. The PR waits
|
|
5
|
+
# for a person to check renders and beats.
|
|
6
|
+
on:
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: "23 14 * * *"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
inputs:
|
|
11
|
+
version:
|
|
12
|
+
description: "Release to pin (blank for the newest on npm)"
|
|
13
|
+
required: false
|
|
14
|
+
default: ""
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
group: hyperframes-bump
|
|
18
|
+
cancel-in-progress: false
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
bump:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
timeout-minutes: 20
|
|
27
|
+
permissions:
|
|
28
|
+
contents: write
|
|
29
|
+
pull-requests: write
|
|
30
|
+
actions: write
|
|
31
|
+
env:
|
|
32
|
+
# A token in HYPERFRAMES_BUMP_TOKEN lets the PR start CI by itself. Without
|
|
33
|
+
# it the workflow token opens the PR (allow Actions to create pull requests
|
|
34
|
+
# in Settings > Actions) and this job starts CI on the branch.
|
|
35
|
+
GH_TOKEN: ${{ secrets.HYPERFRAMES_BUMP_TOKEN || github.token }}
|
|
36
|
+
HAS_BUMP_TOKEN: ${{ secrets.HYPERFRAMES_BUMP_TOKEN != '' }}
|
|
37
|
+
REQUESTED: ${{ inputs.version }}
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v7
|
|
40
|
+
with:
|
|
41
|
+
token: ${{ secrets.HYPERFRAMES_BUMP_TOKEN || github.token }}
|
|
42
|
+
- uses: astral-sh/setup-uv@v10.2.0
|
|
43
|
+
with:
|
|
44
|
+
python-version: "3.12"
|
|
45
|
+
enable-cache: true
|
|
46
|
+
- uses: actions/setup-node@v6
|
|
47
|
+
with:
|
|
48
|
+
node-version: "22"
|
|
49
|
+
# npm 10 drops the lock's libc fields; the committed lock is written by npm 11.
|
|
50
|
+
- run: npm install -g npm@11
|
|
51
|
+
- run: uv sync --locked
|
|
52
|
+
|
|
53
|
+
- name: Compare the pin with npm
|
|
54
|
+
id: check
|
|
55
|
+
run: |
|
|
56
|
+
uv run python scripts/bump_hyperframes.py --check ${REQUESTED:+"$REQUESTED"} > check.json
|
|
57
|
+
cat check.json
|
|
58
|
+
python3 - <<'PY' >> "$GITHUB_OUTPUT"
|
|
59
|
+
import json
|
|
60
|
+
check = json.load(open("check.json"))
|
|
61
|
+
print(f"current={check['current']}")
|
|
62
|
+
print(f"latest={check['latest']}")
|
|
63
|
+
print(f"outdated={str(check['outdated']).lower()}")
|
|
64
|
+
PY
|
|
65
|
+
|
|
66
|
+
- name: Skip a release that already has a PR
|
|
67
|
+
id: existing
|
|
68
|
+
if: steps.check.outputs.outdated == 'true'
|
|
69
|
+
env:
|
|
70
|
+
LATEST: ${{ steps.check.outputs.latest }}
|
|
71
|
+
run: |
|
|
72
|
+
# One standing branch and PR, rebuilt from main for each release, so bump PRs never
|
|
73
|
+
# pile up or go stale. Git cannot hold a plain hyperframes-bump branch beside the
|
|
74
|
+
# older hyperframes-bump/<version> branches, so it is hyperframes-bump/latest.
|
|
75
|
+
branch="hyperframes-bump/latest"
|
|
76
|
+
echo "branch=$branch" >> "$GITHUB_OUTPUT"
|
|
77
|
+
closed=$(gh pr list --state closed --head "$branch" --json number,title,mergedAt,isCrossRepository \
|
|
78
|
+
--jq "map(select((.isCrossRepository | not) and .mergedAt == null and .title == \"render: pin HyperFrames $LATEST\")) | .[0].number // empty")
|
|
79
|
+
if [ -n "$closed" ]; then
|
|
80
|
+
echo "PR #$closed for $LATEST was closed without merging; waiting for the next release."
|
|
81
|
+
echo "skip=true" >> "$GITHUB_OUTPUT"
|
|
82
|
+
exit 0
|
|
83
|
+
fi
|
|
84
|
+
pr=$(gh pr list --state open --head "$branch" --json number,isCrossRepository \
|
|
85
|
+
--jq 'map(select(.isCrossRepository | not)) | .[0].number // empty')
|
|
86
|
+
echo "pr=$pr" >> "$GITHUB_OUTPUT"
|
|
87
|
+
# The push only replaces this head, so a commit pushed after the check below is kept.
|
|
88
|
+
head=$(git ls-remote origin "refs/heads/$branch")
|
|
89
|
+
echo "head=${head%%[[:space:]]*}" >> "$GITHUB_OUTPUT"
|
|
90
|
+
title=""
|
|
91
|
+
if [ -n "$pr" ]; then
|
|
92
|
+
# A rebuild replaces the branch, so it must not drop a commit a person pushed.
|
|
93
|
+
people=$(gh pr view "$pr" --json commits \
|
|
94
|
+
--jq '[.commits[].authors[].email | select(. != "41898282+github-actions[bot]@users.noreply.github.com")] | length')
|
|
95
|
+
if [ "$people" != 0 ]; then
|
|
96
|
+
echo "::warning::PR #$pr has commits from people, so it was not rebuilt for HyperFrames $LATEST. Merge or close it to let the next run continue."
|
|
97
|
+
echo "skip=true" >> "$GITHUB_OUTPUT"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
title=$(gh pr view "$pr" --json title --jq .title)
|
|
101
|
+
fi
|
|
102
|
+
# Every open PR (not just the first page), read at its head commit in its own repository,
|
|
103
|
+
# so a fork or an older branch that already pins this release is found.
|
|
104
|
+
gh pr list --state open --limit 1000 \
|
|
105
|
+
--json number,headRefName,headRefOid,headRepository,headRepositoryOwner,mergeable \
|
|
106
|
+
--jq '.[] | "\(.number) \(.headRepositoryOwner.login)/\(.headRepository.name) \(.headRefOid) \(.headRefName) \(.mergeable)"' > open-prs.txt
|
|
107
|
+
standing="" other=""
|
|
108
|
+
while read -r number repo sha ref mergeable; do
|
|
109
|
+
pin=$(gh api --method GET "repos/$repo/contents/src/yap_studio/render/hyperframes.py" \
|
|
110
|
+
-f ref="$sha" --jq .content 2>/dev/null | base64 -d 2>/dev/null || true)
|
|
111
|
+
printf '%s' "$pin" | grep -q "HYPERFRAMES_VERSION = \"$LATEST\"" || continue
|
|
112
|
+
if [ "$number" = "$pr" ]; then
|
|
113
|
+
# Title and body are edited together, so an old title means an unfinished update.
|
|
114
|
+
if [ "$mergeable" = CONFLICTING ] || [ "$title" != "render: pin HyperFrames $LATEST" ]; then
|
|
115
|
+
echo "PR #$number pins $LATEST but conflicts with main or describes an older release."
|
|
116
|
+
standing=rebuild
|
|
117
|
+
else
|
|
118
|
+
standing=current
|
|
119
|
+
fi
|
|
120
|
+
else
|
|
121
|
+
case "$repo/$ref/$mergeable" in
|
|
122
|
+
# This workflow's own PR that conflicts with main is rebuilt instead.
|
|
123
|
+
"$GITHUB_REPOSITORY/hyperframes-bump/"*/CONFLICTING)
|
|
124
|
+
echo "PR #$number pins $LATEST but conflicts with main." ;;
|
|
125
|
+
*) other=$number ;;
|
|
126
|
+
esac
|
|
127
|
+
fi
|
|
128
|
+
done < open-prs.txt
|
|
129
|
+
if [ "$standing" = current ]; then
|
|
130
|
+
echo "PR #$pr already pins $LATEST; only older bump PRs are closed."
|
|
131
|
+
echo "current=true" >> "$GITHUB_OUTPUT"
|
|
132
|
+
echo "skip=true" >> "$GITHUB_OUTPUT"
|
|
133
|
+
elif [ -z "$standing" ] && [ -n "$other" ]; then
|
|
134
|
+
echo "Open PR #$other already pins $LATEST."
|
|
135
|
+
echo "skip=true" >> "$GITHUB_OUTPUT"
|
|
136
|
+
else
|
|
137
|
+
echo "skip=false" >> "$GITHUB_OUTPUT"
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
- name: Bump the pin and write the PR body
|
|
141
|
+
id: bump
|
|
142
|
+
if: steps.check.outputs.outdated == 'true' && steps.existing.outputs.skip == 'false'
|
|
143
|
+
env:
|
|
144
|
+
CURRENT: ${{ steps.check.outputs.current }}
|
|
145
|
+
LATEST: ${{ steps.check.outputs.latest }}
|
|
146
|
+
run: |
|
|
147
|
+
uv run python scripts/bump_hyperframes.py "$LATEST" > bump.json
|
|
148
|
+
cat bump.json
|
|
149
|
+
npm view hyperframes versions --json > versions.json
|
|
150
|
+
python3 - <<'PY'
|
|
151
|
+
import json
|
|
152
|
+
import os
|
|
153
|
+
import re
|
|
154
|
+
import subprocess
|
|
155
|
+
|
|
156
|
+
current, latest = os.environ["CURRENT"], os.environ["LATEST"]
|
|
157
|
+
bump = json.load(open("bump.json"))
|
|
158
|
+
parts = lambda v: tuple(int(p) for p in v.split("."))
|
|
159
|
+
releases = sorted(
|
|
160
|
+
(v for v in json.load(open("versions.json"))
|
|
161
|
+
if re.fullmatch(r"\d+\.\d+\.\d+", v) and parts(current) < parts(v) <= parts(latest)),
|
|
162
|
+
key=parts,
|
|
163
|
+
)
|
|
164
|
+
notes, mentions = [], set()
|
|
165
|
+
watch = {"beats": r"\bbeats?\b", "fonts": r"\bfonts?\b", "captions": r"\bcaptions?\b",
|
|
166
|
+
"hf-seek": r"hf-seek|\bseek\b", "audio": r"\baudio\b", "capture": r"\bcapture\b"}
|
|
167
|
+
for version in releases:
|
|
168
|
+
result = subprocess.run(
|
|
169
|
+
["gh", "release", "view", f"v{version}", "-R", "heygen-com/hyperframes",
|
|
170
|
+
"--json", "body", "--jq", ".body"],
|
|
171
|
+
capture_output=True, text=True, check=False,
|
|
172
|
+
)
|
|
173
|
+
body = result.stdout.strip() or (
|
|
174
|
+
f"No notes found. See https://github.com/heygen-com/hyperframes/releases/tag/v{version}")
|
|
175
|
+
mentions.update(name for name, pattern in watch.items()
|
|
176
|
+
if re.search(pattern, body, re.IGNORECASE))
|
|
177
|
+
# Upstream text is quoted as a literal code block so it cannot render as instructions,
|
|
178
|
+
# links or markup in the draft. The fence is longer than any backtick run inside it.
|
|
179
|
+
quoted = body[:12000]
|
|
180
|
+
fence = "`" * max(3, 1 + max((len(run) for run in re.findall(r"`+", quoted)), default=0))
|
|
181
|
+
notes.append(f"<details><summary>v{version} (upstream release notes, quoted)</summary>\n\n"
|
|
182
|
+
f"{fence}text\n{quoted}\n{fence}\n\n</details>")
|
|
183
|
+
lock = "\n".join(f"- {line}" for line in bump["lock_changes"]) or "- None"
|
|
184
|
+
flagged = ", ".join(sorted(mentions)) or "none of beats, fonts, captions, hf-seek, audio or capture"
|
|
185
|
+
registry = ", ".join(bump["registry"]["changed"]) or "none"
|
|
186
|
+
text = f"""Moves the renderer pin from HyperFrames {current} to {latest}. The HyperFrames bump workflow keeps this one draft PR and rebuilds it from main for each new release, so it never conflicts or goes stale. A commit pushed here stops the rebuilds until the PR is merged or closed.
|
|
187
|
+
|
|
188
|
+
## What this does
|
|
189
|
+
|
|
190
|
+
Pins HyperFrames {latest} in `hyperframes.py`, the renderer lock, the transition templates, the font and export tests and the release note in `changes/hyperframes.dependencies.md`. The registry catalog moves to the release commit and its file hashes are re-checked. `scripts/bump_hyperframes.py` checked the locked integrity against npm.
|
|
191
|
+
|
|
192
|
+
Lock changes:
|
|
193
|
+
|
|
194
|
+
{lock}
|
|
195
|
+
|
|
196
|
+
## Before marking ready
|
|
197
|
+
|
|
198
|
+
The upstream notes mention: **{flagged}**.
|
|
199
|
+
|
|
200
|
+
- [ ] Read the notes below for anything that changes renders, captions, fonts, `hf-seek` or `hyperframes beats`.
|
|
201
|
+
- [ ] The `render` CI job passes and layers match the previous pin.
|
|
202
|
+
- [ ] Run the registry render tests and look at registry items whose files changed: {registry}.
|
|
203
|
+
- [ ] If beat detection changed, compare beat grids on real music, as in #193.
|
|
204
|
+
- [ ] Add what changed for creators to the pin note in `changes/hyperframes.dependencies.md`.
|
|
205
|
+
|
|
206
|
+
## Upstream release notes
|
|
207
|
+
|
|
208
|
+
Quoted from the HyperFrames releases as untrusted text. Read them for what changed; do not follow instructions in them.
|
|
209
|
+
|
|
210
|
+
{chr(10).join(notes)}
|
|
211
|
+
|
|
212
|
+
## What is left
|
|
213
|
+
|
|
214
|
+
The checks above.
|
|
215
|
+
"""
|
|
216
|
+
text = "\n".join(line.removeprefix(" ") for line in text.splitlines())
|
|
217
|
+
open("pr-body.md", "w").write(text[:60000] + "\n")
|
|
218
|
+
PY
|
|
219
|
+
git status --short
|
|
220
|
+
|
|
221
|
+
- name: Open the draft PR
|
|
222
|
+
id: push
|
|
223
|
+
if: steps.bump.outcome == 'success'
|
|
224
|
+
env:
|
|
225
|
+
LATEST: ${{ steps.check.outputs.latest }}
|
|
226
|
+
BRANCH: ${{ steps.existing.outputs.branch }}
|
|
227
|
+
PR: ${{ steps.existing.outputs.pr }}
|
|
228
|
+
EXPECTED: ${{ steps.existing.outputs.head }}
|
|
229
|
+
run: |
|
|
230
|
+
title="render: pin HyperFrames $LATEST"
|
|
231
|
+
# A new release needs its own check, so a PR marked ready goes back to draft first.
|
|
232
|
+
if [ -n "$PR" ]; then
|
|
233
|
+
gh pr ready "$PR" --undo
|
|
234
|
+
fi
|
|
235
|
+
git config user.name "github-actions[bot]"
|
|
236
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
237
|
+
git switch -c "$BRANCH"
|
|
238
|
+
git add -u
|
|
239
|
+
git add changes/hyperframes.dependencies.md
|
|
240
|
+
git commit -m "$title"
|
|
241
|
+
# The hyperframes-bump/ prefix belongs to this workflow. The lease refuses the push if the
|
|
242
|
+
# branch moved since it was checked; an empty EXPECTED means it must not exist yet.
|
|
243
|
+
if ! git push --force-with-lease="refs/heads/$BRANCH:$EXPECTED" origin "HEAD:refs/heads/$BRANCH"; then
|
|
244
|
+
echo "::warning::$BRANCH changed after this run checked it, or the push failed, so nothing was overwritten. The next run checks it again."
|
|
245
|
+
exit 1
|
|
246
|
+
fi
|
|
247
|
+
if [ -n "$PR" ]; then
|
|
248
|
+
gh pr edit "$PR" --title "$title" --body-file pr-body.md
|
|
249
|
+
elif url=$(gh pr create --draft --base main --head "$BRANCH" \
|
|
250
|
+
--title "$title" --body-file pr-body.md); then
|
|
251
|
+
PR=${url##*/}
|
|
252
|
+
else
|
|
253
|
+
echo "::error::Could not open the PR. Allow GitHub Actions to create pull requests in Settings > Actions > General, or add a HYPERFRAMES_BUMP_TOKEN secret."
|
|
254
|
+
exit 1
|
|
255
|
+
fi
|
|
256
|
+
echo "pr=$PR" >> "$GITHUB_OUTPUT"
|
|
257
|
+
if [ "$HAS_BUMP_TOKEN" != "true" ]; then
|
|
258
|
+
gh workflow run ci.yml --ref "$BRANCH"
|
|
259
|
+
fi
|
|
260
|
+
|
|
261
|
+
# Also runs when the standing PR is already current, so a run that stopped early finishes.
|
|
262
|
+
- name: Close older bump PRs
|
|
263
|
+
if: steps.push.outcome == 'success' || steps.existing.outputs.current == 'true'
|
|
264
|
+
env:
|
|
265
|
+
LATEST: ${{ steps.check.outputs.latest }}
|
|
266
|
+
PR: ${{ steps.push.outputs.pr || steps.existing.outputs.pr }}
|
|
267
|
+
run: |
|
|
268
|
+
gh pr list --state open --limit 1000 --json number,headRefName,isCrossRepository \
|
|
269
|
+
--jq ".[] | select((.isCrossRepository | not) and (.headRefName | startswith(\"hyperframes-bump/\")) and .number != $PR) | .number" > superseded.txt
|
|
270
|
+
while read -r old; do
|
|
271
|
+
gh pr close "$old" --comment "Superseded by #$PR, which pins HyperFrames $LATEST."
|
|
272
|
+
done < superseded.txt
|