@oh-story/dsh 0.1.12 → 0.1.13

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 (264) hide show
  1. package/README.md +17 -11
  2. package/lib/client.js +85 -35
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +41 -36
  5. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +340 -13
  6. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +4 -2
  7. package/lib/drama/skills/short-drama-edit/SKILL.md +32 -12
  8. package/lib/drama/skills/short-drama-edit/references/still-cuts.md +90 -0
  9. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1035 -145
  10. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +48 -0
  11. package/lib/drama/skills/short-drama-produce/SKILL.md +6 -1
  12. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +12 -0
  13. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +138 -9
  14. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +6 -0
  15. package/lib/drama/skills/short-drama-storyboard/SKILL.md +2 -0
  16. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +3 -1
  17. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -0
  18. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +14 -0
  19. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +19 -6
  20. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  21. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -0
  22. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +4 -1
  23. package/lib/index.js +16 -7
  24. package/lib/index.js.map +2 -2
  25. package/lib/novel-to-game/README.md +98 -44
  26. package/lib/novel-to-game/README_ZH.md +100 -46
  27. package/lib/novel-to-game/VERSION +1 -1
  28. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +27 -202
  29. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +23 -115
  30. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/chamber.webp +0 -0
  31. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_night.webp +0 -0
  32. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_rain.webp +0 -0
  33. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/garden.webp +0 -0
  34. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/hall.webp +0 -0
  35. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/kitchen.webp +0 -0
  36. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street.webp +0 -0
  37. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street_dawn.webp +0 -0
  38. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/temple.webp +0 -0
  39. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/moon.webp +0 -0
  40. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/angry.webp +0 -0
  41. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/blush.webp +0 -0
  42. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/neutral.webp +0 -0
  43. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/sad.webp +0 -0
  44. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/smile.webp +0 -0
  45. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/surprised.webp +0 -0
  46. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/angry.webp +0 -0
  47. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/blush.webp +0 -0
  48. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/neutral.webp +0 -0
  49. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/sad.webp +0 -0
  50. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/smile.webp +0 -0
  51. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/surprised.webp +0 -0
  52. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/angry.webp +0 -0
  53. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/blush.webp +0 -0
  54. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/neutral.webp +0 -0
  55. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/sad.webp +0 -0
  56. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/smile.webp +0 -0
  57. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/surprised.webp +0 -0
  58. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/angry.webp +0 -0
  59. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/blush.webp +0 -0
  60. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/neutral.webp +0 -0
  61. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/sad.webp +0 -0
  62. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/smile.webp +0 -0
  63. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/surprised.webp +0 -0
  64. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/angry.webp +0 -0
  65. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/blush.webp +0 -0
  66. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/neutral.webp +0 -0
  67. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/sad.webp +0 -0
  68. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/smile.webp +0 -0
  69. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/surprised.webp +0 -0
  70. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +326 -2503
  71. package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +71 -4
  72. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/adv.js +221 -0
  73. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +113 -257
  74. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +511 -3026
  75. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/menus.js +277 -0
  76. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/petals.js +67 -0
  77. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/stage.js +180 -0
  78. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/store.js +70 -0
  79. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common.js +198 -0
  80. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common2.js +204 -0
  81. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common3.js +198 -0
  82. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/dates.js +186 -0
  83. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/index.js +122 -0
  84. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/meng.js +190 -0
  85. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pan.js +212 -0
  86. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pinger.js +198 -0
  87. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/xuee.js +199 -0
  88. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/yue.js +214 -0
  89. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -2
  90. package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +182 -45
  91. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +7 -17
  92. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +9 -9
  93. package/lib/novel-to-game/manifest.json +303 -78
  94. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +7 -2
  95. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +2 -0
  96. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +2 -0
  97. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +9 -0
  98. package/lib/types/client/drama-production-view.d.ts +11 -0
  99. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  100. package/lib/types/client/file-activity.d.ts +1 -1
  101. package/lib/types/client/file-activity.d.ts.map +1 -1
  102. package/lib/types/client/production-prompts.d.ts +7 -1
  103. package/lib/types/client/production-prompts.d.ts.map +1 -1
  104. package/lib/types/client/production-runtime.d.ts +7 -2
  105. package/lib/types/client/production-runtime.d.ts.map +1 -1
  106. package/lib/types/drama-adapters.d.ts.map +1 -1
  107. package/lib/types/skill-provider.d.ts.map +1 -1
  108. package/lib/types/video-project.d.ts.map +1 -1
  109. package/lib/video-recap/CHANGELOG.md +108 -1
  110. package/lib/video-recap/README.en.md +18 -14
  111. package/lib/video-recap/README.md +18 -14
  112. package/lib/video-recap/manifest.json +297 -321
  113. package/lib/video-recap/skills/video-assemble/SKILL.md +18 -16
  114. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +3 -1
  115. package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +5 -5
  116. package/lib/video-recap/skills/video-assemble/references/packaging.md +4 -4
  117. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +10 -10
  118. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +13 -2
  119. package/lib/video-recap/skills/video-assemble/scripts/adoption/av_clock.py +109 -0
  120. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +4 -1
  121. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +2 -9
  122. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +188 -51
  123. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +0 -1
  124. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +32 -75
  125. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +8 -15
  126. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +202 -161
  127. package/lib/video-recap/skills/video-assemble/scripts/codec_peak.py +112 -0
  128. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +10 -101
  129. package/lib/video-recap/skills/video-assemble/scripts/jianying/builders.py +44 -475
  130. package/lib/video-recap/skills/video-assemble/scripts/jianying/model.py +1 -22
  131. package/lib/video-recap/skills/video-assemble/scripts/jianying/templates.py +0 -3
  132. package/lib/video-recap/skills/video-assemble/scripts/jianying/timeline_contract.py +36 -103
  133. package/lib/video-recap/skills/video-assemble/scripts/jianying/tracks.py +0 -8
  134. package/lib/video-recap/skills/video-assemble/scripts/jianying/writer.py +28 -203
  135. package/lib/video-recap/skills/video-assemble/scripts/lib.py +20 -34
  136. package/lib/video-recap/skills/video-assemble/scripts/loudness.py +332 -0
  137. package/lib/video-recap/skills/video-assemble/scripts/media.py +158 -38
  138. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +30 -16
  139. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +49 -8
  140. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +17 -6
  141. package/lib/video-recap/skills/video-assemble/scripts/subtitles/core.py +24 -2
  142. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +2 -5
  143. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +2 -9
  144. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +12 -34
  145. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +3 -4
  146. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +28 -2
  147. package/lib/video-recap/skills/video-cut/SKILL.md +37 -11
  148. package/lib/video-recap/skills/video-cut/references/shot-review.md +1 -1
  149. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -34
  150. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +96 -124
  151. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +97 -182
  152. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +177 -166
  153. package/lib/video-recap/skills/video-cut/scripts/frame_grid.py +249 -0
  154. package/lib/video-recap/skills/video-cut/scripts/lib.py +0 -3
  155. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +173 -7
  156. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +234 -151
  157. package/lib/video-recap/skills/video-cut/scripts/sentence_gate.py +189 -0
  158. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +2 -6
  159. package/lib/video-recap/skills/video-recap/SKILL.md +24 -27
  160. package/lib/video-recap/skills/video-recap/references/audio-routing.md +8 -6
  161. package/lib/video-recap/skills/video-recap/references/config-playbook.md +8 -11
  162. package/lib/video-recap/skills/video-recap/references/data-schema.md +131 -74
  163. package/lib/video-recap/skills/video-recap/references/resource-library.md +17 -1
  164. package/lib/video-recap/skills/video-recap/scripts/doctor.py +51 -268
  165. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +89 -254
  166. package/lib/video-recap/skills/video-recap/scripts/lib.py +81 -70
  167. package/lib/video-recap/skills/video-recap/scripts/library.py +40 -4
  168. package/lib/video-recap/skills/video-recap/scripts/materials.py +13 -80
  169. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +49 -17
  170. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +1 -3
  171. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +86 -116
  172. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +87 -23
  173. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +0 -39
  174. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +37 -135
  175. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +118 -127
  176. package/lib/video-recap/skills/video-recap/scripts/resources/__init__.py +4 -0
  177. package/lib/video-recap/skills/video-recap/scripts/{resource_lock.py → resources/lock.py} +1 -1
  178. package/lib/video-recap/skills/video-recap/scripts/{project_binding.py → resources/project_binding.py} +78 -17
  179. package/lib/video-recap/skills/video-reference/SKILL.md +108 -0
  180. package/lib/video-recap/skills/video-reference/references/reference-schema.md +139 -0
  181. package/lib/video-recap/skills/video-reference/scripts/lib.py +85 -0
  182. package/lib/video-recap/skills/video-reference/scripts/reference.py +96 -0
  183. package/lib/video-recap/skills/video-reference/scripts/reference_check.py +553 -0
  184. package/lib/video-recap/skills/video-reference/scripts/reference_frames.py +122 -0
  185. package/lib/video-recap/skills/video-reference/scripts/reference_measure.py +253 -0
  186. package/lib/video-recap/skills/video-reference/scripts/reference_profile.py +271 -0
  187. package/lib/video-recap/skills/video-script/SKILL.md +9 -7
  188. package/lib/video-recap/skills/video-script/scripts/agent_text.py +18 -267
  189. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +12 -30
  190. package/lib/video-recap/skills/video-script/scripts/entry_suggestion.py +125 -0
  191. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +2 -26
  192. package/lib/video-recap/skills/video-script/scripts/lib.py +5 -15
  193. package/lib/video-recap/skills/video-script/scripts/lint_summary.py +184 -0
  194. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +120 -100
  195. package/lib/video-recap/skills/video-script/scripts/review.py +3 -34
  196. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +20 -46
  197. package/lib/video-recap/skills/video-script/scripts/review_response.py +120 -258
  198. package/lib/video-recap/skills/video-script/scripts/review_runner.py +2 -10
  199. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +89 -5
  200. package/lib/video-recap/skills/video-script/scripts/validate.py +26 -34
  201. package/lib/video-recap/skills/video-understanding/SKILL.md +29 -4
  202. package/lib/video-recap/skills/video-understanding/references/data-schema.md +5 -22
  203. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +24 -121
  204. package/lib/video-recap/skills/video-understanding/scripts/asr.py +11 -5
  205. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +15 -24
  206. package/lib/video-recap/skills/video-understanding/scripts/briefing/builder.py +59 -25
  207. package/lib/video-recap/skills/video-understanding/scripts/briefing/context.py +39 -3
  208. package/lib/video-recap/skills/video-understanding/scripts/briefing/inputs.py +15 -27
  209. package/lib/video-recap/skills/video-understanding/scripts/briefing/timeline.py +136 -37
  210. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +121 -37
  211. package/lib/video-recap/skills/video-understanding/scripts/detect.py +118 -16
  212. package/lib/video-recap/skills/video-understanding/scripts/index_normalize.py +359 -0
  213. package/lib/video-recap/skills/video-understanding/scripts/lib.py +62 -21
  214. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +181 -51
  215. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +0 -26
  216. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +37 -14
  217. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +40 -32
  218. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +100 -127
  219. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +182 -30
  220. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +30 -27
  221. package/lib/video-recap/skills/video-voiceover/SKILL.md +19 -12
  222. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +3 -3
  223. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +3 -1
  224. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +60 -135
  225. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +9 -34
  226. package/lib/video-recap/skills/video-voiceover/scripts/providers/fish_audio.py +6 -1
  227. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +64 -1
  228. package/lib/video-recap/skills/video-voiceover/scripts/tts_cache.py +99 -0
  229. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +177 -200
  230. package/package.json +45 -45
  231. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
  232. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
  233. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
  234. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +0 -1494
  235. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +0 -147
  236. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +0 -7470
  237. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +0 -13066
  238. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +0 -32
  239. package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +0 -99
  240. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +0 -152
  241. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +0 -118
  242. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +0 -84
  243. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +0 -98
  244. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +0 -204
  245. package/lib/video-recap/skills/video-assemble/references/pair-media.md +0 -74
  246. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +0 -293
  247. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +0 -216
  248. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +0 -23
  249. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +0 -33
  250. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +0 -1
  251. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_client.py +0 -13
  252. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_contract.py +0 -9
  253. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_evidence.py +0 -287
  254. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_observations.py +0 -175
  255. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_payload.py +0 -206
  256. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_report.py +0 -318
  257. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_runner.py +0 -130
  258. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -320
  259. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +0 -108
  260. package/lib/video-recap/skills/video-understanding/scripts/brief.py +0 -9
  261. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +0 -211
  262. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +0 -707
  263. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +0 -143
  264. /package/lib/video-recap/skills/video-cut/scripts/{narration_mapping.py → cut_qc.py} +0 -0
