@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.
- package/README.md +17 -11
- package/lib/client.js +85 -35
- package/lib/client.js.map +3 -3
- package/lib/drama/manifest.json +41 -36
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +340 -13
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +4 -2
- package/lib/drama/skills/short-drama-edit/SKILL.md +32 -12
- package/lib/drama/skills/short-drama-edit/references/still-cuts.md +90 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1035 -145
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +48 -0
- package/lib/drama/skills/short-drama-produce/SKILL.md +6 -1
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +12 -0
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +138 -9
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +6 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +3 -1
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -0
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +14 -0
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +19 -6
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -0
- package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +4 -1
- package/lib/index.js +16 -7
- package/lib/index.js.map +2 -2
- package/lib/novel-to-game/README.md +98 -44
- package/lib/novel-to-game/README_ZH.md +100 -46
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +27 -202
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +23 -115
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/chamber.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_rain.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/garden.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/hall.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/kitchen.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street_dawn.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/temple.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/moon.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +326 -2503
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +71 -4
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/adv.js +221 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +113 -257
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +511 -3026
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/menus.js +277 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/petals.js +67 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/stage.js +180 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/store.js +70 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common2.js +204 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common3.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/dates.js +186 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/index.js +122 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/meng.js +190 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pan.js +212 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pinger.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/xuee.js +199 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/yue.js +214 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -2
- package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +182 -45
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +7 -17
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +9 -9
- package/lib/novel-to-game/manifest.json +303 -78
- package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +7 -2
- package/lib/novel-to-game/skills/game-concept/references/concept-method.md +2 -0
- package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +2 -0
- package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +9 -0
- package/lib/types/client/drama-production-view.d.ts +11 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/file-activity.d.ts +1 -1
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts +7 -1
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +7 -2
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/drama-adapters.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/types/video-project.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +108 -1
- package/lib/video-recap/README.en.md +18 -14
- package/lib/video-recap/README.md +18 -14
- package/lib/video-recap/manifest.json +297 -321
- package/lib/video-recap/skills/video-assemble/SKILL.md +18 -16
- package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +3 -1
- package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +5 -5
- package/lib/video-recap/skills/video-assemble/references/packaging.md +4 -4
- package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +10 -10
- package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +13 -2
- package/lib/video-recap/skills/video-assemble/scripts/adoption/av_clock.py +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +4 -1
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +2 -9
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +188 -51
- package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +0 -1
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +32 -75
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +8 -15
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +202 -161
- package/lib/video-recap/skills/video-assemble/scripts/codec_peak.py +112 -0
- package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +10 -101
- package/lib/video-recap/skills/video-assemble/scripts/jianying/builders.py +44 -475
- package/lib/video-recap/skills/video-assemble/scripts/jianying/model.py +1 -22
- package/lib/video-recap/skills/video-assemble/scripts/jianying/templates.py +0 -3
- package/lib/video-recap/skills/video-assemble/scripts/jianying/timeline_contract.py +36 -103
- package/lib/video-recap/skills/video-assemble/scripts/jianying/tracks.py +0 -8
- package/lib/video-recap/skills/video-assemble/scripts/jianying/writer.py +28 -203
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +20 -34
- package/lib/video-recap/skills/video-assemble/scripts/loudness.py +332 -0
- package/lib/video-recap/skills/video-assemble/scripts/media.py +158 -38
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +30 -16
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +49 -8
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +17 -6
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/core.py +24 -2
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +2 -5
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +2 -9
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +12 -34
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +3 -4
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +28 -2
- package/lib/video-recap/skills/video-cut/SKILL.md +37 -11
- package/lib/video-recap/skills/video-cut/references/shot-review.md +1 -1
- package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -34
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +96 -124
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +97 -182
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +177 -166
- package/lib/video-recap/skills/video-cut/scripts/frame_grid.py +249 -0
- package/lib/video-recap/skills/video-cut/scripts/lib.py +0 -3
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +173 -7
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +234 -151
- package/lib/video-recap/skills/video-cut/scripts/sentence_gate.py +189 -0
- package/lib/video-recap/skills/video-cut/scripts/shot_review.py +2 -6
- package/lib/video-recap/skills/video-recap/SKILL.md +24 -27
- package/lib/video-recap/skills/video-recap/references/audio-routing.md +8 -6
- package/lib/video-recap/skills/video-recap/references/config-playbook.md +8 -11
- package/lib/video-recap/skills/video-recap/references/data-schema.md +131 -74
- package/lib/video-recap/skills/video-recap/references/resource-library.md +17 -1
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +51 -268
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +89 -254
- package/lib/video-recap/skills/video-recap/scripts/lib.py +81 -70
- package/lib/video-recap/skills/video-recap/scripts/library.py +40 -4
- package/lib/video-recap/skills/video-recap/scripts/materials.py +13 -80
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +49 -17
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +1 -3
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +86 -116
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +87 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_source.py +0 -39
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +37 -135
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +118 -127
- package/lib/video-recap/skills/video-recap/scripts/resources/__init__.py +4 -0
- package/lib/video-recap/skills/video-recap/scripts/{resource_lock.py → resources/lock.py} +1 -1
- package/lib/video-recap/skills/video-recap/scripts/{project_binding.py → resources/project_binding.py} +78 -17
- package/lib/video-recap/skills/video-reference/SKILL.md +108 -0
- package/lib/video-recap/skills/video-reference/references/reference-schema.md +139 -0
- package/lib/video-recap/skills/video-reference/scripts/lib.py +85 -0
- package/lib/video-recap/skills/video-reference/scripts/reference.py +96 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_check.py +553 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_frames.py +122 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_measure.py +253 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_profile.py +271 -0
- package/lib/video-recap/skills/video-script/SKILL.md +9 -7
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +18 -267
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +12 -30
- package/lib/video-recap/skills/video-script/scripts/entry_suggestion.py +125 -0
- package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +2 -26
- package/lib/video-recap/skills/video-script/scripts/lib.py +5 -15
- package/lib/video-recap/skills/video-script/scripts/lint_summary.py +184 -0
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +120 -100
- package/lib/video-recap/skills/video-script/scripts/review.py +3 -34
- package/lib/video-recap/skills/video-script/scripts/review_grounding.py +20 -46
- package/lib/video-recap/skills/video-script/scripts/review_response.py +120 -258
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +2 -10
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +89 -5
- package/lib/video-recap/skills/video-script/scripts/validate.py +26 -34
- package/lib/video-recap/skills/video-understanding/SKILL.md +29 -4
- package/lib/video-recap/skills/video-understanding/references/data-schema.md +5 -22
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +24 -121
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +11 -5
- package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +15 -24
- package/lib/video-recap/skills/video-understanding/scripts/briefing/builder.py +59 -25
- package/lib/video-recap/skills/video-understanding/scripts/briefing/context.py +39 -3
- package/lib/video-recap/skills/video-understanding/scripts/briefing/inputs.py +15 -27
- package/lib/video-recap/skills/video-understanding/scripts/briefing/timeline.py +136 -37
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +121 -37
- package/lib/video-recap/skills/video-understanding/scripts/detect.py +118 -16
- package/lib/video-recap/skills/video-understanding/scripts/index_normalize.py +359 -0
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +62 -21
- package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +181 -51
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +0 -26
- package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +37 -14
- package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +40 -32
- package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +100 -127
- package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +182 -30
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +30 -27
- package/lib/video-recap/skills/video-voiceover/SKILL.md +19 -12
- package/lib/video-recap/skills/video-voiceover/references/index-tts.md +3 -3
- package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +3 -1
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +60 -135
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +9 -34
- package/lib/video-recap/skills/video-voiceover/scripts/providers/fish_audio.py +6 -1
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +64 -1
- package/lib/video-recap/skills/video-voiceover/scripts/tts_cache.py +99 -0
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +177 -200
- package/package.json +45 -45
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +0 -1494
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +0 -147
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +0 -7470
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +0 -13066
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +0 -32
- package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +0 -99
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +0 -152
- package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +0 -118
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +0 -84
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +0 -98
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +0 -204
- package/lib/video-recap/skills/video-assemble/references/pair-media.md +0 -74
- package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +0 -293
- package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +0 -216
- package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +0 -23
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +0 -33
- package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +0 -1
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_client.py +0 -13
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_contract.py +0 -9
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_evidence.py +0 -287
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_observations.py +0 -175
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_payload.py +0 -206
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_report.py +0 -318
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_runner.py +0 -130
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -320
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +0 -108
- package/lib/video-recap/skills/video-understanding/scripts/brief.py +0 -9
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +0 -211
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +0 -707
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +0 -143
- /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.
|
package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json
DELETED
|
@@ -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
|
-
}
|