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.
Files changed (1048) hide show
  1. yap_studio-1.2.0/.agents/plugins/marketplace.json +20 -0
  2. yap_studio-1.2.0/.claude-plugin/marketplace.json +18 -0
  3. yap_studio-1.2.0/.github/FUNDING.yml +1 -0
  4. yap_studio-1.2.0/.github/ISSUE_TEMPLATE/bug.md +20 -0
  5. yap_studio-1.2.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. yap_studio-1.2.0/.github/ISSUE_TEMPLATE/feature.md +19 -0
  7. yap_studio-1.2.0/.github/ISSUE_TEMPLATE/feedback.md +26 -0
  8. yap_studio-1.2.0/.github/pull_request_template.md +20 -0
  9. yap_studio-1.2.0/.github/release-check-paths.json +145 -0
  10. yap_studio-1.2.0/.github/workflows/ci.yml +93 -0
  11. yap_studio-1.2.0/.github/workflows/hyperframes-bump.yml +272 -0
  12. yap_studio-1.2.0/.github/workflows/pypi.yml +46 -0
  13. yap_studio-1.2.0/.github/workflows/release-checks.yml +154 -0
  14. yap_studio-1.2.0/.github/workflows/release.yml +57 -0
  15. yap_studio-1.2.0/.gitignore +49 -0
  16. yap_studio-1.2.0/.python-version +1 -0
  17. yap_studio-1.2.0/CHANGELOG.md +290 -0
  18. yap_studio-1.2.0/CODE_OF_CONDUCT.md +24 -0
  19. yap_studio-1.2.0/CONTRIBUTING.md +94 -0
  20. yap_studio-1.2.0/LICENSE +202 -0
  21. yap_studio-1.2.0/LICENSES/Apache-2.0.txt +202 -0
  22. yap_studio-1.2.0/LICENSES/OFL-alata.txt +93 -0
  23. yap_studio-1.2.0/LICENSES/OFL-antonsc.txt +93 -0
  24. yap_studio-1.2.0/LICENSES/OFL-archivoblack.txt +93 -0
  25. yap_studio-1.2.0/LICENSES/OFL-geist.txt +93 -0
  26. yap_studio-1.2.0/LICENSES/OFL-gelasio.txt +93 -0
  27. yap_studio-1.2.0/LICENSES/OFL-instrumentserif.txt +93 -0
  28. yap_studio-1.2.0/LICENSES/OFL-inter.txt +93 -0
  29. yap_studio-1.2.0/LICENSES/OFL-spacemono.txt +93 -0
  30. yap_studio-1.2.0/LICENSES/OFL-titanone.txt +94 -0
  31. yap_studio-1.2.0/NOTICE +56 -0
  32. yap_studio-1.2.0/PKG-INFO +346 -0
  33. yap_studio-1.2.0/README.md +307 -0
  34. yap_studio-1.2.0/SECURITY.md +11 -0
  35. yap_studio-1.2.0/changes/README.md +17 -0
  36. yap_studio-1.2.0/docs/audio.md +174 -0
  37. yap_studio-1.2.0/docs/camera3d-pilot.md +74 -0
  38. yap_studio-1.2.0/docs/captions-and-cards.md +558 -0
  39. yap_studio-1.2.0/docs/commands.md +122 -0
  40. yap_studio-1.2.0/docs/design/style-page/README.md +101 -0
  41. yap_studio-1.2.0/docs/design/style-page/app.js +1642 -0
  42. yap_studio-1.2.0/docs/design/style-page/caption-ports.css +105 -0
  43. yap_studio-1.2.0/docs/design/style-page/caption-ports.js +237 -0
  44. yap_studio-1.2.0/docs/design/style-page/frame-person.svg +58 -0
  45. yap_studio-1.2.0/docs/design/style-page/frame-room.svg +62 -0
  46. yap_studio-1.2.0/docs/design/style-page/index.html +111 -0
  47. yap_studio-1.2.0/docs/design/style-page/learned.js +179 -0
  48. yap_studio-1.2.0/docs/design/style-page/looks.js +95 -0
  49. yap_studio-1.2.0/docs/design/style-page/phrases.js +170 -0
  50. yap_studio-1.2.0/docs/design/style-page/proposed-presets/order.json +1 -0
  51. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-1-top.webp +0 -0
  52. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-2-full-page.webp +0 -0
  53. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-3-words-on-screen-hover.webp +0 -0
  54. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-4-font.webp +0 -0
  55. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-4b-highlight-none.webp +0 -0
  56. yap_studio-1.2.0/docs/design/style-page/screenshots/desktop-7-preset-switch-undo.webp +0 -0
  57. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-1-top.webp +0 -0
  58. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-2-presets-and-type.webp +0 -0
  59. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-3-highlight.webp +0 -0
  60. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-4-colors.webp +0 -0
  61. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-5-hex-codes.webp +0 -0
  62. yap_studio-1.2.0/docs/design/style-page/screenshots/mobile-6-saved.webp +0 -0
  63. yap_studio-1.2.0/docs/design/style-page/screenshots/preview-interaction.gif +0 -0
  64. yap_studio-1.2.0/docs/design/style-page/screenshots/tablet-top.webp +0 -0
  65. yap_studio-1.2.0/docs/design/style-page/serve.py +607 -0
  66. yap_studio-1.2.0/docs/design/style-page/style-data.js +1731 -0
  67. yap_studio-1.2.0/docs/design/style-page/styles.css +538 -0
  68. yap_studio-1.2.0/docs/design/style-page/sync_data.py +156 -0
  69. yap_studio-1.2.0/docs/edit-lists.md +168 -0
  70. yap_studio-1.2.0/docs/editing.md +387 -0
  71. yap_studio-1.2.0/docs/feedback.md +81 -0
  72. yap_studio-1.2.0/docs/home.md +107 -0
  73. yap_studio-1.2.0/docs/how-it-works.md +62 -0
  74. yap_studio-1.2.0/docs/images/demo.gif +0 -0
  75. yap_studio-1.2.0/docs/images/how-it-works.png +0 -0
  76. yap_studio-1.2.0/docs/images/how-it-works.svg +91 -0
  77. yap_studio-1.2.0/docs/images/journey/1-start-here.jpg +0 -0
  78. yap_studio-1.2.0/docs/images/journey/2-what.jpg +0 -0
  79. yap_studio-1.2.0/docs/images/journey/3-footage.jpg +0 -0
  80. yap_studio-1.2.0/docs/images/journey/4-look.jpg +0 -0
  81. yap_studio-1.2.0/docs/images/journey/5-make.jpg +0 -0
  82. yap_studio-1.2.0/docs/images/journey/6-progress.jpg +0 -0
  83. yap_studio-1.2.0/docs/images/journey/7-review.jpg +0 -0
  84. yap_studio-1.2.0/docs/images/journey/8-done.jpg +0 -0
  85. yap_studio-1.2.0/docs/images/journey/9-phone.jpg +0 -0
  86. yap_studio-1.2.0/docs/install.md +315 -0
  87. yap_studio-1.2.0/docs/limits.md +48 -0
  88. yap_studio-1.2.0/docs/recipes/voiceover.md +67 -0
  89. yap_studio-1.2.0/docs/review.md +193 -0
  90. yap_studio-1.2.0/docs/style-page.md +300 -0
  91. yap_studio-1.2.0/docs/styles.md +171 -0
  92. yap_studio-1.2.0/docs/verify.md +184 -0
  93. yap_studio-1.2.0/mcpb/manifest.json +47 -0
  94. yap_studio-1.2.0/plugins/yap-studio/.claude-plugin/plugin.json +10 -0
  95. yap_studio-1.2.0/plugins/yap-studio/.codex-plugin/plugin.json +9 -0
  96. yap_studio-1.2.0/plugins/yap-studio/.mcp.json +8 -0
  97. yap_studio-1.2.0/plugins/yap-studio/commands/verify.md +8 -0
  98. yap_studio-1.2.0/plugins/yap-studio/skills/verify-video/SKILL.md +76 -0
  99. yap_studio-1.2.0/pyproject.toml +65 -0
  100. yap_studio-1.2.0/release-notes.md +31 -0
  101. yap_studio-1.2.0/scripts/accept_workspace.py +63 -0
  102. yap_studio-1.2.0/scripts/build_mcpb.py +96 -0
  103. yap_studio-1.2.0/scripts/build_workspace.py +132 -0
  104. yap_studio-1.2.0/scripts/bump_hyperframes.py +340 -0
  105. yap_studio-1.2.0/scripts/bump_version.py +238 -0
  106. yap_studio-1.2.0/scripts/camera3d_pilot.py +152 -0
  107. yap_studio-1.2.0/scripts/camera3d_plan_sheet.py +169 -0
  108. yap_studio-1.2.0/scripts/check_release_ci.py +51 -0
  109. yap_studio-1.2.0/scripts/check_version_bump.py +67 -0
  110. yap_studio-1.2.0/scripts/gen_camera3d_metrics.py +54 -0
  111. yap_studio-1.2.0/scripts/gen_project_schemas.py +50 -0
  112. yap_studio-1.2.0/scripts/gen_text_metrics.py +111 -0
  113. yap_studio-1.2.0/scripts/release_check_scope.py +128 -0
  114. yap_studio-1.2.0/src/yap_studio/__init__.py +12 -0
  115. yap_studio-1.2.0/src/yap_studio/__main__.py +8 -0
  116. yap_studio-1.2.0/src/yap_studio/affiliate.py +4 -0
  117. yap_studio-1.2.0/src/yap_studio/audio.py +601 -0
  118. yap_studio-1.2.0/src/yap_studio/audio_chain.py +60 -0
  119. yap_studio-1.2.0/src/yap_studio/background.py +213 -0
  120. yap_studio-1.2.0/src/yap_studio/brand_command.py +99 -0
  121. yap_studio-1.2.0/src/yap_studio/brand_words.py +129 -0
  122. yap_studio-1.2.0/src/yap_studio/cache.py +28 -0
  123. yap_studio-1.2.0/src/yap_studio/canvas.py +113 -0
  124. yap_studio-1.2.0/src/yap_studio/captions.py +496 -0
  125. yap_studio-1.2.0/src/yap_studio/card_motion.py +219 -0
  126. yap_studio-1.2.0/src/yap_studio/card_project.py +145 -0
  127. yap_studio-1.2.0/src/yap_studio/card_stills.py +94 -0
  128. yap_studio-1.2.0/src/yap_studio/cards.py +2455 -0
  129. yap_studio-1.2.0/src/yap_studio/cards_video.py +185 -0
  130. yap_studio-1.2.0/src/yap_studio/checks/__init__.py +5 -0
  131. yap_studio-1.2.0/src/yap_studio/checks/caption_contrast.py +515 -0
  132. yap_studio-1.2.0/src/yap_studio/checks/caption_layout.py +281 -0
  133. yap_studio-1.2.0/src/yap_studio/checks/caption_words.py +207 -0
  134. yap_studio-1.2.0/src/yap_studio/checks/declared.py +313 -0
  135. yap_studio-1.2.0/src/yap_studio/checks/detect.py +569 -0
  136. yap_studio-1.2.0/src/yap_studio/checks/face_clearance.py +133 -0
  137. yap_studio-1.2.0/src/yap_studio/checks/fillers_gold.py +450 -0
  138. yap_studio-1.2.0/src/yap_studio/checks/flash.py +225 -0
  139. yap_studio-1.2.0/src/yap_studio/checks/grade.py +114 -0
  140. yap_studio-1.2.0/src/yap_studio/checks/joins.py +2121 -0
  141. yap_studio-1.2.0/src/yap_studio/checks/kept_words.py +133 -0
  142. yap_studio-1.2.0/src/yap_studio/checks/model.py +152 -0
  143. yap_studio-1.2.0/src/yap_studio/checks/platform.py +188 -0
  144. yap_studio-1.2.0/src/yap_studio/checks/relisten.py +368 -0
  145. yap_studio-1.2.0/src/yap_studio/checks/spans.py +164 -0
  146. yap_studio-1.2.0/src/yap_studio/checks/structure.py +1055 -0
  147. yap_studio-1.2.0/src/yap_studio/checks/sync.py +648 -0
  148. yap_studio-1.2.0/src/yap_studio/cli.py +2023 -0
  149. yap_studio-1.2.0/src/yap_studio/covers/__init__.py +1 -0
  150. yap_studio-1.2.0/src/yap_studio/covers/command.py +221 -0
  151. yap_studio-1.2.0/src/yap_studio/covers/layout.py +532 -0
  152. yap_studio-1.2.0/src/yap_studio/covers/pick.py +282 -0
  153. yap_studio-1.2.0/src/yap_studio/covers/render.py +521 -0
  154. yap_studio-1.2.0/src/yap_studio/covers/wide.py +314 -0
  155. yap_studio-1.2.0/src/yap_studio/editor_cards.py +168 -0
  156. yap_studio-1.2.0/src/yap_studio/edl/__init__.py +127 -0
  157. yap_studio-1.2.0/src/yap_studio/edl/fcpxml.py +239 -0
  158. yap_studio-1.2.0/src/yap_studio/edl/model.py +312 -0
  159. yap_studio-1.2.0/src/yap_studio/edl/rangesjson.py +310 -0
  160. yap_studio-1.2.0/src/yap_studio/edl/xmeml.py +264 -0
  161. yap_studio-1.2.0/src/yap_studio/edl/yapjson.py +149 -0
  162. yap_studio-1.2.0/src/yap_studio/elevenlabs.py +181 -0
  163. yap_studio-1.2.0/src/yap_studio/errors.py +331 -0
  164. yap_studio-1.2.0/src/yap_studio/faces/__init__.py +104 -0
  165. yap_studio-1.2.0/src/yap_studio/faces/clearance.py +685 -0
  166. yap_studio-1.2.0/src/yap_studio/faces/command.py +254 -0
  167. yap_studio-1.2.0/src/yap_studio/faces/detect.py +402 -0
  168. yap_studio-1.2.0/src/yap_studio/faces/face_boxes.swift +273 -0
  169. yap_studio-1.2.0/src/yap_studio/faces/final.py +87 -0
  170. yap_studio-1.2.0/src/yap_studio/faces/mapping.py +179 -0
  171. yap_studio-1.2.0/src/yap_studio/faces/model.py +389 -0
  172. yap_studio-1.2.0/src/yap_studio/faces/placement.py +235 -0
  173. yap_studio-1.2.0/src/yap_studio/faces/project.py +145 -0
  174. yap_studio-1.2.0/src/yap_studio/feedback/__init__.py +1 -0
  175. yap_studio-1.2.0/src/yap_studio/feedback/apply.py +500 -0
  176. yap_studio-1.2.0/src/yap_studio/feedback/audio.py +145 -0
  177. yap_studio-1.2.0/src/yap_studio/feedback/batch.py +639 -0
  178. yap_studio-1.2.0/src/yap_studio/feedback/broll.py +306 -0
  179. yap_studio-1.2.0/src/yap_studio/feedback/clarify.py +178 -0
  180. yap_studio-1.2.0/src/yap_studio/feedback/cli.py +346 -0
  181. yap_studio-1.2.0/src/yap_studio/feedback/edits.py +649 -0
  182. yap_studio-1.2.0/src/yap_studio/feedback/keeps.py +286 -0
  183. yap_studio-1.2.0/src/yap_studio/feedback/locate.py +89 -0
  184. yap_studio-1.2.0/src/yap_studio/feedback/moments.py +118 -0
  185. yap_studio-1.2.0/src/yap_studio/feedback/outline.py +614 -0
  186. yap_studio-1.2.0/src/yap_studio/feedback/pins.py +366 -0
  187. yap_studio-1.2.0/src/yap_studio/feedback/release.py +321 -0
  188. yap_studio-1.2.0/src/yap_studio/feedback/removed.py +81 -0
  189. yap_studio-1.2.0/src/yap_studio/feedback/replies.py +386 -0
  190. yap_studio-1.2.0/src/yap_studio/feedback/spelling.py +124 -0
  191. yap_studio-1.2.0/src/yap_studio/feedback/taste.py +152 -0
  192. yap_studio-1.2.0/src/yap_studio/feedback/versions.py +814 -0
  193. yap_studio-1.2.0/src/yap_studio/ffmpeg.py +475 -0
  194. yap_studio-1.2.0/src/yap_studio/file_cards.py +187 -0
  195. yap_studio-1.2.0/src/yap_studio/fonts/alata-regular.woff2 +0 -0
  196. yap_studio-1.2.0/src/yap_studio/fonts/anton-sc-regular.woff2 +0 -0
  197. yap_studio-1.2.0/src/yap_studio/fonts/archivo-black-regular.woff2 +0 -0
  198. yap_studio-1.2.0/src/yap_studio/fonts/geist-italic-variable.woff2 +0 -0
  199. yap_studio-1.2.0/src/yap_studio/fonts/geist-variable.woff2 +0 -0
  200. yap_studio-1.2.0/src/yap_studio/fonts/gelasio-italic-variable.woff2 +0 -0
  201. yap_studio-1.2.0/src/yap_studio/fonts/gelasio-variable.woff2 +0 -0
  202. yap_studio-1.2.0/src/yap_studio/fonts/instrument-serif-italic.woff2 +0 -0
  203. yap_studio-1.2.0/src/yap_studio/fonts/instrument-serif-regular.woff2 +0 -0
  204. yap_studio-1.2.0/src/yap_studio/fonts/inter-italic-variable.woff2 +0 -0
  205. yap_studio-1.2.0/src/yap_studio/fonts/inter-variable.woff2 +0 -0
  206. yap_studio-1.2.0/src/yap_studio/fonts/permanent-marker-regular.woff2 +0 -0
  207. yap_studio-1.2.0/src/yap_studio/fonts/space-mono-italic.woff2 +0 -0
  208. yap_studio-1.2.0/src/yap_studio/fonts/space-mono-regular.woff2 +0 -0
  209. yap_studio-1.2.0/src/yap_studio/fonts/titan-one-regular.woff2 +0 -0
  210. yap_studio-1.2.0/src/yap_studio/gallery/__init__.py +1 -0
  211. yap_studio-1.2.0/src/yap_studio/gallery/command.py +339 -0
  212. yap_studio-1.2.0/src/yap_studio/gallery/cutout.py +84 -0
  213. yap_studio-1.2.0/src/yap_studio/gallery/detach.py +232 -0
  214. yap_studio-1.2.0/src/yap_studio/gallery/face_landmarks.swift +78 -0
  215. yap_studio-1.2.0/src/yap_studio/gallery/live.py +326 -0
  216. yap_studio-1.2.0/src/yap_studio/gallery/sample-still.jpg +0 -0
  217. yap_studio-1.2.0/src/yap_studio/gallery/server.py +881 -0
  218. yap_studio-1.2.0/src/yap_studio/gallery/static/choices.mjs +1216 -0
  219. yap_studio-1.2.0/src/yap_studio/gallery/static/pick.css +482 -0
  220. yap_studio-1.2.0/src/yap_studio/gallery/static/pick.html +61 -0
  221. yap_studio-1.2.0/src/yap_studio/gallery/static/pick.js +2242 -0
  222. yap_studio-1.2.0/src/yap_studio/gallery/static/shot.jpg +0 -0
  223. yap_studio-1.2.0/src/yap_studio/gallery/still.py +587 -0
  224. yap_studio-1.2.0/src/yap_studio/gallery/still_command.py +69 -0
  225. yap_studio-1.2.0/src/yap_studio/grade.py +407 -0
  226. yap_studio-1.2.0/src/yap_studio/grade_command.py +124 -0
  227. yap_studio-1.2.0/src/yap_studio/hdr.py +190 -0
  228. yap_studio-1.2.0/src/yap_studio/hf_registry/__init__.py +1 -0
  229. yap_studio-1.2.0/src/yap_studio/hf_registry/cards.py +228 -0
  230. yap_studio-1.2.0/src/yap_studio/hf_registry/catalog.json +122 -0
  231. yap_studio-1.2.0/src/yap_studio/hf_registry/catalog.py +308 -0
  232. yap_studio-1.2.0/src/yap_studio/hf_registry/install.py +255 -0
  233. yap_studio-1.2.0/src/yap_studio/hf_registry/localize.py +471 -0
  234. yap_studio-1.2.0/src/yap_studio/homepage/__init__.py +1 -0
  235. yap_studio-1.2.0/src/yap_studio/homepage/bridge.py +656 -0
  236. yap_studio-1.2.0/src/yap_studio/homepage/command.py +173 -0
  237. yap_studio-1.2.0/src/yap_studio/homepage/detach.py +164 -0
  238. yap_studio-1.2.0/src/yap_studio/homepage/link.py +87 -0
  239. yap_studio-1.2.0/src/yap_studio/homepage/server.py +625 -0
  240. yap_studio-1.2.0/src/yap_studio/homepage/state.py +452 -0
  241. yap_studio-1.2.0/src/yap_studio/homepage/static/home-model.mjs +365 -0
  242. yap_studio-1.2.0/src/yap_studio/homepage/static/home.css +334 -0
  243. yap_studio-1.2.0/src/yap_studio/homepage/static/home.html +38 -0
  244. yap_studio-1.2.0/src/yap_studio/homepage/static/home.js +1079 -0
  245. yap_studio-1.2.0/src/yap_studio/install_info.py +175 -0
  246. yap_studio-1.2.0/src/yap_studio/jiggle_cards.py +185 -0
  247. yap_studio-1.2.0/src/yap_studio/joins/__init__.py +1 -0
  248. yap_studio-1.2.0/src/yap_studio/joins/assembly.py +39 -0
  249. yap_studio-1.2.0/src/yap_studio/joins/command.py +57 -0
  250. yap_studio-1.2.0/src/yap_studio/joins/helper.py +142 -0
  251. yap_studio-1.2.0/src/yap_studio/joins/plan.py +260 -0
  252. yap_studio-1.2.0/src/yap_studio/joins/render.py +210 -0
  253. yap_studio-1.2.0/src/yap_studio/joins/smooth_frames.swift +196 -0
  254. yap_studio-1.2.0/src/yap_studio/joins/steps.py +183 -0
  255. yap_studio-1.2.0/src/yap_studio/letters.py +417 -0
  256. yap_studio-1.2.0/src/yap_studio/local_http.py +20 -0
  257. yap_studio-1.2.0/src/yap_studio/matte/__init__.py +21 -0
  258. yap_studio-1.2.0/src/yap_studio/matte/check.py +582 -0
  259. yap_studio-1.2.0/src/yap_studio/matte/chroma.py +393 -0
  260. yap_studio-1.2.0/src/yap_studio/matte/command.py +169 -0
  261. yap_studio-1.2.0/src/yap_studio/matte/composite.py +417 -0
  262. yap_studio-1.2.0/src/yap_studio/matte/edge_colour.py +212 -0
  263. yap_studio-1.2.0/src/yap_studio/matte/frames.py +252 -0
  264. yap_studio-1.2.0/src/yap_studio/matte/hyperframes.py +292 -0
  265. yap_studio-1.2.0/src/yap_studio/matte/ink.py +20 -0
  266. yap_studio-1.2.0/src/yap_studio/matte/make.py +452 -0
  267. yap_studio-1.2.0/src/yap_studio/matte/model.py +280 -0
  268. yap_studio-1.2.0/src/yap_studio/matte/person_matte.swift +197 -0
  269. yap_studio-1.2.0/src/yap_studio/matte/project.py +207 -0
  270. yap_studio-1.2.0/src/yap_studio/matte/refine.py +247 -0
  271. yap_studio-1.2.0/src/yap_studio/matte/timing.py +34 -0
  272. yap_studio-1.2.0/src/yap_studio/matte/vision.py +105 -0
  273. yap_studio-1.2.0/src/yap_studio/mcp_server.py +112 -0
  274. yap_studio-1.2.0/src/yap_studio/media/__init__.py +34 -0
  275. yap_studio-1.2.0/src/yap_studio/media/album.py +353 -0
  276. yap_studio-1.2.0/src/yap_studio/media/captured.py +325 -0
  277. yap_studio-1.2.0/src/yap_studio/media/catalog.py +791 -0
  278. yap_studio-1.2.0/src/yap_studio/media/commands.py +315 -0
  279. yap_studio-1.2.0/src/yap_studio/media/describe.py +209 -0
  280. yap_studio-1.2.0/src/yap_studio/media/frame.py +54 -0
  281. yap_studio-1.2.0/src/yap_studio/media/inventory.py +353 -0
  282. yap_studio-1.2.0/src/yap_studio/media/select.py +376 -0
  283. yap_studio-1.2.0/src/yap_studio/media/sheet.py +404 -0
  284. yap_studio-1.2.0/src/yap_studio/media/sound.py +117 -0
  285. yap_studio-1.2.0/src/yap_studio/opening_push.py +60 -0
  286. yap_studio-1.2.0/src/yap_studio/paths.py +456 -0
  287. yap_studio-1.2.0/src/yap_studio/pictures/__init__.py +1 -0
  288. yap_studio-1.2.0/src/yap_studio/pictures/attempts.py +71 -0
  289. yap_studio-1.2.0/src/yap_studio/pictures/command.py +196 -0
  290. yap_studio-1.2.0/src/yap_studio/pictures/guard.py +208 -0
  291. yap_studio-1.2.0/src/yap_studio/pictures/make.py +526 -0
  292. yap_studio-1.2.0/src/yap_studio/pictures/metadata.py +40 -0
  293. yap_studio-1.2.0/src/yap_studio/pictures/sheet.py +273 -0
  294. yap_studio-1.2.0/src/yap_studio/pictures/wavespeed.py +372 -0
  295. yap_studio-1.2.0/src/yap_studio/plan.py +256 -0
  296. yap_studio-1.2.0/src/yap_studio/planner/__init__.py +1 -0
  297. yap_studio-1.2.0/src/yap_studio/planner/anchors.py +74 -0
  298. yap_studio-1.2.0/src/yap_studio/planner/broll.py +681 -0
  299. yap_studio-1.2.0/src/yap_studio/planner/broll_placement.py +30 -0
  300. yap_studio-1.2.0/src/yap_studio/planner/broll_timing.py +45 -0
  301. yap_studio-1.2.0/src/yap_studio/planner/cards.py +1388 -0
  302. yap_studio-1.2.0/src/yap_studio/planner/command.py +236 -0
  303. yap_studio-1.2.0/src/yap_studio/planner/number_behind.py +281 -0
  304. yap_studio-1.2.0/src/yap_studio/planner/number_spoken.py +49 -0
  305. yap_studio-1.2.0/src/yap_studio/platforms.json +131 -0
  306. yap_studio-1.2.0/src/yap_studio/process.py +75 -0
  307. yap_studio-1.2.0/src/yap_studio/product_feedback.py +387 -0
  308. yap_studio-1.2.0/src/yap_studio/project/__init__.py +181 -0
  309. yap_studio-1.2.0/src/yap_studio/project/anchors.py +254 -0
  310. yap_studio-1.2.0/src/yap_studio/project/edit_format.py +93 -0
  311. yap_studio-1.2.0/src/yap_studio/project/lock.py +153 -0
  312. yap_studio-1.2.0/src/yap_studio/project/model.py +940 -0
  313. yap_studio-1.2.0/src/yap_studio/project/receipts.py +542 -0
  314. yap_studio-1.2.0/src/yap_studio/project/schemas/cut-words.schema.json +78 -0
  315. yap_studio-1.2.0/src/yap_studio/project/schemas/edit.schema.json +169 -0
  316. yap_studio-1.2.0/src/yap_studio/project/schemas/project.schema.json +487 -0
  317. yap_studio-1.2.0/src/yap_studio/project/schemas/removals.schema.json +84 -0
  318. yap_studio-1.2.0/src/yap_studio/project/schemas/text-hook.schema.json +78 -0
  319. yap_studio-1.2.0/src/yap_studio/project/schemas/timeline-fragment.schema.json +3128 -0
  320. yap_studio-1.2.0/src/yap_studio/project/schemas/timeline.schema.json +3145 -0
  321. yap_studio-1.2.0/src/yap_studio/project/schemas/words.schema.json +101 -0
  322. yap_studio-1.2.0/src/yap_studio/project/status.py +889 -0
  323. yap_studio-1.2.0/src/yap_studio/project/word_fixes.py +39 -0
  324. yap_studio-1.2.0/src/yap_studio/receipt.py +80 -0
  325. yap_studio-1.2.0/src/yap_studio/registry.py +205 -0
  326. yap_studio-1.2.0/src/yap_studio/render/__init__.py +1 -0
  327. yap_studio-1.2.0/src/yap_studio/render/alpha.py +98 -0
  328. yap_studio-1.2.0/src/yap_studio/render/beats.py +112 -0
  329. yap_studio-1.2.0/src/yap_studio/render/camera3d.py +2319 -0
  330. yap_studio-1.2.0/src/yap_studio/render/camera3d_clearance.py +112 -0
  331. yap_studio-1.2.0/src/yap_studio/render/camera3d_fallback.py +136 -0
  332. yap_studio-1.2.0/src/yap_studio/render/camera3d_geometry.py +77 -0
  333. yap_studio-1.2.0/src/yap_studio/render/camera3d_look.py +395 -0
  334. yap_studio-1.2.0/src/yap_studio/render/camera3d_matte.py +54 -0
  335. yap_studio-1.2.0/src/yap_studio/render/camera3d_motion.py +113 -0
  336. yap_studio-1.2.0/src/yap_studio/render/fonts.py +307 -0
  337. yap_studio-1.2.0/src/yap_studio/render/hyperframes.py +1075 -0
  338. yap_studio-1.2.0/src/yap_studio/render/layer_checks.py +315 -0
  339. yap_studio-1.2.0/src/yap_studio/render/moment_clones.py +453 -0
  340. yap_studio-1.2.0/src/yap_studio/render/moments.py +531 -0
  341. yap_studio-1.2.0/src/yap_studio/render/renderer-lock/package-lock.json +1933 -0
  342. yap_studio-1.2.0/src/yap_studio/render/renderer-lock/package.json +11 -0
  343. yap_studio-1.2.0/src/yap_studio/render/text_metrics.json +10442 -0
  344. yap_studio-1.2.0/src/yap_studio/render/text_metrics.py +94 -0
  345. yap_studio-1.2.0/src/yap_studio/render/user_fonts.py +310 -0
  346. yap_studio-1.2.0/src/yap_studio/report.py +595 -0
  347. yap_studio-1.2.0/src/yap_studio/review/__init__.py +85 -0
  348. yap_studio-1.2.0/src/yap_studio/review/captions.py +61 -0
  349. yap_studio-1.2.0/src/yap_studio/review/detach.py +224 -0
  350. yap_studio-1.2.0/src/yap_studio/review/export.py +403 -0
  351. yap_studio-1.2.0/src/yap_studio/review/findings.py +349 -0
  352. yap_studio-1.2.0/src/yap_studio/review/launch.py +108 -0
  353. yap_studio-1.2.0/src/yap_studio/review/media.py +262 -0
  354. yap_studio-1.2.0/src/yap_studio/review/model.py +456 -0
  355. yap_studio-1.2.0/src/yap_studio/review/outline_server.py +339 -0
  356. yap_studio-1.2.0/src/yap_studio/review/phone.py +178 -0
  357. yap_studio-1.2.0/src/yap_studio/review/rounds.py +162 -0
  358. yap_studio-1.2.0/src/yap_studio/review/send.py +77 -0
  359. yap_studio-1.2.0/src/yap_studio/review/series.py +247 -0
  360. yap_studio-1.2.0/src/yap_studio/review/server.py +1428 -0
  361. yap_studio-1.2.0/src/yap_studio/review/static/app.css +445 -0
  362. yap_studio-1.2.0/src/yap_studio/review/static/app.mjs +2893 -0
  363. yap_studio-1.2.0/src/yap_studio/review/static/index.html +269 -0
  364. yap_studio-1.2.0/src/yap_studio/review/static/list.html +27 -0
  365. yap_studio-1.2.0/src/yap_studio/review/static/outline-view.mjs +63 -0
  366. yap_studio-1.2.0/src/yap_studio/review/static/outline.html +52 -0
  367. yap_studio-1.2.0/src/yap_studio/review/static/outline.mjs +359 -0
  368. yap_studio-1.2.0/src/yap_studio/review/static/taste.mjs +111 -0
  369. yap_studio-1.2.0/src/yap_studio/review/static/text-hook.mjs +70 -0
  370. yap_studio-1.2.0/src/yap_studio/review/static/timeline.mjs +588 -0
  371. yap_studio-1.2.0/src/yap_studio/review/store.py +922 -0
  372. yap_studio-1.2.0/src/yap_studio/review/video_map.py +122 -0
  373. yap_studio-1.2.0/src/yap_studio/setup_checks.py +75 -0
  374. yap_studio-1.2.0/src/yap_studio/sfx/__init__.py +376 -0
  375. yap_studio-1.2.0/src/yap_studio/sfx/bleep.py +469 -0
  376. yap_studio-1.2.0/src/yap_studio/sfx/commands.py +77 -0
  377. yap_studio-1.2.0/src/yap_studio/sfx/kits/extras.json +70 -0
  378. yap_studio-1.2.0/src/yap_studio/sfx/kits/made.json +311 -0
  379. yap_studio-1.2.0/src/yap_studio/sfx/kits/soft.json +43 -0
  380. yap_studio-1.2.0/src/yap_studio/sfx/made.py +250 -0
  381. yap_studio-1.2.0/src/yap_studio/sfx/place.py +356 -0
  382. yap_studio-1.2.0/src/yap_studio/sfx/swear-words.json +48 -0
  383. yap_studio-1.2.0/src/yap_studio/stages/__init__.py +1 -0
  384. yap_studio-1.2.0/src/yap_studio/stages/assemble.py +1759 -0
  385. yap_studio-1.2.0/src/yap_studio/stages/assemble_audio.py +653 -0
  386. yap_studio-1.2.0/src/yap_studio/stages/assemble_grade.py +62 -0
  387. yap_studio-1.2.0/src/yap_studio/stages/assemble_picture.py +1467 -0
  388. yap_studio-1.2.0/src/yap_studio/stages/behind_window.py +58 -0
  389. yap_studio-1.2.0/src/yap_studio/stages/broll_framing.py +93 -0
  390. yap_studio-1.2.0/src/yap_studio/stages/broll_limits.py +109 -0
  391. yap_studio-1.2.0/src/yap_studio/stages/broll_match.py +385 -0
  392. yap_studio-1.2.0/src/yap_studio/stages/broll_split.py +213 -0
  393. yap_studio-1.2.0/src/yap_studio/stages/captions.py +2010 -0
  394. yap_studio-1.2.0/src/yap_studio/stages/captions_3d.py +348 -0
  395. yap_studio-1.2.0/src/yap_studio/stages/coverage.py +210 -0
  396. yap_studio-1.2.0/src/yap_studio/stages/cut.py +1466 -0
  397. yap_studio-1.2.0/src/yap_studio/stages/edges.py +752 -0
  398. yap_studio-1.2.0/src/yap_studio/stages/fillers.py +2322 -0
  399. yap_studio-1.2.0/src/yap_studio/stages/graphics.py +1048 -0
  400. yap_studio-1.2.0/src/yap_studio/stages/green_screen.py +355 -0
  401. yap_studio-1.2.0/src/yap_studio/stages/ingest.py +816 -0
  402. yap_studio-1.2.0/src/yap_studio/stages/music.py +650 -0
  403. yap_studio-1.2.0/src/yap_studio/stages/number_graphics.py +157 -0
  404. yap_studio-1.2.0/src/yap_studio/stages/number_visibility.py +69 -0
  405. yap_studio-1.2.0/src/yap_studio/stages/rebase.py +789 -0
  406. yap_studio-1.2.0/src/yap_studio/stages/repeats.py +140 -0
  407. yap_studio-1.2.0/src/yap_studio/stages/run.py +336 -0
  408. yap_studio-1.2.0/src/yap_studio/stages/run_detach.py +407 -0
  409. yap_studio-1.2.0/src/yap_studio/stages/take_levels.py +227 -0
  410. yap_studio-1.2.0/src/yap_studio/stages/tall_box.py +144 -0
  411. yap_studio-1.2.0/src/yap_studio/stages/timeline.py +1527 -0
  412. yap_studio-1.2.0/src/yap_studio/stages/transitions.py +148 -0
  413. yap_studio-1.2.0/src/yap_studio/stages/voiceover.py +59 -0
  414. yap_studio-1.2.0/src/yap_studio/stock/__init__.py +1 -0
  415. yap_studio-1.2.0/src/yap_studio/stock/command.py +135 -0
  416. yap_studio-1.2.0/src/yap_studio/stock/credits.py +67 -0
  417. yap_studio-1.2.0/src/yap_studio/stock/fetch.py +118 -0
  418. yap_studio-1.2.0/src/yap_studio/stock/get.py +273 -0
  419. yap_studio-1.2.0/src/yap_studio/stock/guard.py +144 -0
  420. yap_studio-1.2.0/src/yap_studio/stock/metadata.py +53 -0
  421. yap_studio-1.2.0/src/yap_studio/stock/pexels.py +191 -0
  422. yap_studio-1.2.0/src/yap_studio/stock/provider.py +158 -0
  423. yap_studio-1.2.0/src/yap_studio/stock/sheet.py +451 -0
  424. yap_studio-1.2.0/src/yap_studio/studio/__init__.py +5 -0
  425. yap_studio-1.2.0/src/yap_studio/studio/commands.py +70 -0
  426. yap_studio-1.2.0/src/yap_studio/studio/export.py +409 -0
  427. yap_studio-1.2.0/src/yap_studio/style/PROVENANCE.json +141 -0
  428. yap_studio-1.2.0/src/yap_studio/style/__init__.py +63 -0
  429. yap_studio-1.2.0/src/yap_studio/style/answers.py +358 -0
  430. yap_studio-1.2.0/src/yap_studio/style/library.py +415 -0
  431. yap_studio-1.2.0/src/yap_studio/style/loader.py +316 -0
  432. yap_studio-1.2.0/src/yap_studio/style/presets/candy.json +42 -0
  433. yap_studio-1.2.0/src/yap_studio/style/presets/clean_minimal.json +26 -0
  434. yap_studio-1.2.0/src/yap_studio/style/presets/cobalt.json +42 -0
  435. yap_studio-1.2.0/src/yap_studio/style/presets/editorial_serif.json +43 -0
  436. yap_studio-1.2.0/src/yap_studio/style/presets/electric.json +29 -0
  437. yap_studio-1.2.0/src/yap_studio/style/presets/headline.json +43 -0
  438. yap_studio-1.2.0/src/yap_studio/style/presets/hf_bold.json +35 -0
  439. yap_studio-1.2.0/src/yap_studio/style/presets/hf_editorial.json +35 -0
  440. yap_studio-1.2.0/src/yap_studio/style/presets/hf_neutral.json +35 -0
  441. yap_studio-1.2.0/src/yap_studio/style/presets/marker.json +42 -0
  442. yap_studio-1.2.0/src/yap_studio/style/presets/mono.json +42 -0
  443. yap_studio-1.2.0/src/yap_studio/style/presets/one_word.json +44 -0
  444. yap_studio-1.2.0/src/yap_studio/style/presets/warm_editorial.json +28 -0
  445. yap_studio-1.2.0/src/yap_studio/style/schema-v1.json +1095 -0
  446. yap_studio-1.2.0/src/yap_studio/style/site_colors.py +463 -0
  447. yap_studio-1.2.0/src/yap_studio/taste/__init__.py +82 -0
  448. yap_studio-1.2.0/src/yap_studio/taste/check.py +242 -0
  449. yap_studio-1.2.0/src/yap_studio/taste/cli.py +249 -0
  450. yap_studio-1.2.0/src/yap_studio/taste/frames.py +296 -0
  451. yap_studio-1.2.0/src/yap_studio/taste/inbox.py +269 -0
  452. yap_studio-1.2.0/src/yap_studio/taste/learn.py +1237 -0
  453. yap_studio-1.2.0/src/yap_studio/taste/learned.py +119 -0
  454. yap_studio-1.2.0/src/yap_studio/taste/measure_pacing.py +306 -0
  455. yap_studio-1.2.0/src/yap_studio/taste/measure_panels.py +360 -0
  456. yap_studio-1.2.0/src/yap_studio/taste/measure_shapes.py +377 -0
  457. yap_studio-1.2.0/src/yap_studio/taste/measure_text.py +488 -0
  458. yap_studio-1.2.0/src/yap_studio/taste/measure_words.py +357 -0
  459. yap_studio-1.2.0/src/yap_studio/taste/model.py +585 -0
  460. yap_studio-1.2.0/src/yap_studio/taste/render.py +162 -0
  461. yap_studio-1.2.0/src/yap_studio/taste/resolve.py +132 -0
  462. yap_studio-1.2.0/src/yap_studio/taste/store.py +436 -0
  463. yap_studio-1.2.0/src/yap_studio/templates/PROVENANCE.json +519 -0
  464. yap_studio-1.2.0/src/yap_studio/templates/big_number/preview.json +6 -0
  465. yap_studio-1.2.0/src/yap_studio/templates/big_number/template.html +96 -0
  466. yap_studio-1.2.0/src/yap_studio/templates/big_number/template.json +289 -0
  467. yap_studio-1.2.0/src/yap_studio/templates/callout_circle/preview.json +8 -0
  468. yap_studio-1.2.0/src/yap_studio/templates/callout_circle/template.html +82 -0
  469. yap_studio-1.2.0/src/yap_studio/templates/callout_circle/template.json +196 -0
  470. yap_studio-1.2.0/src/yap_studio/templates/camera3d/PROVENANCE.json +42 -0
  471. yap_studio-1.2.0/src/yap_studio/templates/camera3d/cam3d.js +360 -0
  472. yap_studio-1.2.0/src/yap_studio/templates/camera3d/finish.js +35 -0
  473. yap_studio-1.2.0/src/yap_studio/templates/camera3d/metrics.json +312 -0
  474. yap_studio-1.2.0/src/yap_studio/templates/camera3d/tables.js +29 -0
  475. yap_studio-1.2.0/src/yap_studio/templates/captions/template.html +1077 -0
  476. yap_studio-1.2.0/src/yap_studio/templates/captions/template.json +396 -0
  477. yap_studio-1.2.0/src/yap_studio/templates/card-motion-drawn.js +35 -0
  478. yap_studio-1.2.0/src/yap_studio/templates/card-motion-host.js +100 -0
  479. yap_studio-1.2.0/src/yap_studio/templates/chapter/template.html +74 -0
  480. yap_studio-1.2.0/src/yap_studio/templates/chapter/template.json +67 -0
  481. yap_studio-1.2.0/src/yap_studio/templates/chart/preview.json +20 -0
  482. yap_studio-1.2.0/src/yap_studio/templates/chart/template.html +88 -0
  483. yap_studio-1.2.0/src/yap_studio/templates/chart/template.json +202 -0
  484. yap_studio-1.2.0/src/yap_studio/templates/checklist/preview.json +9 -0
  485. yap_studio-1.2.0/src/yap_studio/templates/checklist/template.html +141 -0
  486. yap_studio-1.2.0/src/yap_studio/templates/checklist/template.json +148 -0
  487. yap_studio-1.2.0/src/yap_studio/templates/choices/preview.json +1 -0
  488. yap_studio-1.2.0/src/yap_studio/templates/choices/template.html +102 -0
  489. yap_studio-1.2.0/src/yap_studio/templates/choices/template.json +239 -0
  490. yap_studio-1.2.0/src/yap_studio/templates/comment_cta/preview.json +6 -0
  491. yap_studio-1.2.0/src/yap_studio/templates/comment_cta/template.html +140 -0
  492. yap_studio-1.2.0/src/yap_studio/templates/comment_cta/template.json +198 -0
  493. yap_studio-1.2.0/src/yap_studio/templates/comment_drop/preview.json +6 -0
  494. yap_studio-1.2.0/src/yap_studio/templates/comment_drop/template.html +118 -0
  495. yap_studio-1.2.0/src/yap_studio/templates/comment_drop/template.json +214 -0
  496. yap_studio-1.2.0/src/yap_studio/templates/cover/template.html +104 -0
  497. yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/preview.json +13 -0
  498. yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/template.html +142 -0
  499. yap_studio-1.2.0/src/yap_studio/templates/edit_timeline/template.json +242 -0
  500. yap_studio-1.2.0/src/yap_studio/templates/file_drop/preview.json +5 -0
  501. yap_studio-1.2.0/src/yap_studio/templates/file_drop/template.html +124 -0
  502. yap_studio-1.2.0/src/yap_studio/templates/file_drop/template.json +264 -0
  503. yap_studio-1.2.0/src/yap_studio/templates/flow/preview.json +1 -0
  504. yap_studio-1.2.0/src/yap_studio/templates/flow/template.html +326 -0
  505. yap_studio-1.2.0/src/yap_studio/templates/flow/template.json +184 -0
  506. yap_studio-1.2.0/src/yap_studio/templates/glow-shadow.js +9 -0
  507. yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/preview.json +18 -0
  508. yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/template.html +63 -0
  509. yap_studio-1.2.0/src/yap_studio/templates/gravity_drop/template.json +141 -0
  510. yap_studio-1.2.0/src/yap_studio/templates/icon_strike/preview.json +6 -0
  511. yap_studio-1.2.0/src/yap_studio/templates/icon_strike/template.html +144 -0
  512. yap_studio-1.2.0/src/yap_studio/templates/icon_strike/template.json +193 -0
  513. yap_studio-1.2.0/src/yap_studio/templates/image_card/preview.json +6 -0
  514. yap_studio-1.2.0/src/yap_studio/templates/image_card/template.html +231 -0
  515. yap_studio-1.2.0/src/yap_studio/templates/image_card/template.json +244 -0
  516. yap_studio-1.2.0/src/yap_studio/templates/image_compare/preview.json +8 -0
  517. yap_studio-1.2.0/src/yap_studio/templates/image_compare/template.html +131 -0
  518. yap_studio-1.2.0/src/yap_studio/templates/image_compare/template.json +231 -0
  519. yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/preview.json +18 -0
  520. yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/template.html +118 -0
  521. yap_studio-1.2.0/src/yap_studio/templates/jiggle_delete/template.json +217 -0
  522. yap_studio-1.2.0/src/yap_studio/templates/letters/template.html +128 -0
  523. yap_studio-1.2.0/src/yap_studio/templates/letters/template.json +66 -0
  524. yap_studio-1.2.0/src/yap_studio/templates/name_tag/preview.json +6 -0
  525. yap_studio-1.2.0/src/yap_studio/templates/name_tag/template.html +74 -0
  526. yap_studio-1.2.0/src/yap_studio/templates/name_tag/template.json +148 -0
  527. yap_studio-1.2.0/src/yap_studio/templates/playing_grid/preview.json +1 -0
  528. yap_studio-1.2.0/src/yap_studio/templates/playing_grid/template.html +94 -0
  529. yap_studio-1.2.0/src/yap_studio/templates/playing_grid/template.json +182 -0
  530. yap_studio-1.2.0/src/yap_studio/templates/progress_stat/preview.json +7 -0
  531. yap_studio-1.2.0/src/yap_studio/templates/progress_stat/template.html +75 -0
  532. yap_studio-1.2.0/src/yap_studio/templates/progress_stat/template.json +160 -0
  533. yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/preview.json +6 -0
  534. yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/template.html +134 -0
  535. yap_studio-1.2.0/src/yap_studio/templates/prompt_bar/template.json +183 -0
  536. yap_studio-1.2.0/src/yap_studio/templates/quote/preview.json +7 -0
  537. yap_studio-1.2.0/src/yap_studio/templates/quote/template.html +79 -0
  538. yap_studio-1.2.0/src/yap_studio/templates/quote/template.json +166 -0
  539. yap_studio-1.2.0/src/yap_studio/templates/reel_feed/preview.json +1 -0
  540. yap_studio-1.2.0/src/yap_studio/templates/reel_feed/template.html +172 -0
  541. yap_studio-1.2.0/src/yap_studio/templates/reel_feed/template.json +271 -0
  542. yap_studio-1.2.0/src/yap_studio/templates/specs_list/preview.json +19 -0
  543. yap_studio-1.2.0/src/yap_studio/templates/specs_list/template.html +157 -0
  544. yap_studio-1.2.0/src/yap_studio/templates/specs_list/template.json +188 -0
  545. yap_studio-1.2.0/src/yap_studio/templates/stat/preview.json +8 -0
  546. yap_studio-1.2.0/src/yap_studio/templates/stat/template.html +305 -0
  547. yap_studio-1.2.0/src/yap_studio/templates/stat/template.json +290 -0
  548. yap_studio-1.2.0/src/yap_studio/templates/steps/preview.json +1 -0
  549. yap_studio-1.2.0/src/yap_studio/templates/steps/template.html +129 -0
  550. yap_studio-1.2.0/src/yap_studio/templates/steps/template.json +144 -0
  551. yap_studio-1.2.0/src/yap_studio/templates/storyboard/preview.json +59 -0
  552. yap_studio-1.2.0/src/yap_studio/templates/storyboard/template.html +107 -0
  553. yap_studio-1.2.0/src/yap_studio/templates/storyboard/template.json +188 -0
  554. yap_studio-1.2.0/src/yap_studio/templates/success_check/preview.json +5 -0
  555. yap_studio-1.2.0/src/yap_studio/templates/success_check/template.html +73 -0
  556. yap_studio-1.2.0/src/yap_studio/templates/success_check/template.json +129 -0
  557. yap_studio-1.2.0/src/yap_studio/templates/terminal/preview.json +12 -0
  558. yap_studio-1.2.0/src/yap_studio/templates/terminal/template.html +149 -0
  559. yap_studio-1.2.0/src/yap_studio/templates/terminal/template.json +229 -0
  560. yap_studio-1.2.0/src/yap_studio/templates/text_tag/preview.json +7 -0
  561. yap_studio-1.2.0/src/yap_studio/templates/text_tag/template.html +281 -0
  562. yap_studio-1.2.0/src/yap_studio/templates/text_tag/template.json +229 -0
  563. yap_studio-1.2.0/src/yap_studio/templates/title/template.html +541 -0
  564. yap_studio-1.2.0/src/yap_studio/templates/title/template.json +269 -0
  565. yap_studio-1.2.0/src/yap_studio/templates/transfer/preview.json +7 -0
  566. yap_studio-1.2.0/src/yap_studio/templates/transfer/template.html +244 -0
  567. yap_studio-1.2.0/src/yap_studio/templates/transfer/template.json +347 -0
  568. yap_studio-1.2.0/src/yap_studio/templates/transition_cinematic_zoom/template.html +106 -0
  569. yap_studio-1.2.0/src/yap_studio/templates/transition_cinematic_zoom/template.json +29 -0
  570. yap_studio-1.2.0/src/yap_studio/templates/transition_light_leak/template.html +106 -0
  571. yap_studio-1.2.0/src/yap_studio/templates/transition_light_leak/template.json +29 -0
  572. yap_studio-1.2.0/src/yap_studio/templates/transition_whip_pan/template.html +106 -0
  573. yap_studio-1.2.0/src/yap_studio/templates/transition_whip_pan/template.json +29 -0
  574. yap_studio-1.2.0/src/yap_studio/templates/video_card/preview.json +1 -0
  575. yap_studio-1.2.0/src/yap_studio/templates/video_card/template.html +101 -0
  576. yap_studio-1.2.0/src/yap_studio/templates/video_card/template.json +183 -0
  577. yap_studio-1.2.0/src/yap_studio/templates/wide_titles/template.html +39 -0
  578. yap_studio-1.2.0/src/yap_studio/templates/wide_titles/template.json +114 -0
  579. yap_studio-1.2.0/src/yap_studio/templates_command.py +410 -0
  580. yap_studio-1.2.0/src/yap_studio/text_hook.py +103 -0
  581. yap_studio-1.2.0/src/yap_studio/text_rules.py +406 -0
  582. yap_studio-1.2.0/src/yap_studio/tools.py +227 -0
  583. yap_studio-1.2.0/src/yap_studio/transcript/__init__.py +46 -0
  584. yap_studio-1.2.0/src/yap_studio/transcript/backends.py +941 -0
  585. yap_studio-1.2.0/src/yap_studio/transcript/child.py +52 -0
  586. yap_studio-1.2.0/src/yap_studio/transcript/engine_child.py +213 -0
  587. yap_studio-1.2.0/src/yap_studio/transcript/isolated.py +191 -0
  588. yap_studio-1.2.0/src/yap_studio/transcript/mappers.py +183 -0
  589. yap_studio-1.2.0/src/yap_studio/transcript/model.py +95 -0
  590. yap_studio-1.2.0/src/yap_studio/transcript/shared.py +283 -0
  591. yap_studio-1.2.0/src/yap_studio/transcript/take_job.py +176 -0
  592. yap_studio-1.2.0/src/yap_studio/transcript/words.py +130 -0
  593. yap_studio-1.2.0/src/yap_studio/verify.py +1025 -0
  594. yap_studio-1.2.0/src/yap_studio/video.py +551 -0
  595. yap_studio-1.2.0/src/yap_studio/video_type.py +225 -0
  596. yap_studio-1.2.0/src/yap_studio/video_type_command.py +145 -0
  597. yap_studio-1.2.0/src/yap_studio/watch/__init__.py +90 -0
  598. yap_studio-1.2.0/src/yap_studio/watch/command.py +198 -0
  599. yap_studio-1.2.0/src/yap_studio/watch/findings.py +527 -0
  600. yap_studio-1.2.0/src/yap_studio/watch/images.py +271 -0
  601. yap_studio-1.2.0/src/yap_studio/watch/measure.py +264 -0
  602. yap_studio-1.2.0/src/yap_studio/watch/pack.py +1038 -0
  603. yap_studio-1.2.0/src/yap_studio/watch/scan.py +429 -0
  604. yap_studio-1.2.0/src/yap_studio/wide_cards.py +600 -0
  605. yap_studio-1.2.0/src/yap_studio/wide_titles.py +116 -0
  606. yap_studio-1.2.0/src/yap_studio/youtube_chapters.py +70 -0
  607. yap_studio-1.2.0/src/yap_studio/zoom_curve.py +289 -0
  608. yap_studio-1.2.0/tests/conftest.py +1076 -0
  609. yap_studio-1.2.0/tests/fakes/elevenlabs-pp-cli +118 -0
  610. yap_studio-1.2.0/tests/fakes/osxphotos +78 -0
  611. yap_studio-1.2.0/tests/fakes/pexels-pp-cli +25 -0
  612. yap_studio-1.2.0/tests/fakes/wavespeed-pp-cli +147 -0
  613. yap_studio-1.2.0/tests/fixtures/broll_insert_graphs.json +31 -0
  614. yap_studio-1.2.0/tests/fixtures/caption-case-cases.json +29 -0
  615. yap_studio-1.2.0/tests/fixtures/caption_spoken.mjs +59 -0
  616. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/callout_circle.png +0 -0
  617. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/chapter.png +0 -0
  618. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/chart.png +0 -0
  619. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/checklist.png +0 -0
  620. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/choices.png +0 -0
  621. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/comment_cta.png +0 -0
  622. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/comment_drop.png +0 -0
  623. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/edit_timeline.png +0 -0
  624. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/file_drop.png +0 -0
  625. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/flow.png +0 -0
  626. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/gravity_drop.png +0 -0
  627. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/icon_strike.png +0 -0
  628. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_card-collage.png +0 -0
  629. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_card.png +0 -0
  630. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/image_compare.png +0 -0
  631. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/jiggle_delete.png +0 -0
  632. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/name_tag.png +0 -0
  633. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/playing_grid.png +0 -0
  634. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/progress_stat.png +0 -0
  635. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/prompt_bar.png +0 -0
  636. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/quote.png +0 -0
  637. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/reel_feed.png +0 -0
  638. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/specs_list.png +0 -0
  639. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/stat-slot.png +0 -0
  640. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/stat.png +0 -0
  641. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/steps.png +0 -0
  642. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/storyboard.png +0 -0
  643. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/success_check.png +0 -0
  644. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/terminal.png +0 -0
  645. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-bar.png +0 -0
  646. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-block.png +0 -0
  647. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-card.png +0 -0
  648. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-plain.png +0 -0
  649. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-rule.png +0 -0
  650. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-tag.png +0 -0
  651. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag-title.png +0 -0
  652. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/text_tag.png +0 -0
  653. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/transfer.png +0 -0
  654. yap_studio-1.2.0/tests/fixtures/card-frames/darwin/video_card.png +0 -0
  655. yap_studio-1.2.0/tests/fixtures/chapter_probe.mjs +35 -0
  656. yap_studio-1.2.0/tests/fixtures/chapter_viewport.mjs +83 -0
  657. yap_studio-1.2.0/tests/fixtures/filler-gold/clean/gold.json +10 -0
  658. yap_studio-1.2.0/tests/fixtures/filler-gold/clean/removals.json +9 -0
  659. yap_studio-1.2.0/tests/fixtures/filler-gold/keep-cut/gold.json +8 -0
  660. yap_studio-1.2.0/tests/fixtures/filler-gold/keep-cut/removals.json +6 -0
  661. yap_studio-1.2.0/tests/fixtures/filler-gold/partial/gold.json +11 -0
  662. yap_studio-1.2.0/tests/fixtures/filler-gold/partial/removals.json +13 -0
  663. yap_studio-1.2.0/tests/fixtures/gallery_viewport.mjs +489 -0
  664. yap_studio-1.2.0/tests/fixtures/heic_fixture.swift +16 -0
  665. yap_studio-1.2.0/tests/fixtures/hf_card_capture.mjs +67 -0
  666. yap_studio-1.2.0/tests/fixtures/live_capture.mjs +36 -0
  667. yap_studio-1.2.0/tests/fixtures/motion_capture.mjs +67 -0
  668. yap_studio-1.2.0/tests/fixtures/origin-examples.json +354 -0
  669. yap_studio-1.2.0/tests/fixtures/phrase-cases.json +2596 -0
  670. yap_studio-1.2.0/tests/fixtures/pictures/auth.json +11 -0
  671. yap_studio-1.2.0/tests/fixtures/pictures/billings.json +36 -0
  672. yap_studio-1.2.0/tests/fixtures/pictures/dry-run.json +4 -0
  673. yap_studio-1.2.0/tests/fixtures/pictures/price.json +9 -0
  674. yap_studio-1.2.0/tests/fixtures/pictures/run.json +38 -0
  675. yap_studio-1.2.0/tests/fixtures/stock/101.json +46 -0
  676. yap_studio-1.2.0/tests/fixtures/stock/102.json +46 -0
  677. yap_studio-1.2.0/tests/fixtures/stock/103.json +46 -0
  678. yap_studio-1.2.0/tests/fixtures/stock/104.json +46 -0
  679. yap_studio-1.2.0/tests/fixtures/stock/105.json +46 -0
  680. yap_studio-1.2.0/tests/fixtures/stock/large.json +218 -0
  681. yap_studio-1.2.0/tests/fixtures/stock/portrait.json +177 -0
  682. yap_studio-1.2.0/tests/fixtures/top_text_browser.mjs +140 -0
  683. yap_studio-1.2.0/tests/fixtures/wide_card_probe.mjs +76 -0
  684. yap_studio-1.2.0/tests/fixtures/youtube_chapters_browser.mjs +41 -0
  685. yap_studio-1.2.0/tests/hygiene_patterns.py +73 -0
  686. yap_studio-1.2.0/tests/js/caption-ports.test.mjs +117 -0
  687. yap_studio-1.2.0/tests/js/caption-spoken.test.mjs +25 -0
  688. yap_studio-1.2.0/tests/js/card-motion.test.mjs +161 -0
  689. yap_studio-1.2.0/tests/js/fresh-user-browser.mjs +140 -0
  690. yap_studio-1.2.0/tests/js/fresh-user-fixes.test.mjs +60 -0
  691. yap_studio-1.2.0/tests/js/gallery-choices.test.mjs +1257 -0
  692. yap_studio-1.2.0/tests/js/gallery-flow.test.mjs +4854 -0
  693. yap_studio-1.2.0/tests/js/gallery-pick.test.mjs +275 -0
  694. yap_studio-1.2.0/tests/js/home-browser.mjs +170 -0
  695. yap_studio-1.2.0/tests/js/home-model.test.mjs +305 -0
  696. yap_studio-1.2.0/tests/js/learned.test.mjs +464 -0
  697. yap_studio-1.2.0/tests/js/looks.test.mjs +820 -0
  698. yap_studio-1.2.0/tests/js/outline.test.mjs +96 -0
  699. yap_studio-1.2.0/tests/js/phrases.test.mjs +87 -0
  700. yap_studio-1.2.0/tests/js/privacy.test.mjs +134 -0
  701. yap_studio-1.2.0/tests/js/review-approval.test.mjs +116 -0
  702. yap_studio-1.2.0/tests/js/review-caption-browser.mjs +119 -0
  703. yap_studio-1.2.0/tests/js/review-copy.test.mjs +152 -0
  704. yap_studio-1.2.0/tests/js/review-cut.test.mjs +531 -0
  705. yap_studio-1.2.0/tests/js/review-join-browser.mjs +101 -0
  706. yap_studio-1.2.0/tests/js/review-list.test.mjs +259 -0
  707. yap_studio-1.2.0/tests/js/review-pin-browser.mjs +206 -0
  708. yap_studio-1.2.0/tests/js/review-pin.test.mjs +801 -0
  709. yap_studio-1.2.0/tests/js/style-frame.test.mjs +121 -0
  710. yap_studio-1.2.0/tests/js/taste.test.mjs +581 -0
  711. yap_studio-1.2.0/tests/js/text-hook.test.mjs +60 -0
  712. yap_studio-1.2.0/tests/js/timeline.test.mjs +2062 -0
  713. yap_studio-1.2.0/tests/js/top-text.test.mjs +36 -0
  714. yap_studio-1.2.0/tests/offline_renderer.py +68 -0
  715. yap_studio-1.2.0/tests/pictures_helpers.py +14 -0
  716. yap_studio-1.2.0/tests/release_notes.py +13 -0
  717. yap_studio-1.2.0/tests/synth.py +1966 -0
  718. yap_studio-1.2.0/tests/synth_broll.py +120 -0
  719. yap_studio-1.2.0/tests/taste_finals.py +606 -0
  720. yap_studio-1.2.0/tests/test_anchors.py +48 -0
  721. yap_studio-1.2.0/tests/test_answers_brand.py +309 -0
  722. yap_studio-1.2.0/tests/test_asr_exit.py +56 -0
  723. yap_studio-1.2.0/tests/test_assemble.py +3964 -0
  724. yap_studio-1.2.0/tests/test_assemble_audio.py +493 -0
  725. yap_studio-1.2.0/tests/test_assemble_picture.py +3206 -0
  726. yap_studio-1.2.0/tests/test_attribution.py +221 -0
  727. yap_studio-1.2.0/tests/test_audio.py +281 -0
  728. yap_studio-1.2.0/tests/test_audio_chain.py +158 -0
  729. yap_studio-1.2.0/tests/test_backends.py +1342 -0
  730. yap_studio-1.2.0/tests/test_background_timeline.py +148 -0
  731. yap_studio-1.2.0/tests/test_beats.py +246 -0
  732. yap_studio-1.2.0/tests/test_bleep.py +563 -0
  733. yap_studio-1.2.0/tests/test_brand.py +396 -0
  734. yap_studio-1.2.0/tests/test_brand_words.py +71 -0
  735. yap_studio-1.2.0/tests/test_broll_e2e.py +149 -0
  736. yap_studio-1.2.0/tests/test_broll_limits.py +165 -0
  737. yap_studio-1.2.0/tests/test_broll_loop.py +393 -0
  738. yap_studio-1.2.0/tests/test_broll_match.py +1046 -0
  739. yap_studio-1.2.0/tests/test_broll_split.py +515 -0
  740. yap_studio-1.2.0/tests/test_cache.py +84 -0
  741. yap_studio-1.2.0/tests/test_calibration.py +238 -0
  742. yap_studio-1.2.0/tests/test_camera3d.py +1304 -0
  743. yap_studio-1.2.0/tests/test_camera3d_look.py +1538 -0
  744. yap_studio-1.2.0/tests/test_caption_backing.py +520 -0
  745. yap_studio-1.2.0/tests/test_caption_case.py +156 -0
  746. yap_studio-1.2.0/tests/test_caption_contrast.py +649 -0
  747. yap_studio-1.2.0/tests/test_caption_contrast_render.py +87 -0
  748. yap_studio-1.2.0/tests/test_caption_layout_checks.py +682 -0
  749. yap_studio-1.2.0/tests/test_caption_layout_render.py +162 -0
  750. yap_studio-1.2.0/tests/test_caption_legibility.py +202 -0
  751. yap_studio-1.2.0/tests/test_caption_placement_render.py +68 -0
  752. yap_studio-1.2.0/tests/test_caption_registry_ports.py +319 -0
  753. yap_studio-1.2.0/tests/test_caption_rise.py +237 -0
  754. yap_studio-1.2.0/tests/test_caption_rise_render.py +179 -0
  755. yap_studio-1.2.0/tests/test_caption_spoken.py +146 -0
  756. yap_studio-1.2.0/tests/test_caption_spoken_render.py +85 -0
  757. yap_studio-1.2.0/tests/test_caption_words.py +404 -0
  758. yap_studio-1.2.0/tests/test_captions.py +408 -0
  759. yap_studio-1.2.0/tests/test_captions_ground.py +282 -0
  760. yap_studio-1.2.0/tests/test_captions_render.py +2156 -0
  761. yap_studio-1.2.0/tests/test_card_motion.py +287 -0
  762. yap_studio-1.2.0/tests/test_card_motion_render.py +365 -0
  763. yap_studio-1.2.0/tests/test_card_project.py +68 -0
  764. yap_studio-1.2.0/tests/test_cards.py +6588 -0
  765. yap_studio-1.2.0/tests/test_cards_render.py +2168 -0
  766. yap_studio-1.2.0/tests/test_chapters.py +248 -0
  767. yap_studio-1.2.0/tests/test_chapters_render.py +210 -0
  768. yap_studio-1.2.0/tests/test_ci_release_gate.py +174 -0
  769. yap_studio-1.2.0/tests/test_ci_shards.py +141 -0
  770. yap_studio-1.2.0/tests/test_cli.py +487 -0
  771. yap_studio-1.2.0/tests/test_cli_captions.py +1292 -0
  772. yap_studio-1.2.0/tests/test_cli_cut.py +195 -0
  773. yap_studio-1.2.0/tests/test_cli_faces.py +763 -0
  774. yap_studio-1.2.0/tests/test_cli_fillers.py +431 -0
  775. yap_studio-1.2.0/tests/test_cli_ingest.py +181 -0
  776. yap_studio-1.2.0/tests/test_cli_matte.py +477 -0
  777. yap_studio-1.2.0/tests/test_cli_planner.py +333 -0
  778. yap_studio-1.2.0/tests/test_cli_review.py +717 -0
  779. yap_studio-1.2.0/tests/test_cli_taste.py +666 -0
  780. yap_studio-1.2.0/tests/test_cli_timeline.py +190 -0
  781. yap_studio-1.2.0/tests/test_cli_verify.py +201 -0
  782. yap_studio-1.2.0/tests/test_coverage.py +157 -0
  783. yap_studio-1.2.0/tests/test_covers_cli.py +194 -0
  784. yap_studio-1.2.0/tests/test_covers_layout.py +514 -0
  785. yap_studio-1.2.0/tests/test_covers_pick.py +187 -0
  786. yap_studio-1.2.0/tests/test_covers_render.py +228 -0
  787. yap_studio-1.2.0/tests/test_covers_wide.py +621 -0
  788. yap_studio-1.2.0/tests/test_cut.py +2279 -0
  789. yap_studio-1.2.0/tests/test_declared.py +244 -0
  790. yap_studio-1.2.0/tests/test_detect.py +769 -0
  791. yap_studio-1.2.0/tests/test_edges.py +1031 -0
  792. yap_studio-1.2.0/tests/test_edit_schema.py +63 -0
  793. yap_studio-1.2.0/tests/test_editor_cards.py +231 -0
  794. yap_studio-1.2.0/tests/test_edl.py +505 -0
  795. yap_studio-1.2.0/tests/test_engine_child.py +474 -0
  796. yap_studio-1.2.0/tests/test_errors.py +315 -0
  797. yap_studio-1.2.0/tests/test_exit.py +319 -0
  798. yap_studio-1.2.0/tests/test_eyedropper_command.py +81 -0
  799. yap_studio-1.2.0/tests/test_face_clearance_check.py +505 -0
  800. yap_studio-1.2.0/tests/test_faces_caption_modes.py +271 -0
  801. yap_studio-1.2.0/tests/test_faces_clearance.py +758 -0
  802. yap_studio-1.2.0/tests/test_faces_detect.py +931 -0
  803. yap_studio-1.2.0/tests/test_faces_final.py +92 -0
  804. yap_studio-1.2.0/tests/test_faces_mapping.py +217 -0
  805. yap_studio-1.2.0/tests/test_faces_placement.py +460 -0
  806. yap_studio-1.2.0/tests/test_faces_project.py +155 -0
  807. yap_studio-1.2.0/tests/test_fcpxml.py +242 -0
  808. yap_studio-1.2.0/tests/test_feedback_apply.py +1170 -0
  809. yap_studio-1.2.0/tests/test_feedback_audio.py +376 -0
  810. yap_studio-1.2.0/tests/test_feedback_batch.py +776 -0
  811. yap_studio-1.2.0/tests/test_feedback_broll.py +461 -0
  812. yap_studio-1.2.0/tests/test_feedback_clarify.py +314 -0
  813. yap_studio-1.2.0/tests/test_feedback_cli.py +601 -0
  814. yap_studio-1.2.0/tests/test_feedback_edits.py +1128 -0
  815. yap_studio-1.2.0/tests/test_feedback_keeps.py +403 -0
  816. yap_studio-1.2.0/tests/test_feedback_locate.py +104 -0
  817. yap_studio-1.2.0/tests/test_feedback_moments.py +152 -0
  818. yap_studio-1.2.0/tests/test_feedback_outline.py +769 -0
  819. yap_studio-1.2.0/tests/test_feedback_pins.py +556 -0
  820. yap_studio-1.2.0/tests/test_feedback_release.py +377 -0
  821. yap_studio-1.2.0/tests/test_feedback_removed.py +160 -0
  822. yap_studio-1.2.0/tests/test_feedback_replies.py +799 -0
  823. yap_studio-1.2.0/tests/test_feedback_spelling.py +437 -0
  824. yap_studio-1.2.0/tests/test_feedback_versions.py +998 -0
  825. yap_studio-1.2.0/tests/test_ffmpeg.py +712 -0
  826. yap_studio-1.2.0/tests/test_file_drop.py +651 -0
  827. yap_studio-1.2.0/tests/test_fillers.py +3081 -0
  828. yap_studio-1.2.0/tests/test_fillers_gold.py +777 -0
  829. yap_studio-1.2.0/tests/test_fillers_rules.py +720 -0
  830. yap_studio-1.2.0/tests/test_flash.py +787 -0
  831. yap_studio-1.2.0/tests/test_fonts.py +344 -0
  832. yap_studio-1.2.0/tests/test_fresh_user_browser.py +88 -0
  833. yap_studio-1.2.0/tests/test_fresh_user_fixes.py +157 -0
  834. yap_studio-1.2.0/tests/test_gallery_cutout.py +211 -0
  835. yap_studio-1.2.0/tests/test_gallery_live.py +543 -0
  836. yap_studio-1.2.0/tests/test_gallery_pick.py +2200 -0
  837. yap_studio-1.2.0/tests/test_gallery_still.py +638 -0
  838. yap_studio-1.2.0/tests/test_grade.py +129 -0
  839. yap_studio-1.2.0/tests/test_grade_caption_contrast.py +135 -0
  840. yap_studio-1.2.0/tests/test_grade_command.py +52 -0
  841. yap_studio-1.2.0/tests/test_grade_compare.py +85 -0
  842. yap_studio-1.2.0/tests/test_grade_compare_timeline.py +150 -0
  843. yap_studio-1.2.0/tests/test_grade_eyedropper.py +92 -0
  844. yap_studio-1.2.0/tests/test_grade_schemas.py +57 -0
  845. yap_studio-1.2.0/tests/test_graphics_clearance.py +898 -0
  846. yap_studio-1.2.0/tests/test_green_screen.py +450 -0
  847. yap_studio-1.2.0/tests/test_hdr.py +361 -0
  848. yap_studio-1.2.0/tests/test_hf_registry.py +690 -0
  849. yap_studio-1.2.0/tests/test_hf_registry_cards.py +854 -0
  850. yap_studio-1.2.0/tests/test_hf_registry_cards_render.py +383 -0
  851. yap_studio-1.2.0/tests/test_hf_registry_cli.py +106 -0
  852. yap_studio-1.2.0/tests/test_hf_registry_render.py +171 -0
  853. yap_studio-1.2.0/tests/test_home_bridge.py +703 -0
  854. yap_studio-1.2.0/tests/test_home_browser.py +65 -0
  855. yap_studio-1.2.0/tests/test_home_command.py +151 -0
  856. yap_studio-1.2.0/tests/test_home_link.py +154 -0
  857. yap_studio-1.2.0/tests/test_home_server.py +680 -0
  858. yap_studio-1.2.0/tests/test_home_state.py +422 -0
  859. yap_studio-1.2.0/tests/test_hygiene.py +117 -0
  860. yap_studio-1.2.0/tests/test_hyperframes_bump.py +738 -0
  861. yap_studio-1.2.0/tests/test_ingest.py +1388 -0
  862. yap_studio-1.2.0/tests/test_install_info.py +271 -0
  863. yap_studio-1.2.0/tests/test_isolated.py +361 -0
  864. yap_studio-1.2.0/tests/test_jiggle_delete.py +221 -0
  865. yap_studio-1.2.0/tests/test_joins.py +3246 -0
  866. yap_studio-1.2.0/tests/test_joins_cards.py +294 -0
  867. yap_studio-1.2.0/tests/test_kept_words.py +304 -0
  868. yap_studio-1.2.0/tests/test_landscape.py +322 -0
  869. yap_studio-1.2.0/tests/test_layer_checks.py +749 -0
  870. yap_studio-1.2.0/tests/test_leftovers.py +368 -0
  871. yap_studio-1.2.0/tests/test_letters.py +488 -0
  872. yap_studio-1.2.0/tests/test_letters_render.py +234 -0
  873. yap_studio-1.2.0/tests/test_local_http.py +39 -0
  874. yap_studio-1.2.0/tests/test_matte_check.py +716 -0
  875. yap_studio-1.2.0/tests/test_matte_chroma.py +267 -0
  876. yap_studio-1.2.0/tests/test_matte_composite.py +677 -0
  877. yap_studio-1.2.0/tests/test_matte_edge_colour.py +368 -0
  878. yap_studio-1.2.0/tests/test_matte_hyperframes.py +563 -0
  879. yap_studio-1.2.0/tests/test_matte_make.py +583 -0
  880. yap_studio-1.2.0/tests/test_matte_model.py +288 -0
  881. yap_studio-1.2.0/tests/test_matte_project.py +627 -0
  882. yap_studio-1.2.0/tests/test_matte_refine.py +270 -0
  883. yap_studio-1.2.0/tests/test_matte_timing.py +85 -0
  884. yap_studio-1.2.0/tests/test_mcp.py +290 -0
  885. yap_studio-1.2.0/tests/test_media_album.py +572 -0
  886. yap_studio-1.2.0/tests/test_media_captured.py +373 -0
  887. yap_studio-1.2.0/tests/test_media_catalog.py +900 -0
  888. yap_studio-1.2.0/tests/test_media_describe.py +268 -0
  889. yap_studio-1.2.0/tests/test_media_frame.py +24 -0
  890. yap_studio-1.2.0/tests/test_media_inventory.py +872 -0
  891. yap_studio-1.2.0/tests/test_media_select.py +812 -0
  892. yap_studio-1.2.0/tests/test_media_sheet.py +836 -0
  893. yap_studio-1.2.0/tests/test_media_sound.py +206 -0
  894. yap_studio-1.2.0/tests/test_moment_clones.py +569 -0
  895. yap_studio-1.2.0/tests/test_moment_picture.py +166 -0
  896. yap_studio-1.2.0/tests/test_moment_receipts.py +150 -0
  897. yap_studio-1.2.0/tests/test_moment_timeline.py +263 -0
  898. yap_studio-1.2.0/tests/test_moments.py +129 -0
  899. yap_studio-1.2.0/tests/test_music_elevenlabs.py +604 -0
  900. yap_studio-1.2.0/tests/test_music_file.py +625 -0
  901. yap_studio-1.2.0/tests/test_number_behind.py +387 -0
  902. yap_studio-1.2.0/tests/test_number_stages.py +492 -0
  903. yap_studio-1.2.0/tests/test_opening_push.py +82 -0
  904. yap_studio-1.2.0/tests/test_outline_server.py +386 -0
  905. yap_studio-1.2.0/tests/test_overlay_timeline.py +308 -0
  906. yap_studio-1.2.0/tests/test_owner_folders.py +1369 -0
  907. yap_studio-1.2.0/tests/test_paths.py +1173 -0
  908. yap_studio-1.2.0/tests/test_pause_threshold.py +235 -0
  909. yap_studio-1.2.0/tests/test_pictures_guard.py +283 -0
  910. yap_studio-1.2.0/tests/test_pictures_imagery.py +174 -0
  911. yap_studio-1.2.0/tests/test_pictures_make.py +359 -0
  912. yap_studio-1.2.0/tests/test_pictures_provider.py +175 -0
  913. yap_studio-1.2.0/tests/test_pictures_review.py +677 -0
  914. yap_studio-1.2.0/tests/test_pictures_sheet.py +176 -0
  915. yap_studio-1.2.0/tests/test_plan.py +192 -0
  916. yap_studio-1.2.0/tests/test_planner_anchors.py +110 -0
  917. yap_studio-1.2.0/tests/test_planner_broll.py +1071 -0
  918. yap_studio-1.2.0/tests/test_planner_cards.py +1882 -0
  919. yap_studio-1.2.0/tests/test_platform.py +217 -0
  920. yap_studio-1.2.0/tests/test_plugins.py +151 -0
  921. yap_studio-1.2.0/tests/test_presets.py +174 -0
  922. yap_studio-1.2.0/tests/test_privacy.py +177 -0
  923. yap_studio-1.2.0/tests/test_process.py +31 -0
  924. yap_studio-1.2.0/tests/test_product_feedback.py +476 -0
  925. yap_studio-1.2.0/tests/test_project.py +579 -0
  926. yap_studio-1.2.0/tests/test_readme.py +137 -0
  927. yap_studio-1.2.0/tests/test_rebase.py +1180 -0
  928. yap_studio-1.2.0/tests/test_receipt.py +80 -0
  929. yap_studio-1.2.0/tests/test_registry.py +118 -0
  930. yap_studio-1.2.0/tests/test_registry_scanner.py +206 -0
  931. yap_studio-1.2.0/tests/test_release.py +556 -0
  932. yap_studio-1.2.0/tests/test_release_check_scope.py +124 -0
  933. yap_studio-1.2.0/tests/test_relisten.py +1053 -0
  934. yap_studio-1.2.0/tests/test_render.py +2622 -0
  935. yap_studio-1.2.0/tests/test_repeats.py +192 -0
  936. yap_studio-1.2.0/tests/test_report.py +379 -0
  937. yap_studio-1.2.0/tests/test_review_caption_fix.py +462 -0
  938. yap_studio-1.2.0/tests/test_review_detach.py +455 -0
  939. yap_studio-1.2.0/tests/test_review_export.py +643 -0
  940. yap_studio-1.2.0/tests/test_review_findings.py +865 -0
  941. yap_studio-1.2.0/tests/test_review_join_findings.py +201 -0
  942. yap_studio-1.2.0/tests/test_review_js.py +228 -0
  943. yap_studio-1.2.0/tests/test_review_map.py +184 -0
  944. yap_studio-1.2.0/tests/test_review_media.py +366 -0
  945. yap_studio-1.2.0/tests/test_review_model.py +749 -0
  946. yap_studio-1.2.0/tests/test_review_phone.py +477 -0
  947. yap_studio-1.2.0/tests/test_review_pin_browser.py +110 -0
  948. yap_studio-1.2.0/tests/test_review_rounds.py +492 -0
  949. yap_studio-1.2.0/tests/test_review_series.py +287 -0
  950. yap_studio-1.2.0/tests/test_review_server.py +2720 -0
  951. yap_studio-1.2.0/tests/test_review_store.py +826 -0
  952. yap_studio-1.2.0/tests/test_review_taste.py +280 -0
  953. yap_studio-1.2.0/tests/test_run.py +771 -0
  954. yap_studio-1.2.0/tests/test_run_detach.py +932 -0
  955. yap_studio-1.2.0/tests/test_scripts.py +66 -0
  956. yap_studio-1.2.0/tests/test_setup_checks.py +91 -0
  957. yap_studio-1.2.0/tests/test_sfx.py +784 -0
  958. yap_studio-1.2.0/tests/test_sfx_extras.py +522 -0
  959. yap_studio-1.2.0/tests/test_sfx_made.py +413 -0
  960. yap_studio-1.2.0/tests/test_smooth_joins.py +761 -0
  961. yap_studio-1.2.0/tests/test_spans.py +252 -0
  962. yap_studio-1.2.0/tests/test_stage_captions.py +2600 -0
  963. yap_studio-1.2.0/tests/test_stage_fingerprints.py +249 -0
  964. yap_studio-1.2.0/tests/test_stage_graphics.py +2217 -0
  965. yap_studio-1.2.0/tests/test_status.py +2042 -0
  966. yap_studio-1.2.0/tests/test_step_in.py +181 -0
  967. yap_studio-1.2.0/tests/test_stock_get.py +466 -0
  968. yap_studio-1.2.0/tests/test_stock_guard_cards.py +367 -0
  969. yap_studio-1.2.0/tests/test_stock_provider.py +400 -0
  970. yap_studio-1.2.0/tests/test_stock_sheet.py +452 -0
  971. yap_studio-1.2.0/tests/test_storyboard.py +354 -0
  972. yap_studio-1.2.0/tests/test_structure.py +1325 -0
  973. yap_studio-1.2.0/tests/test_studio_export.py +788 -0
  974. yap_studio-1.2.0/tests/test_style.py +841 -0
  975. yap_studio-1.2.0/tests/test_style_answers.py +495 -0
  976. yap_studio-1.2.0/tests/test_style_broll.py +332 -0
  977. yap_studio-1.2.0/tests/test_style_caption_ground.py +135 -0
  978. yap_studio-1.2.0/tests/test_style_giant.py +211 -0
  979. yap_studio-1.2.0/tests/test_style_page.py +292 -0
  980. yap_studio-1.2.0/tests/test_style_pick_detach.py +443 -0
  981. yap_studio-1.2.0/tests/test_style_save.py +620 -0
  982. yap_studio-1.2.0/tests/test_sync.py +732 -0
  983. yap_studio-1.2.0/tests/test_synth.py +326 -0
  984. yap_studio-1.2.0/tests/test_take_levels.py +501 -0
  985. yap_studio-1.2.0/tests/test_tall_box.py +520 -0
  986. yap_studio-1.2.0/tests/test_taste.py +1334 -0
  987. yap_studio-1.2.0/tests/test_taste_check.py +662 -0
  988. yap_studio-1.2.0/tests/test_taste_inbox.py +583 -0
  989. yap_studio-1.2.0/tests/test_taste_learn.py +3360 -0
  990. yap_studio-1.2.0/tests/test_taste_learned.py +166 -0
  991. yap_studio-1.2.0/tests/test_taste_render.py +1173 -0
  992. yap_studio-1.2.0/tests/test_templates_cli.py +857 -0
  993. yap_studio-1.2.0/tests/test_templates_command.py +445 -0
  994. yap_studio-1.2.0/tests/test_text_hook.py +192 -0
  995. yap_studio-1.2.0/tests/test_text_hook_overlaps.py +291 -0
  996. yap_studio-1.2.0/tests/test_text_hook_surfaces.py +72 -0
  997. yap_studio-1.2.0/tests/test_text_rules.py +181 -0
  998. yap_studio-1.2.0/tests/test_timeline.py +2826 -0
  999. yap_studio-1.2.0/tests/test_timeline_broll_facts.py +194 -0
  1000. yap_studio-1.2.0/tests/test_title_looks.py +761 -0
  1001. yap_studio-1.2.0/tests/test_tools.py +558 -0
  1002. yap_studio-1.2.0/tests/test_top_text.py +207 -0
  1003. yap_studio-1.2.0/tests/test_top_text_browser.py +57 -0
  1004. yap_studio-1.2.0/tests/test_transcript.py +154 -0
  1005. yap_studio-1.2.0/tests/test_transcript_shared.py +438 -0
  1006. yap_studio-1.2.0/tests/test_transcript_take_job.py +259 -0
  1007. yap_studio-1.2.0/tests/test_transitions.py +213 -0
  1008. yap_studio-1.2.0/tests/test_verify.py +1320 -0
  1009. yap_studio-1.2.0/tests/test_verify_eyedropper.py +54 -0
  1010. yap_studio-1.2.0/tests/test_verify_grade.py +228 -0
  1011. yap_studio-1.2.0/tests/test_verify_grade_limit.py +202 -0
  1012. yap_studio-1.2.0/tests/test_video.py +494 -0
  1013. yap_studio-1.2.0/tests/test_video_kinds.py +426 -0
  1014. yap_studio-1.2.0/tests/test_video_type.py +392 -0
  1015. yap_studio-1.2.0/tests/test_voiceover.py +354 -0
  1016. yap_studio-1.2.0/tests/test_watch_findings.py +689 -0
  1017. yap_studio-1.2.0/tests/test_watch_images.py +175 -0
  1018. yap_studio-1.2.0/tests/test_watch_pack.py +1040 -0
  1019. yap_studio-1.2.0/tests/test_watch_publish.py +563 -0
  1020. yap_studio-1.2.0/tests/test_watch_scan.py +748 -0
  1021. yap_studio-1.2.0/tests/test_wide_broll.py +331 -0
  1022. yap_studio-1.2.0/tests/test_wide_broll_review.py +247 -0
  1023. yap_studio-1.2.0/tests/test_wide_cards.py +640 -0
  1024. yap_studio-1.2.0/tests/test_wide_titles.py +383 -0
  1025. yap_studio-1.2.0/tests/test_word_fixes.py +248 -0
  1026. yap_studio-1.2.0/tests/test_words.py +92 -0
  1027. yap_studio-1.2.0/tests/test_workspace.py +3220 -0
  1028. yap_studio-1.2.0/tests/test_workspace_update.py +352 -0
  1029. yap_studio-1.2.0/tests/test_xmeml.py +413 -0
  1030. yap_studio-1.2.0/tests/test_youtube_chapters.py +66 -0
  1031. yap_studio-1.2.0/tests/test_youtube_chapters_browser.py +98 -0
  1032. yap_studio-1.2.0/tests/test_zoom_curve.py +311 -0
  1033. yap_studio-1.2.0/uv.lock +1823 -0
  1034. yap_studio-1.2.0/workspace/.claude/commands/edit.md +17 -0
  1035. yap_studio-1.2.0/workspace/.claude/settings.json +10 -0
  1036. yap_studio-1.2.0/workspace/.claude/skills/edit-video/SKILL.md +484 -0
  1037. yap_studio-1.2.0/workspace/.claude/skills/voiceover-video/SKILL.md +154 -0
  1038. yap_studio-1.2.0/workspace/.codex/config.toml +14 -0
  1039. yap_studio-1.2.0/workspace/.codex/rules/yap-studio.rules +13 -0
  1040. yap_studio-1.2.0/workspace/.cursor/cli.json +9 -0
  1041. yap_studio-1.2.0/workspace/.cursor/permissions.json +15 -0
  1042. yap_studio-1.2.0/workspace/AGENTS.md +316 -0
  1043. yap_studio-1.2.0/workspace/CLAUDE.md +1 -0
  1044. yap_studio-1.2.0/workspace/Start here.html +136 -0
  1045. yap_studio-1.2.0/workspace/brand/fonts/README.md +1 -0
  1046. yap_studio-1.2.0/workspace/inbox/README.md +1 -0
  1047. yap_studio-1.2.0/workspace/new_project.py +493 -0
  1048. 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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Report a security issue
4
+ url: https://github.com/cathrynlavery/yap-studio/security/advisories/new
5
+ about: Send vulnerability reports privately.
@@ -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