@@ -1,32 +0,0 @@
1
- // 玩家可见文案集中管理。路线对白在 data.js 中按设计节点集中管理。
2
-
3
- export const TEXT = Object.freeze({
4
- title: '金瓶梅·风月总账',
5
- subtitle: '二十日,五扇门。你说过的话,她们都记得。',
6
- identity: '你是西门庆。门外的债已经追到家门,门里有五个人等你把银子、谎话和旧承诺一件件说清。你可以偏爱,但不能叫她们替你撒谎。',
7
- rating: '18+ · 仅限成年人 · 含成人关系、轻度裸露与亲密内容',
8
- ageTitle: '十八岁以下,止步',
9
- ageBody: '本作只供成年人,含成人关系、肩背与腿部等轻度裸露、亲密场景与成熟主题。所有可进入亲密路线的人物均为成年虚构角色。',
10
- ageYes: '我已成年',
11
- ageNo: '离开',
12
- start: '进宅',
13
- continue: '接着玩',
14
- gallery: '场景册',
15
- restart: '从头再来',
16
- muteOn: '开声',
17
- muteOff: '静音',
18
- dayLead: '院里的事已摆到眼前。你先动哪一只手?',
19
- chooseVisit: '暮鼓响过,五处院门仍留着灯。今夜你去见谁?',
20
- sharedNightLead: '五个人都没走。账还没凉,酒已经热了——今夜是各回各院,还是在每个人都独立点头之后让五盏灯留在一处,就等你开口。',
21
- nightLead: '茶还热着,她的手在门闩上停了一会儿。接下来怎样,听她的。',
22
- morningLead: '天刚透进窗纸,昨夜没说尽的话已经到了门外。',
23
- banquetLead: '五只杯子都等着。这一次若把功劳、财权或证词分偏了,夜里就有一扇门先落闩。',
24
- galleryEmpty: '册子还是空的。等有人肯把门留给你,再来看。',
25
- galleryKeep: '从头再来,册页也不会丢。',
26
- saveNote: '每次落子都会存下;旧版账本不续接。',
27
- close: '合上',
28
- sceneContinue: '接着往下',
29
- endingRestart: '再走二十日',
30
- endingGallery: '翻场景册',
31
- reducedMotion: '已按系统设置减少动效',
32
- });
@@ -1,99 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "source": "design/GAME_DESIGN.md#10-可执行切片合同",
4
- "experienceProfile": "narrative-led",
5
- "buildPath": "custom",
6
- "versions": {
7
- "contentRevision": "NOT_AVAILABLE: 现有候选早于内容修订号拆分",
8
- "rulesRevision": "NOT_AVAILABLE: 现有候选早于规则修订号拆分",
9
- "saveSchema": 67
10
- },
11
- "stateSurface": {
12
- "resources": {
13
- "initial": {
14
- "silver": 220,
15
- "power": 2,
16
- "repute": 3,
17
- "exposure": 0,
18
- "strain": 0,
19
- "house": 65
20
- }
21
- },
22
- "relationshipActors": [
23
- "wu_yueniang",
24
- "pan_jinlian",
25
- "li_pinger",
26
- "meng_yulou",
27
- "sun_xuee"
28
- ],
29
- "dayActions": ["ledger", "office", "listen", "banquet"],
30
- "eventLog": "history",
31
- "knowledgeLedger": "secrets"
32
- },
33
- "openingActions": [
34
- {
35
- "id": "opening_open_ledger",
36
- "expected": {
37
- "flag": "opened_true_ledger",
38
- "absentFlag": "heard_all_five",
39
- "house": 69,
40
- "bonds": {
41
- "wu_yueniang|li_pinger": 6,
42
- "wu_yueniang|sun_xuee": 7
43
- }
44
- }
45
- },
46
- {
47
- "id": "opening_hear_five",
48
- "expected": {
49
- "flag": "heard_all_five",
50
- "absentFlag": "opened_true_ledger",
51
- "house": 65,
52
- "bonds": {
53
- "pan_jinlian|meng_yulou": -1,
54
- "pan_jinlian|sun_xuee": 10
55
- }
56
- }
57
- }
58
- ],
59
- "callbacks": [
60
- "publicEcho",
61
- "day15Text",
62
- "finalText",
63
- "endingTexts",
64
- "epilogueTexts",
65
- "fateText"
66
- ],
67
- "knowledgeProbe": {
68
- "opening": "opening_open_ledger",
69
- "action": "listen",
70
- "factId": "missing_fifty",
71
- "source": "正堂开账听来的口风",
72
- "confidence": "待互证",
73
- "expiresOn": 7
74
- },
75
- "replay": {
76
- "seed": 42,
77
- "openingAftermathBeats": 3,
78
- "expectedDayPhase": "day",
79
- "tamperedStateMustBeRejected": true
80
- },
81
- "validationPaths": {
82
- "primary": {
83
- "opening": "opening_open_ledger",
84
- "aftermathAdvances": 3,
85
- "expectedFlag": "opened_true_ledger",
86
- "absentFlag": "heard_all_five",
87
- "expectedHouse": 69,
88
- "expectedFeedback": "openingMemory 非空回调载荷存在"
89
- },
90
- "adjacentCounterexample": {
91
- "opening": "opening_hear_five",
92
- "aftermathAdvances": 3,
93
- "expectedFlag": "heard_all_five",
94
- "absentFlag": "opened_true_ledger",
95
- "expectedHouse": 65,
96
- "expectedFeedback": "openingMemory 非空回调载荷存在且分支摘要不同"
97
- }
98
- }
99
- }
@@ -1,152 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { createHash } from 'node:crypto';
3
- import { readFileSync } from 'node:fs';
4
- import { dirname, resolve } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
-
7
- const here = dirname(fileURLToPath(import.meta.url));
8
- const contract = JSON.parse(readFileSync(resolve(here, 'playable-model.json'), 'utf8'));
9
- const data = await import(resolve(here, '../build/app/js/data.js'));
10
- const engine = await import(resolve(here, '../build/app/js/engine.js'));
11
-
12
- const digest = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
13
- const assertText = (value, label) => assert.equal(typeof value === 'string' && value.length > 0, true, label);
14
- const ROUTE_RULES_DIGEST = '3b3c6bd6dc565ff05825d16738ef3a76ad87bd1392d7d149794dc55ff8c005fa';
15
-
16
- function routeRulesProjection() {
17
- const route = Object.fromEntries(Object.entries(data.ROUTE_CHOICES).map(([heroine, steps]) => [
18
- heroine,
19
- steps.map((choices) => choices.map((choice) => ({
20
- id: choice.id,
21
- effects: choice.effects,
22
- condition: choice.condition ?? null,
23
- }))),
24
- ]));
25
- const accord = Object.fromEntries(Object.entries(data.ACCORD_CHOICES).map(([heroine, choice]) => [
26
- heroine,
27
- { id: choice.id, effects: choice.effects, condition: choice.condition ?? null },
28
- ]));
29
- const shared = data.SHARED_NIGHT_CHOICES.map((choice) => ({
30
- id: choice.id,
31
- effects: choice.effects ?? null,
32
- condition: choice.condition ?? null,
33
- }));
34
- return { route, accord, shared };
35
- }
36
-
37
- function finishOpening(state) {
38
- let beats = 0;
39
- while (state.phase === 'opening_aftermath') {
40
- const current = engine.currentOpeningAftermath(state);
41
- assert.ok(current?.current, '开场后章必须存在当前拍');
42
- assert.equal(engine.advanceOpeningAftermath(state).ok, true);
43
- beats += 1;
44
- }
45
- assert.equal(beats, contract.replay.openingAftermathBeats);
46
- assert.equal(state.phase, contract.replay.expectedDayPhase);
47
- }
48
-
49
- function runOpening(action) {
50
- const state = engine.newGame(contract.replay.seed);
51
- assert.deepEqual(state.resources, contract.stateSurface.resources.initial);
52
- assert.deepEqual(Object.keys(state.relations), contract.stateSurface.relationshipActors);
53
- const eventLog = state[contract.stateSurface.eventLog];
54
- const knowledgeLedger = state[contract.stateSurface.knowledgeLedger];
55
- assert.equal(Array.isArray(eventLog), true, '事件日志字段必须指向数组');
56
- assert.equal(Array.isArray(knowledgeLedger), true, '知识账字段必须指向数组');
57
- assert.equal(engine.chooseOpening(state, action.id).ok, true);
58
- assert.equal(eventLog.length, 1);
59
- assert.deepEqual(eventLog[0], {
60
- day: 1,
61
- type: 'opening',
62
- choice: action.id,
63
- public: true,
64
- });
65
- assert.equal(state.flags[action.expected.flag], true);
66
- assert.equal(state.flags[action.expected.absentFlag], undefined, '未选起手不得污染 history/flags');
67
- assert.equal(state.resources.house, action.expected.house);
68
- for (const [key, value] of Object.entries(action.expected.bonds)) assert.equal(state.bonds[key], value, key);
69
-
70
- finishOpening(state);
71
- const memory = engine.openingMemory(state);
72
- assert.equal(memory.choice, action.id);
73
- for (const field of contract.callbacks) {
74
- if (field === 'endingTexts' || field === 'epilogueTexts') {
75
- assert.equal(Object.keys(memory[field]).length, 5, `${field} 应提供五份长期回调载荷`);
76
- for (const text of Object.values(memory[field])) assertText(text, `${field} 不得为空`);
77
- } else assertText(memory[field], `${field} 不得为空`);
78
- }
79
-
80
- const options = engine.dayOptions(state);
81
- assert.deepEqual(options.map(({ id }) => id), contract.stateSurface.dayActions);
82
- assert.equal(options.filter(({ resolvesPressure }) => resolvesPressure).length >= 1, true);
83
-
84
- const serialized = engine.serialize(state);
85
- assert.deepEqual(engine.deserialize(serialized), state, '合法 snapshot 必须从 history 重演通过');
86
- const tampered = JSON.parse(serialized);
87
- tampered.flags[action.expected.absentFlag] = true;
88
- assert.equal(engine.deserialize(JSON.stringify(tampered)), null, '未选分支注入必须拒读');
89
-
90
- return {
91
- state: engine.snapshot(state),
92
- digest: digest(state),
93
- };
94
- }
95
-
96
- function verifyKnowledgeLedger() {
97
- const probe = contract.knowledgeProbe;
98
- const state = engine.newGame(contract.replay.seed);
99
- assert.equal(engine.chooseOpening(state, probe.opening).ok, true);
100
- finishOpening(state);
101
- assert.equal(engine.chooseDayAction(state, probe.action).ok, true);
102
- assert.equal(state[contract.stateSurface.knowledgeLedger].includes(probe.factId), true, '知识账必须记录已获知事实');
103
- const fact = engine.secretInventory(state).find(({ id }) => id === probe.factId);
104
- assertText(fact?.label, '证物标签不得为空');
105
- assert.deepEqual(fact, {
106
- id: probe.factId,
107
- label: fact.label,
108
- source: probe.source,
109
- confidence: probe.confidence,
110
- expiresOn: probe.expiresOn,
111
- expired: false,
112
- selected: false,
113
- });
114
- assert.equal(state.selectedSecret, null, '获得事实不等于已经选择提交');
115
- assert.deepEqual(state.secretsUsed, [], '未选择的事实不得被动作标成已消费');
116
- assert.equal(state.history.at(-1).secretUsed, null, '事件日志不得伪造事实消费');
117
-
118
- const tampered = JSON.parse(engine.serialize(state));
119
- tampered.secretsUsed.push(probe.factId);
120
- assert.equal(engine.deserialize(JSON.stringify(tampered)), null, '伪造已消费事实必须拒读');
121
- }
122
-
123
- assert.equal(contract.schemaVersion, 1);
124
- assert.equal(contract.source, 'design/GAME_DESIGN.md#10-可执行切片合同');
125
- assert.equal(contract.experienceProfile, 'narrative-led');
126
- assert.equal(contract.buildPath, 'custom');
127
- assert.match(contract.versions.contentRevision, /^NOT_AVAILABLE:/);
128
- assert.match(contract.versions.rulesRevision, /^NOT_AVAILABLE:/);
129
- assert.equal(engine.SAVE_VERSION, contract.versions.saveSchema);
130
- assert.equal(contract.replay.tamperedStateMustBeRejected, true, '合同必须门控伪造状态拒读');
131
- assert.equal(contract.validationPaths.primary.opening, contract.openingActions[0].id);
132
- assert.equal(contract.validationPaths.adjacentCounterexample.opening, contract.openingActions[1].id);
133
- for (const [index, path] of Object.values(contract.validationPaths).entries()) {
134
- const action = contract.openingActions[index];
135
- assert.equal(path.aftermathAdvances, contract.replay.openingAftermathBeats);
136
- assert.equal(path.expectedFlag, action.expected.flag);
137
- assert.equal(path.absentFlag, action.expected.absentFlag);
138
- assert.equal(path.expectedHouse, action.expected.house);
139
- assertText(path.expectedFeedback, '固定验证路径必须声明预期反馈');
140
- }
141
- assert.deepEqual(Object.keys(data.DAY_ACTIONS), contract.stateSurface.dayActions);
142
- assert.deepEqual(data.HEROINE_IDS, contract.stateSurface.relationshipActors);
143
- assert.deepEqual(data.OPENING_CHOICES.map(({ id }) => id), contract.openingActions.map(({ id }) => id));
144
- assert.equal(digest(routeRulesProjection()), ROUTE_RULES_DIGEST, '文案改写不得改动五条路线、五院约或共享终夜的 id/condition/effects');
145
-
146
- const firstRuns = contract.openingActions.map(runOpening);
147
- const replayRuns = contract.openingActions.map(runOpening);
148
- assert.deepEqual(replayRuns.map(({ digest: value }) => value), firstRuns.map(({ digest: value }) => value));
149
- assert.notEqual(firstRuns[0].digest, firstRuns[1].digest, '两条起手必须产生可区分状态');
150
- verifyKnowledgeLedger();
151
-
152
- console.log('可执行改编合同:2 条起手、3 拍回响、非空回调载荷、知识来源、确定性重放与分支污染拒绝均一致');
@@ -1,118 +0,0 @@
1
- # Caller-rendered foreground composition
2
-
3
- `compose_foreground.py` performs one narrow operation: it overlays a caller-rendered,
4
- full-canvas RGBA PNG sequence on an already locked H264/CFR/AAC base, optionally
5
- replaces a declared tail with an explicit endcard asset, and copies `a:0` without
6
- decoding or rewriting it. The PNG pixels are the source schema. This is not a CSS,
7
- font, text, subtitle, logo, animation, or plugin renderer.
8
-
9
- ## Command
10
-
11
- ```bash
12
- python3 scripts/compose_foreground.py foreground_plan.json \
13
- --output-dir a-new-directory [--plan-only]
14
- ```
15
-
16
- The output directory must not exist. A normal run publishes `foreground.mp4` only
17
- after the staged media's frame clock, canvas/color metadata, AAC decoder/packets/PTS/
18
- side data, and a full audio/video decode pass verification.
19
- A failure retains `foreground_run.json` and available logs but removes staged/final
20
- media. `--plan-only` validates the complete plan and inputs and writes only
21
- `foreground_run.json`; it does not render media or update any current pointer.
22
-
23
- ## Strict plan schema v1
24
-
25
- ```json
26
- {
27
- "artifact": "foreground_compose_plan",
28
- "schema_version": 1,
29
- "base": {"path": "/local/base.mp4"},
30
- "video": {"fps": "30/1", "width": 1280, "height": 720, "total_frames": 300},
31
- "foreground": {
32
- "directory": "/local/foreground_sequence",
33
- "pattern": "frame_%06d.png",
34
- "start_frame": 0,
35
- "end_frame": 270
36
- },
37
- "endcard": {
38
- "kind": "sequence",
39
- "directory": "/local/endcard_sequence",
40
- "pattern": "frame_%06d.png",
41
- "start_frame": 270,
42
- "end_frame": 300
43
- },
44
- "producer_receipt": {"path": "/local/producer_receipt.json"}
45
- }
46
- ```
47
-
48
- `endcard` is an exact tagged union. The alternative static form is:
49
-
50
- ```json
51
- {
52
- "kind": "still",
53
- "path": "/local/endcard.png",
54
- "start_frame": 270,
55
- "end_frame": 300
56
- }
57
- ```
58
-
59
- When the foreground itself covers the entire declared frame clock, the only accepted
60
- no-tail form is exactly:
61
-
62
- ```json
63
- {"kind": "none"}
64
- ```
65
-
66
- It accepts no additional fields. It is invalid when the foreground reserves any tail;
67
- there is no implicit filler, repeated last frame, or generated endcard.
68
-
69
- Use `still` only when a genuinely static full-canvas endcard is intended. A static
70
- PNG does not reconstruct a delivered fade or other animated endcard; supply the
71
- caller-rendered `sequence` form for that case.
72
-
73
- Both sequences use **local zero-based filenames** regardless of their output range.
74
- Thus the endcard example contains `frame_000000.png` through `frame_000029.png`,
75
- mapped to output frames `[270,300)`. The foreground must start at output frame zero.
76
- Its end must equal the endcard start, and the endcard end must equal the independently
77
- probed base frame count. With `kind: "none"`, the foreground end must instead equal
78
- that full base frame count. Bounds are half-open.
79
-
80
- The only accepted filename pattern is the literal `frame_%06d.png`. The directory
81
- must contain exactly the expected contiguous entries—no missing or extra files. Every
82
- actual image must probe as PNG, `rgba`, and the exact declared full canvas. Repeated
83
- files and symlinks are allowed so transparent holds need not duplicate storage. The
84
- run report records each sequence's directory and validated `frame_count`. Legacy
85
- `sha256` / `ordered_sha256` keys in a plan are ignored.
86
-
87
- ## Base and output invariants
88
-
89
- The first version accepts one selected `v:0` H264, zero-origin CFR, YUV420P,
90
- BT.709/TV-range base and adopted AAC `a:0`. Declared fps, canvas, and frame count are
91
- checked independently against actual decoded frame PTS. Picture and audio intervals
92
- must satisfy the narrow `pair_media` timing contract.
93
-
94
- Composition explicitly overlays in RGB, converts to BT.709 limited-range YUV420P,
95
- limits the final video filter to the declared half-open frame clock, and re-encodes
96
- only video with fixed `libx264 -preset fast -crf 18` settings. A no-tail run uses only
97
- the base and foreground inputs; it does not synthesize or pad a tail. The filter EOF
98
- prevents still-image input loops without imposing an output-level video frame cap that
99
- could stop accepted trailing AAC packets from being copied. The run
100
- report records that encoder, preset, CRF, pixel format, color contract, and audio-copy
101
- mode explicitly. H.264 CRF encoding is lossy: preserved transparent regions are
102
- visually checked against tolerances, not claimed pixel-identical to decoded base
103
- pixels. The compositor does not use `-r`, `-shortest`, or `-t`. Audio is mapped from
104
- base `a:0` with `-c:a copy`; output verification requires matching decoder
105
- parameters, packet count, payload bytes, PTS/DTS/duration/size, and side data.
106
-
107
- ## Provenance and review boundary
108
-
109
- The producer receipt is a caller artifact that must exist when the plan is read.
110
- Its declarations may
111
- describe roles or content decisions such as title/note/brand, `dialogues=[]`, or
112
- hidden markers. Core records those declarations as `DECLARED_NOT_CHECKED`; it does
113
- not infer semantic truth from pixels or claim that dialogue/subtitle duplication is
114
- absent. A separate producer/reviewer must establish that evidence.
115
-
116
- Every run reports `direct_listening` and `normal_speed_review` as `NOT_CHECKED` and
117
- `release_approved` as false. Pixel validation and deterministic rendering are not
118
- commercial-quality or release approval.
@@ -1,84 +0,0 @@
1
- {
2
- "is_tone_modify": false,
3
- "enable_adjust_mask": false,
4
- "keyframe_refs": [],
5
- "enable_adjust": true,
6
- "enable_video_mask": true,
7
- "enable_hsl": false,
8
- "speed": 1,
9
- "clip": {
10
- "rotation": 0,
11
- "transform": {
12
- "y": 0,
13
- "x": 0
14
- },
15
- "flip": {
16
- "vertical": false,
17
- "horizontal": false
18
- },
19
- "scale": {
20
- "y": 1,
21
- "x": 1
22
- },
23
- "alpha": 1
24
- },
25
- "intensifies_audio": false,
26
- "uniform_scale": {
27
- "on": true,
28
- "value": 1
29
- },
30
- "responsive_layout": {
31
- "vertical_pos_layout": 0,
32
- "target_follow": "",
33
- "enable": false,
34
- "horizontal_pos_layout": 0,
35
- "size_layout": 0
36
- },
37
- "enable_hsl_curves": true,
38
- "desc": "",
39
- "state": 0,
40
- "enable_lut": true,
41
- "reverse": false,
42
- "target_timerange": {
43
- "start": 0,
44
- "duration": 0
45
- },
46
- "cartoon": false,
47
- "enable_color_correct_adjust": false,
48
- "last_nonzero_volume": 1,
49
- "enable_smart_color_adjust": false,
50
- "source": "segmentsourcenormal",
51
- "render_timerange": {
52
- "start": 0,
53
- "duration": 0
54
- },
55
- "render_index": 0,
56
- "group_id": "",
57
- "enable_color_match_adjust": false,
58
- "enable_color_curves": true,
59
- "raw_segment_id": "",
60
- "volume": 1,
61
- "visible": true,
62
- "track_render_index": 0,
63
- "track_attribute": 0,
64
- "is_loop": false,
65
- "id": "",
66
- "enable_color_wheels": true,
67
- "extra_material_refs": [],
68
- "template_id": "",
69
- "template_scene": "default",
70
- "material_id": "",
71
- "common_keyframes": [],
72
- "digital_human_template_group_id": "",
73
- "color_correct_alg_result": "",
74
- "hdr_settings": {
75
- "mode": 1,
76
- "intensity": 1,
77
- "nits": 1000
78
- },
79
- "is_placeholder": false,
80
- "source_timerange": {
81
- "start": 0,
82
- "duration": 0
83
- }
84
- }
@@ -1,98 +0,0 @@
1
- {
2
- "category_name": "",
3
- "aigc_type": "none",
4
- "duration": 0,
5
- "category_id": "",
6
- "beauty_face_auto_preset_infos": [],
7
- "beauty_body_preset_id": "",
8
- "picture_from": "none",
9
- "cartoon_path": "",
10
- "intensifies_audio_path": "",
11
- "crop_ratio": "free",
12
- "source_platform": 0,
13
- "local_material_from": "",
14
- "media_path": "",
15
- "is_unified_beauty_mode": false,
16
- "width": 0,
17
- "video_algorithm": {
18
- "algorithms": [],
19
- "path": "",
20
- "story_video_modify_video_config": {
21
- "is_overwrite_last_video": false,
22
- "tracker_task_id": "",
23
- "task_id": ""
24
- },
25
- "ai_background_configs": [],
26
- "ai_in_painting_config": [],
27
- "gameplay_configs": []
28
- },
29
- "type": "video",
30
- "height": 0,
31
- "material_id": "",
32
- "has_audio": true,
33
- "is_copyright": true,
34
- "source": 0,
35
- "intensifies_path": "",
36
- "crop_scale": 1,
37
- "live_photo_cover_path": "",
38
- "reverse_path": "",
39
- "reverse_intensifies_path": "",
40
- "picture_set_category_id": "",
41
- "crop": {
42
- "upper_right_x": 1,
43
- "lower_right_y": 1,
44
- "upper_right_y": 0,
45
- "upper_left_y": 0,
46
- "lower_left_y": 1,
47
- "lower_right_x": 1,
48
- "lower_left_x": 0,
49
- "upper_left_x": 0
50
- },
51
- "request_id": "",
52
- "local_material_id": "",
53
- "picture_set_category_name": "",
54
- "path": "",
55
- "is_text_edit_overdub": false,
56
- "check_flag": 62978047,
57
- "origin_material_id": "",
58
- "material_url": "",
59
- "beauty_face_auto_preset": {
60
- "preset_id": "",
61
- "scene": "",
62
- "name": "",
63
- "rate_map": ""
64
- },
65
- "is_ai_generate_content": false,
66
- "extra_type_option": 2,
67
- "id": "",
68
- "aigc_item_id": "",
69
- "material_name": "复合片段1",
70
- "beauty_face_preset_infos": [],
71
- "team_id": "",
72
- "local_id": "",
73
- "matting": {
74
- "expansion": 0,
75
- "feather": 0,
76
- "flag": 0,
77
- "reverse": false,
78
- "strokes": [],
79
- "custom_matting_id": "",
80
- "has_use_quick_eraser": false,
81
- "has_use_quick_brush": false,
82
- "path": "",
83
- "interactiveTime": [],
84
- "enable_matting_stroke": false
85
- },
86
- "formula_id": "",
87
- "has_sound_separated": false,
88
- "live_photo_timestamp": -1,
89
- "stable": {
90
- "stable_level": 0,
91
- "time_range": {
92
- "start": 0,
93
- "duration": 0
94
- },
95
- "matrix_path": ""
96
- },
97
- "aigc_history_id": ""
98
- }