hyper-animator-codex 0.7.1 → 0.8.1
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 +67 -4
- package/bin/hyper-animator-codex.mjs +1 -1
- package/lib/minimax-config.mjs +3 -3
- package/package.json +4 -1
- package/skills/hyper-animator-codex/SKILL.md +66 -22
- package/skills/hyper-animator-codex/agents/openai.yaml +2 -2
- package/skills/hyper-animator-codex/contracts/shot-plan.schema.json +280 -0
- package/skills/hyper-animator-codex/contracts/workflow-policy.json +97 -0
- package/skills/hyper-animator-codex/references/HyperFrames-AI-Generation-Patterns-codex.md +788 -0
- package/skills/hyper-animator-codex/references/beat-sync-workflow.md +7 -0
- package/skills/hyper-animator-codex/references/examples/shot-plan-dual-catalog.json +99 -0
- package/skills/hyper-animator-codex/references/hyperframes-agent-pseudocode.ts +1 -1
- package/skills/hyper-animator-codex/references/hyperframes-catalog-map.json +97 -230
- package/skills/hyper-animator-codex/references/hyperframes-intent-workflow.md +32 -8
- package/skills/hyper-animator-codex/references/minimax-music-workflow.md +24 -4
- package/skills/hyper-animator-codex/references/narration-audio-workflow.md +47 -10
- package/skills/hyper-animator-codex/references/shotcraft/LICENSE +202 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ai-stream-response/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/autolayout-gap-dial/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/beat-cut-moves/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/beat-step-list-theme-cycle/README.md +59 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/before-after-slider-scrub/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/bottom-push-stack-wipe/README.md +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/brand-frame-snap/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/brand-ink-open/README.md +35 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/bubble-swarm-takeover/README.md +62 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/canvas-materialize-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/card-flip-reveal/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/card-flock-tumble/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/cel-flash-stomp/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/chart-live-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/circle-match-iris/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/cloner-depth-echo/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/collab-cursor-moves/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/color-block-step-wipe/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/command-palette-summon/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/crane-rise-reveal/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/crash-zoom-punch/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/dataviz-landscape-open/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/deck-deal-flyin/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/depth-layer-moves/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/document-typewriter-reveal/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/draw-svg-trace/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/edit-hook-moves/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/element-body-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/fui-hud-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/gauge-readout-moves/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/glow-flyline-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/gradient-word-sweep/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/graze-face-tour/README.md +56 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/hashtag-to-pill-materialize/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/hires-rasterize-3d-text/README.md +34 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/icon-field-colorize/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/icon-performance-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/impact-feedback/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/input-trigger-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/integration-hub-map/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/letterspace-materialize/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/light-play-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/line-boil/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/line-carry-transition/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/list-stack-press/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/magician-card-flourish/README.md +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/marker-underline-title/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/montage-rhythm-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/morph-from-primitive/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-forerun/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-orbit-drop/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-triple-marquee/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/odometer-digit-roll/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/outro-group-photo-launch/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/overhead-camera-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/page-turn-transitions/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/page-waterfall-wall/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/panel-grid-moves/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-craft-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-plane-messenger/README.md +62 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-title-card/README.md +36 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/particle-celebrate-hits/README.md +42 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/particle-sand-fill/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/pill-slot-cycle/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/print-texture-transitions/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/rhythm-interrupt-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/riso-print-hits/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/row-embed/README.md +36 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/runway-ground-skim/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/sakuga-timing-shift/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/scene-locked-title/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/scroll-brake-moves/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/segmented-thumb-hero/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/shot-transitions/README.md +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/skeleton-reveal/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/slam-entrance-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/smear-multiples/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/space-camera-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spectrum-morph-ui/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/speed-ramp-freeze/README.md +42 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/split-flap-title/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-hero-card/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-sweep-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/steep-tilt-glide/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/stroke-segment-build/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/tear-streak-transitions/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/tension-camera-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/text-as-mask/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/text-column-converge/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/theme-switch-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/timeline-travel/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/title-demote-to-label/README.md +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/trailer-grammar-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/transition-hidden-cut/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/transition-travel/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-and-filter/README.md +37 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-assembly-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-entrance-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-rhythm-sync/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/typewriter-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ui-strip-away-outro/README.md +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ui-to-brand-morph/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/voice-waveform-live/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/wall-reveal-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/wipe-transitions/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/word-relay-filmstrip/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/catalog.json +3946 -0
- package/skills/hyper-animator-codex/references/shotcraft/motion-pack/README.md +32 -0
- package/skills/hyper-animator-codex/references/shotcraft/motion-pack/shotcraft-motion-pack.js +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/aesthetic-rules.md +157 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/final-review.md +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/guided-free-creation.md +197 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/music-beat-sync.md +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/pipeline.md +357 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/sound-design.md +126 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/Caption.tsx +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/DigitRoll.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlashCut.tsx +20 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlatPanel.tsx +65 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/PageCam.tsx +151 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/VerticalTicker.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/camera.tsx +75 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/motion.ts +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/rand.ts +11 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/shake.ts +10 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/_fixtures/Fixtures.tsx +83 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ai-stream-response/StreamResponse.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/autolayout-gap-dial/AutolayoutGapDial.tsx +174 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/BeatCutAccelerando.tsx +77 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/PaparazziFlash.tsx +115 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +98 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +99 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/bottom-push-stack-wipe/BottomPushStackWipe.tsx +79 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/brand-frame-snap/BrandFrameSnap.tsx +110 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/bubble-swarm-takeover/BubbleSwarmTakeover.tsx +189 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/DiagramCascadeBuild.tsx +172 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +254 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flip-reveal/CardFlipReveal.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flock-tumble/CardFlockTumble.tsx +382 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/cel-flash-stomp/CelFlashStomp.tsx +111 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/AxisRescaleShockV2.tsx +282 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/OscilloscopeStreamV2.tsx +227 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/UnitDotSwarmRegroupV2.tsx +248 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/circle-match-iris/CircleMatchIris.tsx +124 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/cloner-depth-echo/ClonerDepthEcho.tsx +90 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorCastEnsemble.tsx +136 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorDialogueDuet.tsx +145 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/color-block-step-wipe/ColorBlockStepWipe.tsx +157 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/command-palette-summon/CommandPaletteSummon.tsx +173 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crane-rise-reveal/CraneRiseReveal.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashImpactReal.tsx +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashZoomReal.tsx +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/dataviz-landscape-open/DatavizLandscapeOpen.tsx +401 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/DollyZoomReal.tsx +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/MultiplaneReal.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/draw-svg-trace/DrawSvgTrace.tsx +199 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/edit-hook-moves/LogoStingButton.tsx +106 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/AxialStretch.tsx +112 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/ContactShadowLift.tsx +117 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/LineUnfoldPanel.tsx +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/ReticleLockOn.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/NeedleSweepSelftest.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/TapeScrollFixedPointer.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/FlylineArc.tsx +158 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/GlowOrbAmbient.tsx +131 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/OrbFlylineRelay.tsx +268 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gradient-word-sweep/GradientWordSweep.tsx +307 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/graze-face-tour/GrazeFaceTour.tsx +469 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +166 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-field-colorize/IconFieldColorize.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/AttentionBounce.tsx +193 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/PopBurstConfirm.tsx +162 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/AnimeImpact.tsx +149 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/HitCounter.tsx +147 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/CursorPerformancePunchIn.tsx +154 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/KeycapSmashCut.tsx +217 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/integration-hub-map/IntegrationHubMap.tsx +554 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/letterspace-materialize/LetterspaceMaterialize.tsx +85 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/HalationBloom.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SheenSweepRetry.tsx +85 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SpotlightSweepReveal.tsx +102 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-boil/LineBoil.tsx +140 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-carry-transition/LineCarryTransition.tsx +151 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/magician-card-flourish/MagicianCardFlourish.tsx +294 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/marker-underline-title/MarkerUnderlineTitle.tsx +87 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DominoCascade.tsx +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DropBlackoutSlam.tsx +135 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/WrightTripleCut.tsx +175 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/morph-from-primitive/MorphFromPrimitive.tsx +190 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-forerun/NeonFrameForerun.tsx +279 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +273 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-triple-marquee/NeonTripleMarquee.tsx +111 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/odometer-digit-roll/OdometerDigitRoll.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/OverheadTabletopDrop.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/TiltReveal.tsx +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/BarnDoorSplit.tsx +138 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/CubeRotate.tsx +114 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/PageWaterfallWall.tsx +76 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/VerticalTicker.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/ComicPanelSplit.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/FlipGridReflow.tsx +121 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/GridFlashMosaic.tsx +182 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/MaskingTapeSlap.tsx +163 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/PopupBookRise.tsx +134 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-plane-messenger/PaperPlaneMessenger.tsx +183 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/ConfettiCrossfire.tsx +115 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/CounterTickSparks.tsx +103 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-sand-fill/ParticleSandFill.tsx +119 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/pill-slot-cycle/PillSlotCycle.tsx +220 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/print-texture-transitions/InkBleedReveal.tsx +81 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/JumpCutPunchIn.tsx +72 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/StrobeBlackFrames.tsx +99 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoBeatPump.tsx +155 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoMisregistrationHit.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/runway-ground-skim/RunwayGroundSkim.tsx +258 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/sakuga-timing-shift/SakugaTimingShift.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scene-locked-title/SceneLockedTitle.tsx +98 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/BrakeReticleLock.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/ChangelogScrollBrake.tsx +117 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/segmented-thumb-hero/SegmentedThumbHero.tsx +213 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/MaskWipeReal.tsx +67 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/PortalWipeV2.tsx +128 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipBrakeReal.tsx +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipPanReal.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/skeleton-reveal/SkeletonReveal.tsx +283 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ImpactBurstKit.tsx +185 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/KanadaPerspectiveSnap.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ScoreSlam.tsx +225 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/smear-multiples/SmearMultiples.tsx +88 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/DroneDiveLanding.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/ExplodedView.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/SnorricamLock.tsx +130 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spectrum-morph-ui/SpectrumMorphUi.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/FreezeAnnotateReal.tsx +70 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/SpeedRampReal.tsx +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/split-flap-title/SplitFlapFlip.tsx +189 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/CornerSpotlightReveal.tsx +121 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +183 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/SlideSpotlightPan.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/steep-tilt-glide/SteepTiltGlide.tsx +315 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/stroke-segment-build/StrokeSegmentBuild.tsx +126 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tear-streak-transitions/GlitchDisplace.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/BulletTimeFreezeOrbit.tsx +219 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/DutchRollToLevel.tsx +110 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/PullBackIsolation.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/SlowPushIn.tsx +96 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-as-mask/TextAsMask.tsx +94 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-column-converge/TextColumnConverge.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/PaletteThemeRipple.tsx +207 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/ThemeSweepToggle.tsx +123 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/timeline-travel/TimelineTravel.tsx +123 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/title-demote-to-label/TitleDemoteToLabel.tsx +174 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/CardFootageCadence.tsx +118 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/SmashCut.tsx +105 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/TrailerBumper.tsx +103 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/InvisibleCut.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/LightLeakBurn.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/VersusSlam.tsx +104 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/LetterformZoom.tsx +141 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/SharedElementMorph.tsx +101 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/LetterformDriftAssembly.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/SplitTextStagger.tsx +101 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TextOnPath.tsx +92 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TrackingExpandReveal.tsx +109 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/LetterDropPhysics.tsx +100 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/ScrambleDecode.tsx +90 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/FontWeightPump.tsx +124 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/KaraokeFillSync.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TerminalTypewriter.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TypewriterErrorRetype.tsx +109 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-strip-away-outro/UiStripAwayOutro.tsx +218 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/IconFlipBloomLogo.tsx +199 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/InputMorphsIntoLogo.tsx +215 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/voice-waveform-live/VoiceWaveformLive.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wall-reveal-moves/BentoLightUp.tsx +135 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/BlindsSlice.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/ClockWipe.tsx +83 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/word-relay-filmstrip/WordRelayFilmstrip.tsx +300 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/Root.tsx +15 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Caption.tsx +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/DigitRoll.tsx +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/FlashCut.tsx +19 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Main.tsx +163 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/PaperTitleCard.tsx +89 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/PageCam.tsx +145 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneDetail.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneFlyIn.tsx +447 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOpen.tsx +532 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOutroLive.tsx +394 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/ScenePapers.tsx +185 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneWbr.tsx +299 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/index.ts +4 -0
- package/skills/hyper-animator-codex/references/shotcraft/source-notes.md +10 -0
- package/skills/hyper-animator-codex/scripts/generate_minimax_music.mjs +27 -10
- package/skills/hyper-animator-codex/scripts/generate_minimax_tts.mjs +142 -13
- package/skills/hyper-animator-codex/scripts/generate_subtitles.mjs +42 -3
- package/skills/hyper-animator-codex/scripts/git_checkpoint.mjs +2 -2
- package/skills/hyper-animator-codex/scripts/minimax_runtime_config.mjs +3 -3
- package/skills/hyper-animator-codex/scripts/query_shotcraft.mjs +140 -0
- package/skills/hyper-animator-codex/scripts/validate_hyperframes_html.py +22 -0
- package/skills/hyper-animator-codex/scripts/validate_provider_policy.mjs +108 -0
- package/skills/hyper-animator-codex/scripts/validate_shot_plan.mjs +266 -0
- package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/analyzer.py +3 -1
- package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/beat.py +37 -1
package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneWbr.tsx
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { interpolate, useCurrentFrame, Easing } from 'remotion';
|
|
2
|
+
import { PageCam, CamKey } from './PageCam';
|
|
3
|
+
import layout from '../live-layout.json';
|
|
4
|
+
|
|
5
|
+
type Block = { x: number; y: number; w: number; h: number; tag: string };
|
|
6
|
+
const blocks = layout.wbr.blocks as Block[];
|
|
7
|
+
const leftRail = layout.wbr.leftRail;
|
|
8
|
+
const rightRail = layout.wbr.rightRail;
|
|
9
|
+
const PAGE_H = layout.wbr.pageH;
|
|
10
|
+
|
|
11
|
+
const MONO = 'ui-monospace, SFMono-Regular, Menlo, monospace';
|
|
12
|
+
const PAPER = '#fdfcfa';
|
|
13
|
+
const AMBER = 'oklch(52% 0.115 65)';
|
|
14
|
+
const AMBER_WASH = 'oklch(95% 0.05 85)';
|
|
15
|
+
|
|
16
|
+
// editor-title close-up → ease out to the whole page (both rails on camera)
|
|
17
|
+
// → tiny breathing hold.
|
|
18
|
+
const CAM_KEYS: CamKey[] = [
|
|
19
|
+
{ frame: 0, cx: 920, cy: 280, zoom: 1.25 },
|
|
20
|
+
{ frame: 22, cx: 920, cy: 310, zoom: 1.21 }, // slow push while the title writes in
|
|
21
|
+
{ frame: 64, cx: 960, cy: 540, zoom: 0.997 }, // whole page, rails fully in frame
|
|
22
|
+
{ frame: 78, cx: 960, cy: 540, zoom: 1.003 }, // micro-breath
|
|
23
|
+
{ frame: 102, cx: 960, cy: 540, zoom: 0.995 }, // exhale — whole-page reading hold
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
const REVEAL_EASE = Easing.bezier(0.4, 0, 0.6, 1);
|
|
27
|
+
|
|
28
|
+
// 20 content blocks would overshoot the 70-frame reveal budget one-by-one, so
|
|
29
|
+
// blocks are revealed two at a time: pair g starts at 6 + g*3.5, 8 frames each
|
|
30
|
+
// (last pair done by ~49, well before the frame-64 full-page settle).
|
|
31
|
+
const cueFor = (i: number) => 6 + Math.floor(i / 2) * 3.5;
|
|
32
|
+
const WIPE = 8;
|
|
33
|
+
|
|
34
|
+
// ---- past weeks stack into the left rail: the captured texture only holds
|
|
35
|
+
// the live W28 entry, so W27…W22 drop in from above one after another (list
|
|
36
|
+
// stacking, same vocabulary as the papers shot), landing below it. ----
|
|
37
|
+
const SANS = 'ui-sans-serif, system-ui, -apple-system, sans-serif';
|
|
38
|
+
const PAST_WEEKS = [
|
|
39
|
+
{ week: '2026 第 27 周', date: '7月3日', title: '2026-W27 · Foundation Lab Weekly' },
|
|
40
|
+
{ week: '2026 第 26 周', date: '6月26日', title: '2026-W26 · Foundation Lab Weekly' },
|
|
41
|
+
{ week: '2026 第 25 周', date: '6月19日', title: '2026-W25 · Foundation Lab Weekly' },
|
|
42
|
+
{ week: '2026 第 24 周', date: '6月12日', title: '2026-W24 · Foundation Lab Weekly' },
|
|
43
|
+
{ week: '2026 第 23 周', date: '6月5日', title: '2026-W23 · Foundation Lab Weekly' },
|
|
44
|
+
{ week: '2026 第 22 周', date: '5月29日', title: '2026-W22 · Foundation Lab Weekly' },
|
|
45
|
+
];
|
|
46
|
+
const WEEK_Y0 = 228; // just under the baked-in W28 entry
|
|
47
|
+
const WEEK_H = 56;
|
|
48
|
+
const WEEK_CUE = (i: number) => 58 + i * 5; // after the left rail wipes on (46–56)
|
|
49
|
+
const WEEK_DROP = Easing.bezier(0.2, 1.15, 0.3, 1); // drop with a light bounce
|
|
50
|
+
|
|
51
|
+
// member-name headings (tag=h2) get the @-mention amber wash; the pinned
|
|
52
|
+
// "Jackie's Download" digest heading (the first h2) is not a member name.
|
|
53
|
+
const memberH2 = new Set<number>();
|
|
54
|
+
{
|
|
55
|
+
let seenH2 = 0;
|
|
56
|
+
blocks.forEach((b, i) => {
|
|
57
|
+
if (b.tag === 'h2' && seenH2++ > 0) memberH2.add(i);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Weekly brief: the full report is "written" in block by block (paper mask
|
|
62
|
+
* wipes left→right behind an amber caret), member names get an @-mention amber
|
|
63
|
+
* wash, then the week list (left) and comment sidebar (right) wipe on stage —
|
|
64
|
+
* the whole page, both rails included, settles into frame. */
|
|
65
|
+
export const SceneWbr: React.FC = () => {
|
|
66
|
+
const frame = useCurrentFrame();
|
|
67
|
+
|
|
68
|
+
// screen-space kicker stamps in
|
|
69
|
+
const kick = interpolate(frame, [8, 16], [0, 1], {
|
|
70
|
+
extrapolateLeft: 'clamp',
|
|
71
|
+
extrapolateRight: 'clamp',
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// caret follows only the newest block still being written
|
|
75
|
+
let caretIdx = -1;
|
|
76
|
+
blocks.forEach((_, i) => {
|
|
77
|
+
if (frame >= cueFor(i) && frame <= cueFor(i) + WIPE + 2) caretIdx = i;
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<>
|
|
82
|
+
<PageCam src="textures/live/wbr-full.png" pageH={PAGE_H} keys={CAM_KEYS} ease={Easing.bezier(0.33, 0, 0.15, 1)}>
|
|
83
|
+
{blocks.map((p, i) => {
|
|
84
|
+
const cue = cueFor(i);
|
|
85
|
+
// paper cover wipes away left→right (anchored right, width 100%→0)
|
|
86
|
+
const coverT = interpolate(frame, [cue, cue + WIPE], [1, 0], {
|
|
87
|
+
extrapolateLeft: 'clamp',
|
|
88
|
+
extrapolateRight: 'clamp',
|
|
89
|
+
easing: REVEAL_EASE,
|
|
90
|
+
});
|
|
91
|
+
// li boxes exclude their ::marker dot (drawn ~22px left of the text),
|
|
92
|
+
// so bullet covers extend left to hide the dot until the wipe.
|
|
93
|
+
const bx = p.tag === 'li' ? p.x - 28 : p.x - 4;
|
|
94
|
+
const by = p.y - 3;
|
|
95
|
+
const bw = p.w + (p.tag === 'li' ? 34 : 10);
|
|
96
|
+
const bh = p.h + 6;
|
|
97
|
+
|
|
98
|
+
// caret rides the reveal front edge (left edge of the cover)
|
|
99
|
+
const caretX = bx + bw * (1 - coverT);
|
|
100
|
+
const caretH = Math.min(20, p.h - 2);
|
|
101
|
+
|
|
102
|
+
// member-name @-mention wash, 4 frames after the wipe completes,
|
|
103
|
+
// sized to the heading's true text width
|
|
104
|
+
const nameCue = cue + WIPE + 4;
|
|
105
|
+
const nameGrow = memberH2.has(i)
|
|
106
|
+
? interpolate(frame, [nameCue, nameCue + 8], [0, 1], {
|
|
107
|
+
extrapolateLeft: 'clamp',
|
|
108
|
+
extrapolateRight: 'clamp',
|
|
109
|
+
easing: Easing.bezier(0.3, 0, 0.2, 1),
|
|
110
|
+
})
|
|
111
|
+
: 0;
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<div key={i}>
|
|
115
|
+
{/* @-mention wash on the member name (under the cover) */}
|
|
116
|
+
{nameGrow > 0 ? (
|
|
117
|
+
<div
|
|
118
|
+
style={{
|
|
119
|
+
position: 'absolute',
|
|
120
|
+
left: p.x - 3,
|
|
121
|
+
top: p.y - 1,
|
|
122
|
+
width: (p.w + 8) * nameGrow,
|
|
123
|
+
height: p.h + 2,
|
|
124
|
+
background: AMBER_WASH,
|
|
125
|
+
opacity: 0.7,
|
|
126
|
+
borderRadius: 3,
|
|
127
|
+
pointerEvents: 'none',
|
|
128
|
+
}}
|
|
129
|
+
/>
|
|
130
|
+
) : null}
|
|
131
|
+
|
|
132
|
+
{/* paper cover that wipes off to reveal the "written" text */}
|
|
133
|
+
{coverT > 0 ? (
|
|
134
|
+
<div
|
|
135
|
+
style={{
|
|
136
|
+
position: 'absolute',
|
|
137
|
+
left: bx,
|
|
138
|
+
top: by,
|
|
139
|
+
width: bw,
|
|
140
|
+
height: bh,
|
|
141
|
+
overflow: 'hidden',
|
|
142
|
+
pointerEvents: 'none',
|
|
143
|
+
}}
|
|
144
|
+
>
|
|
145
|
+
<div
|
|
146
|
+
style={{
|
|
147
|
+
position: 'absolute',
|
|
148
|
+
right: 0,
|
|
149
|
+
top: 0,
|
|
150
|
+
bottom: 0,
|
|
151
|
+
width: `${coverT * 100}%`,
|
|
152
|
+
background: PAPER,
|
|
153
|
+
}}
|
|
154
|
+
/>
|
|
155
|
+
</div>
|
|
156
|
+
) : null}
|
|
157
|
+
|
|
158
|
+
{/* amber caret at the writing front — newest block only */}
|
|
159
|
+
{i === caretIdx ? (
|
|
160
|
+
<div
|
|
161
|
+
style={{
|
|
162
|
+
position: 'absolute',
|
|
163
|
+
left: caretX,
|
|
164
|
+
top: p.y + (p.h - caretH) / 2,
|
|
165
|
+
width: 2,
|
|
166
|
+
height: caretH,
|
|
167
|
+
background: AMBER,
|
|
168
|
+
opacity:
|
|
169
|
+
coverT > 0
|
|
170
|
+
? 1
|
|
171
|
+
: interpolate(frame, [cue + WIPE, cue + WIPE + 2], [1, 0], {
|
|
172
|
+
extrapolateLeft: 'clamp',
|
|
173
|
+
extrapolateRight: 'clamp',
|
|
174
|
+
}),
|
|
175
|
+
pointerEvents: 'none',
|
|
176
|
+
}}
|
|
177
|
+
/>
|
|
178
|
+
) : null}
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
})}
|
|
182
|
+
|
|
183
|
+
{/* side-rail entrances: each rail hides under a paper patch, then wipes
|
|
184
|
+
on top→bottom while its inner edge lights up amber and fades. */}
|
|
185
|
+
{[
|
|
186
|
+
{ rail: leftRail, cue: 46, inner: 'right' as const },
|
|
187
|
+
{ rail: rightRail, cue: 54, inner: 'left' as const },
|
|
188
|
+
].map(({ rail, cue, inner }, i) => {
|
|
189
|
+
const t = interpolate(frame, [cue, cue + 10], [0, 1], {
|
|
190
|
+
extrapolateLeft: 'clamp',
|
|
191
|
+
extrapolateRight: 'clamp',
|
|
192
|
+
easing: Easing.bezier(0.3, 0, 0.2, 1),
|
|
193
|
+
});
|
|
194
|
+
const lineFade = interpolate(frame, [cue + 10, cue + 24], [1, 0], {
|
|
195
|
+
extrapolateLeft: 'clamp',
|
|
196
|
+
extrapolateRight: 'clamp',
|
|
197
|
+
});
|
|
198
|
+
return (
|
|
199
|
+
<div key={`rail${i}`}>
|
|
200
|
+
{/* paper patch shrinking downward = rail revealed top→bottom */}
|
|
201
|
+
{t < 1 ? (
|
|
202
|
+
<div
|
|
203
|
+
style={{
|
|
204
|
+
position: 'absolute',
|
|
205
|
+
left: rail.x,
|
|
206
|
+
top: rail.y + rail.h * t,
|
|
207
|
+
width: rail.w,
|
|
208
|
+
height: rail.h * (1 - t),
|
|
209
|
+
background: PAPER,
|
|
210
|
+
pointerEvents: 'none',
|
|
211
|
+
}}
|
|
212
|
+
/>
|
|
213
|
+
) : null}
|
|
214
|
+
{/* inner-edge amber line: grows with the wipe, then fades */}
|
|
215
|
+
{frame >= cue && lineFade > 0 ? (
|
|
216
|
+
<div
|
|
217
|
+
style={{
|
|
218
|
+
position: 'absolute',
|
|
219
|
+
left: inner === 'right' ? rail.x + rail.w - 1.5 : rail.x,
|
|
220
|
+
top: rail.y,
|
|
221
|
+
width: 1.5,
|
|
222
|
+
height: rail.h * t,
|
|
223
|
+
background: AMBER,
|
|
224
|
+
opacity: lineFade,
|
|
225
|
+
pointerEvents: 'none',
|
|
226
|
+
}}
|
|
227
|
+
/>
|
|
228
|
+
) : null}
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
})}
|
|
232
|
+
{/* past weeks drop into the left rail from above, stacking in order */}
|
|
233
|
+
{PAST_WEEKS.map((w, i) => {
|
|
234
|
+
const cue = WEEK_CUE(i);
|
|
235
|
+
if (frame < cue) return null;
|
|
236
|
+
const t = interpolate(frame, [cue, cue + 8], [0, 1], {
|
|
237
|
+
extrapolateLeft: 'clamp',
|
|
238
|
+
extrapolateRight: 'clamp',
|
|
239
|
+
easing: WEEK_DROP,
|
|
240
|
+
});
|
|
241
|
+
const appear = interpolate(frame, [cue, cue + 3], [0, 1], {
|
|
242
|
+
extrapolateLeft: 'clamp',
|
|
243
|
+
extrapolateRight: 'clamp',
|
|
244
|
+
});
|
|
245
|
+
const air = Math.max(0, 1 - t);
|
|
246
|
+
return (
|
|
247
|
+
<div
|
|
248
|
+
key={w.week}
|
|
249
|
+
style={{
|
|
250
|
+
position: 'absolute',
|
|
251
|
+
left: 4,
|
|
252
|
+
top: WEEK_Y0 + i * WEEK_H,
|
|
253
|
+
width: leftRail.w - 8,
|
|
254
|
+
height: WEEK_H,
|
|
255
|
+
transform: `translateY(${-44 * air}px)`,
|
|
256
|
+
opacity: appear,
|
|
257
|
+
boxShadow: air > 0.02 ? `0 ${10 * air}px ${20 * air}px rgba(30,25,18,${0.16 * air})` : 'none',
|
|
258
|
+
background: PAPER,
|
|
259
|
+
borderBottom: '1px solid rgba(31,41,55,0.07)',
|
|
260
|
+
padding: '8px 10px 0',
|
|
261
|
+
boxSizing: 'border-box',
|
|
262
|
+
fontFamily: SANS,
|
|
263
|
+
pointerEvents: 'none',
|
|
264
|
+
}}
|
|
265
|
+
>
|
|
266
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
|
|
267
|
+
<span style={{ fontSize: 13, fontWeight: 500, color: '#1f2937' }}>{w.week}</span>
|
|
268
|
+
<span style={{ fontSize: 10, color: '#9ca3af' }}>{w.date}</span>
|
|
269
|
+
</div>
|
|
270
|
+
<div style={{ marginTop: 2, fontSize: 11, color: '#6b7280', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>
|
|
271
|
+
{w.title}
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
);
|
|
275
|
+
})}
|
|
276
|
+
</PageCam>
|
|
277
|
+
|
|
278
|
+
{/* screen-space kicker, top-right */}
|
|
279
|
+
<div
|
|
280
|
+
style={{
|
|
281
|
+
position: 'absolute',
|
|
282
|
+
top: 16, // inside the page's empty top-nav band at full-page framing,
|
|
283
|
+
right: 96, // clear of the comment rail's own header
|
|
284
|
+
|
|
285
|
+
textAlign: 'right',
|
|
286
|
+
fontFamily: MONO,
|
|
287
|
+
fontSize: 24,
|
|
288
|
+
letterSpacing: '0.14em',
|
|
289
|
+
color: 'oklch(50% 0.006 82)',
|
|
290
|
+
textTransform: 'uppercase',
|
|
291
|
+
opacity: kick,
|
|
292
|
+
pointerEvents: 'none',
|
|
293
|
+
}}
|
|
294
|
+
>
|
|
295
|
+
Weekly Brief · 2026-W28
|
|
296
|
+
</div>
|
|
297
|
+
</>
|
|
298
|
+
);
|
|
299
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# ShotCraft reference bundle
|
|
2
|
+
|
|
3
|
+
This is a lightweight, read-only knowledge layer derived from video-shotcraft
|
|
4
|
+
revision `bdd94be16d60fa8f` under Apache-2.0.
|
|
5
|
+
|
|
6
|
+
It contains 106 shot cards, 164 style
|
|
7
|
+
records, core production notes, and TypeScript/TSX references. Preview video,
|
|
8
|
+
audio, raster media, dependencies, and a runnable Remotion project are
|
|
9
|
+
intentionally excluded. Use `scripts/query_shotcraft.mjs` to select
|
|
10
|
+
references, then author the final output as HyperFrames HTML.
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "./minimax_runtime_config.mjs";
|
|
12
12
|
|
|
13
13
|
const DEFAULT_ENDPOINT = "https://api.minimaxi.com/v1/music_generation";
|
|
14
|
+
const PROVIDER = "minimax_cn";
|
|
14
15
|
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
15
16
|
const skillRoot = dirname(scriptDir);
|
|
16
17
|
|
|
@@ -107,7 +108,7 @@ Options:
|
|
|
107
108
|
--format <mp3|wav|pcm> Audio encoding format, default mp3
|
|
108
109
|
--sample-rate <rate> 16000, 24000, 32000, or 44100; default 44100
|
|
109
110
|
--bitrate <bits> 32000, 64000, 128000, or 256000; default 256000
|
|
110
|
-
--model <model> music-2.6 or music-2.6-free
|
|
111
|
+
--model <model> music-3.0, music-2.6, or music-2.6-free
|
|
111
112
|
--config <file> Explicit MiniMax config JSON
|
|
112
113
|
--request-json <file> Read request options from a JSON file
|
|
113
114
|
--dry-run Print redacted request without contacting MiniMax
|
|
@@ -147,18 +148,32 @@ function mergeOptions(jsonOptions, cliOptions) {
|
|
|
147
148
|
}
|
|
148
149
|
|
|
149
150
|
function endpointFromEnv(env = process.env) {
|
|
150
|
-
|
|
151
|
+
const endpoint = env.MINIMAX_MUSIC_ENDPOINT || DEFAULT_ENDPOINT;
|
|
152
|
+
if (!URL.canParse(endpoint)) {
|
|
153
|
+
throw minimaxError(`MiniMax mainland China endpoint is not a valid URL: ${endpoint}`, {
|
|
154
|
+
kind: "validation",
|
|
155
|
+
retryable: false,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (endpoint !== DEFAULT_ENDPOINT && env.MINIMAX_ALLOW_TEST_ENDPOINT !== "1") {
|
|
159
|
+
throw minimaxError(`MiniMax music generation must use the mainland China endpoint ${DEFAULT_ENDPOINT}`, {
|
|
160
|
+
kind: "validation",
|
|
161
|
+
retryable: false,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return endpoint;
|
|
151
165
|
}
|
|
152
166
|
|
|
153
167
|
function timeoutFromEnv(env = process.env) {
|
|
154
|
-
const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "
|
|
168
|
+
const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "1800000", 10);
|
|
155
169
|
return Number.isFinite(value) && value > 0 ? value : 60000;
|
|
156
170
|
}
|
|
157
171
|
|
|
158
172
|
function makeErrorEnvelope(error, attempts = 0) {
|
|
159
173
|
return {
|
|
160
174
|
ok: false,
|
|
161
|
-
provider:
|
|
175
|
+
provider: PROVIDER,
|
|
176
|
+
region: "cn",
|
|
162
177
|
error: {
|
|
163
178
|
kind: error.kind || "validation",
|
|
164
179
|
message: error.message,
|
|
@@ -431,7 +446,8 @@ async function writeAudioOutput({ responseJson, request, outputDir, prompt, endp
|
|
|
431
446
|
await writeFile(
|
|
432
447
|
metadataPath,
|
|
433
448
|
`${JSON.stringify({
|
|
434
|
-
provider:
|
|
449
|
+
provider: PROVIDER,
|
|
450
|
+
region: "cn",
|
|
435
451
|
endpoint,
|
|
436
452
|
request,
|
|
437
453
|
response: {
|
|
@@ -456,13 +472,12 @@ async function writeAudioOutput({ responseJson, request, outputDir, prompt, endp
|
|
|
456
472
|
async function main() {
|
|
457
473
|
try {
|
|
458
474
|
const cliOptions = parseArgs(process.argv.slice(2));
|
|
459
|
-
const endpoint = endpointFromEnv();
|
|
460
|
-
const timeoutMs = timeoutFromEnv();
|
|
461
|
-
|
|
462
475
|
if (cliOptions.help) {
|
|
463
476
|
printHelp();
|
|
464
477
|
return;
|
|
465
478
|
}
|
|
479
|
+
const endpoint = endpointFromEnv();
|
|
480
|
+
const timeoutMs = timeoutFromEnv();
|
|
466
481
|
|
|
467
482
|
const requestJson = await readRequestJson(cliOptions.request_json);
|
|
468
483
|
const options = mergeOptions(requestJson, cliOptions);
|
|
@@ -499,7 +514,8 @@ async function main() {
|
|
|
499
514
|
printJson({
|
|
500
515
|
ok: true,
|
|
501
516
|
dry_run: true,
|
|
502
|
-
provider:
|
|
517
|
+
provider: PROVIDER,
|
|
518
|
+
region: "cn",
|
|
503
519
|
endpoint,
|
|
504
520
|
config: {
|
|
505
521
|
source: runtime.source,
|
|
@@ -527,7 +543,8 @@ async function main() {
|
|
|
527
543
|
|
|
528
544
|
printJson({
|
|
529
545
|
ok: true,
|
|
530
|
-
provider:
|
|
546
|
+
provider: PROVIDER,
|
|
547
|
+
region: "cn",
|
|
531
548
|
model: request.model,
|
|
532
549
|
attempts,
|
|
533
550
|
output_path: output.audioPath,
|
|
@@ -10,6 +10,9 @@ import {
|
|
|
10
10
|
|
|
11
11
|
const DEFAULT_TTS_ENDPOINT = "https://api.minimaxi.com/v1/t2a_v2";
|
|
12
12
|
const DEFAULT_VOICE_ENDPOINT = "https://api.minimaxi.com/v1/get_voice";
|
|
13
|
+
const BACKUP_TTS_ENDPOINT = "https://api-bj.minimaxi.com/v1/t2a_v2";
|
|
14
|
+
const BACKUP_VOICE_ENDPOINT = "https://api-bj.minimaxi.com/v1/get_voice";
|
|
15
|
+
const PROVIDER = "minimax_cn";
|
|
13
16
|
const DEFAULT_TTS_MODEL = "speech-2.8-hd";
|
|
14
17
|
const DEFAULT_VOICE_ID = "XiaoR_001";
|
|
15
18
|
const EMOTIONS = new Set(["happy", "sad", "angry", "fearful", "disgusted", "surprised", "calm", "fluent", "whipser"]);
|
|
@@ -46,6 +49,7 @@ function parseArgs(args) {
|
|
|
46
49
|
pitch: undefined,
|
|
47
50
|
subtitle_enable: undefined,
|
|
48
51
|
config_path: undefined,
|
|
52
|
+
split_scenes: false,
|
|
49
53
|
dry_run: false,
|
|
50
54
|
};
|
|
51
55
|
|
|
@@ -106,6 +110,8 @@ function parseArgs(args) {
|
|
|
106
110
|
} else if (arg === "--config") {
|
|
107
111
|
parsed.config_path = requireValue(args, index, arg);
|
|
108
112
|
index += 1;
|
|
113
|
+
} else if (arg === "--split-scenes") {
|
|
114
|
+
parsed.split_scenes = true;
|
|
109
115
|
} else if (arg === "--dry-run") {
|
|
110
116
|
parsed.dry_run = true;
|
|
111
117
|
} else if (arg === "--help" || arg === "-h") {
|
|
@@ -142,6 +148,7 @@ Options:
|
|
|
142
148
|
--volume <value> Default 1
|
|
143
149
|
--pitch <value> Default 0
|
|
144
150
|
--subtitle-enable Ask MiniMax to include subtitle data when available
|
|
151
|
+
--split-scenes Generate one file per narration scene and an exact timing manifest
|
|
145
152
|
--config <file> Explicit MiniMax config JSON
|
|
146
153
|
--dry-run Print redacted request without contacting MiniMax
|
|
147
154
|
`);
|
|
@@ -160,7 +167,8 @@ function minimaxError(message, fields = {}) {
|
|
|
160
167
|
function makeErrorEnvelope(error, attempts = 0) {
|
|
161
168
|
return {
|
|
162
169
|
ok: false,
|
|
163
|
-
provider:
|
|
170
|
+
provider: PROVIDER,
|
|
171
|
+
region: "cn",
|
|
164
172
|
error: {
|
|
165
173
|
kind: error.kind || "validation",
|
|
166
174
|
message: error.message,
|
|
@@ -280,14 +288,34 @@ function buildTtsRequest(options) {
|
|
|
280
288
|
}
|
|
281
289
|
|
|
282
290
|
function endpointFromEnv(env = process.env) {
|
|
291
|
+
const tts = env.MINIMAX_TTS_ENDPOINT || DEFAULT_TTS_ENDPOINT;
|
|
292
|
+
const voice = env.MINIMAX_VOICE_ENDPOINT || DEFAULT_VOICE_ENDPOINT;
|
|
293
|
+
const allowTest = env.MINIMAX_ALLOW_TEST_ENDPOINT === "1";
|
|
294
|
+
|
|
295
|
+
for (const [label, endpoint, allowed] of [
|
|
296
|
+
["TTS", tts, [DEFAULT_TTS_ENDPOINT, BACKUP_TTS_ENDPOINT]],
|
|
297
|
+
["voice", voice, [DEFAULT_VOICE_ENDPOINT, BACKUP_VOICE_ENDPOINT]],
|
|
298
|
+
]) {
|
|
299
|
+
if (!URL.canParse(endpoint)) {
|
|
300
|
+
throw minimaxError(`MiniMax mainland China ${label} endpoint is not a valid URL: ${endpoint}`, {
|
|
301
|
+
kind: "validation",
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
if (!allowTest && !allowed.includes(endpoint)) {
|
|
305
|
+
throw minimaxError(`MiniMax ${label} requests must use a mainland China minimaxi.com endpoint`, {
|
|
306
|
+
kind: "validation",
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
283
311
|
return {
|
|
284
|
-
tts
|
|
285
|
-
voice
|
|
312
|
+
tts,
|
|
313
|
+
voice,
|
|
286
314
|
};
|
|
287
315
|
}
|
|
288
316
|
|
|
289
317
|
function timeoutFromEnv(env = process.env) {
|
|
290
|
-
const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "
|
|
318
|
+
const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "1800000", 10);
|
|
291
319
|
return Number.isFinite(value) && value > 0 ? value : 60000;
|
|
292
320
|
}
|
|
293
321
|
|
|
@@ -392,7 +420,7 @@ function safeFileStem(value) {
|
|
|
392
420
|
return stem || "minimax-tts";
|
|
393
421
|
}
|
|
394
422
|
|
|
395
|
-
async function writeTtsOutput({ responseJson, request, outputDir, endpoint }) {
|
|
423
|
+
async function writeTtsOutput({ responseJson, request, outputDir, endpoint, fileStem }) {
|
|
396
424
|
if (responseJson.data?.status !== 2) {
|
|
397
425
|
throw minimaxError(`MiniMax TTS generation is not complete; data.status is ${responseJson.data?.status}`, { kind: "provider" });
|
|
398
426
|
}
|
|
@@ -401,15 +429,16 @@ async function writeTtsOutput({ responseJson, request, outputDir, endpoint }) {
|
|
|
401
429
|
}
|
|
402
430
|
|
|
403
431
|
await mkdir(outputDir, { recursive: true });
|
|
404
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
405
432
|
const extension = request.audio_setting.format === "pcm" ? "pcm" : request.audio_setting.format;
|
|
406
|
-
const
|
|
433
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
434
|
+
const stem = fileStem || `${safeFileStem(request.voice_setting.voice_id)}-${timestamp}`;
|
|
407
435
|
const audioPath = join(outputDir, `${stem}.${extension}`);
|
|
408
436
|
const metadataPath = join(outputDir, `${stem}.minimax-tts.json`);
|
|
409
437
|
|
|
410
438
|
await writeFile(audioPath, decodeHexAudio(responseJson.data.audio));
|
|
411
439
|
await writeFile(metadataPath, `${JSON.stringify({
|
|
412
|
-
provider:
|
|
440
|
+
provider: PROVIDER,
|
|
441
|
+
region: "cn",
|
|
413
442
|
endpoint,
|
|
414
443
|
request,
|
|
415
444
|
response: {
|
|
@@ -467,7 +496,8 @@ async function listVoices(options, runtime, endpoints, timeoutMs) {
|
|
|
467
496
|
|
|
468
497
|
return {
|
|
469
498
|
ok: true,
|
|
470
|
-
provider:
|
|
499
|
+
provider: PROVIDER,
|
|
500
|
+
region: "cn",
|
|
471
501
|
endpoint: endpoints.voice,
|
|
472
502
|
voice_type: options.voice_type,
|
|
473
503
|
config: {
|
|
@@ -479,16 +509,84 @@ async function listVoices(options, runtime, endpoints, timeoutMs) {
|
|
|
479
509
|
};
|
|
480
510
|
}
|
|
481
511
|
|
|
512
|
+
async function generateSplitScenes({
|
|
513
|
+
narration,
|
|
514
|
+
options,
|
|
515
|
+
runtime,
|
|
516
|
+
endpoint,
|
|
517
|
+
timeoutMs,
|
|
518
|
+
narrationPath,
|
|
519
|
+
}) {
|
|
520
|
+
if (!narration) {
|
|
521
|
+
throw minimaxError("--split-scenes requires --narration-json", { kind: "validation" });
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
await mkdir(options.output_dir, { recursive: true });
|
|
525
|
+
const scenes = [];
|
|
526
|
+
let elapsedMs = 0;
|
|
527
|
+
|
|
528
|
+
for (let index = 0; index < narration.scenes.length; index += 1) {
|
|
529
|
+
const scene = narration.scenes[index];
|
|
530
|
+
const sceneOptions = { ...options, text: scene.narration.trim() };
|
|
531
|
+
validateOptions(sceneOptions);
|
|
532
|
+
const request = buildTtsRequest(sceneOptions);
|
|
533
|
+
const responseJson = await postMiniMax(runtime.config, endpoint, request, timeoutMs);
|
|
534
|
+
const output = await writeTtsOutput({
|
|
535
|
+
responseJson,
|
|
536
|
+
request,
|
|
537
|
+
outputDir: options.output_dir,
|
|
538
|
+
endpoint,
|
|
539
|
+
fileStem: `scene-${String(index + 1).padStart(3, "0")}`,
|
|
540
|
+
});
|
|
541
|
+
const durationMs = Number(responseJson.extra_info?.audio_length);
|
|
542
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0) {
|
|
543
|
+
throw minimaxError(`MiniMax scene ${index + 1} did not return extra_info.audio_length`, {
|
|
544
|
+
kind: "response",
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
scenes.push({
|
|
549
|
+
scene: scene.scene ?? index + 1,
|
|
550
|
+
title: scene.title ?? null,
|
|
551
|
+
sync_hint: scene.sync_hint ?? null,
|
|
552
|
+
narration: scene.narration,
|
|
553
|
+
duration_ms: durationMs,
|
|
554
|
+
start_seconds: elapsedMs / 1000,
|
|
555
|
+
end_seconds: (elapsedMs + durationMs) / 1000,
|
|
556
|
+
output_path: output.audioPath,
|
|
557
|
+
metadata_path: output.metadataPath,
|
|
558
|
+
});
|
|
559
|
+
elapsedMs += durationMs;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
const manifestPath = join(options.output_dir, "narration-manifest.json");
|
|
563
|
+
await writeFile(manifestPath, `${JSON.stringify({
|
|
564
|
+
schema_version: "1.0.0",
|
|
565
|
+
provider: PROVIDER,
|
|
566
|
+
region: "cn",
|
|
567
|
+
endpoint,
|
|
568
|
+
narration_path: narrationPath,
|
|
569
|
+
model: options.model,
|
|
570
|
+
voice_id: options.voice_id,
|
|
571
|
+
emotion: options.emotion,
|
|
572
|
+
duration_ms: elapsedMs,
|
|
573
|
+
duration_seconds: elapsedMs / 1000,
|
|
574
|
+
scenes,
|
|
575
|
+
}, null, 2)}\n`, "utf8");
|
|
576
|
+
|
|
577
|
+
return { manifestPath, scenes, durationMs: elapsedMs };
|
|
578
|
+
}
|
|
579
|
+
|
|
482
580
|
async function main() {
|
|
483
581
|
try {
|
|
484
582
|
const cliOptions = parseArgs(process.argv.slice(2));
|
|
485
|
-
const endpoints = endpointFromEnv();
|
|
486
|
-
const timeoutMs = timeoutFromEnv();
|
|
487
583
|
|
|
488
584
|
if (cliOptions.help) {
|
|
489
585
|
printHelp();
|
|
490
586
|
return;
|
|
491
587
|
}
|
|
588
|
+
const endpoints = endpointFromEnv();
|
|
589
|
+
const timeoutMs = timeoutFromEnv();
|
|
492
590
|
|
|
493
591
|
const runtime = await readRuntime(cliOptions);
|
|
494
592
|
|
|
@@ -514,7 +612,8 @@ async function main() {
|
|
|
514
612
|
printJson({
|
|
515
613
|
ok: true,
|
|
516
614
|
dry_run: true,
|
|
517
|
-
provider:
|
|
615
|
+
provider: PROVIDER,
|
|
616
|
+
region: "cn",
|
|
518
617
|
endpoint: endpoints.tts,
|
|
519
618
|
config: {
|
|
520
619
|
source: runtime.source,
|
|
@@ -524,11 +623,40 @@ async function main() {
|
|
|
524
623
|
request_path: cliOptions.request_json,
|
|
525
624
|
narration_path: cliOptions.narration_json,
|
|
526
625
|
request,
|
|
626
|
+
scene_requests: cliOptions.split_scenes
|
|
627
|
+
? narration.scenes.map((scene) => buildTtsRequest({ ...options, text: scene.narration.trim() }))
|
|
628
|
+
: undefined,
|
|
527
629
|
output_dir: options.output_dir,
|
|
528
630
|
});
|
|
529
631
|
return;
|
|
530
632
|
}
|
|
531
633
|
|
|
634
|
+
if (cliOptions.split_scenes) {
|
|
635
|
+
const split = await generateSplitScenes({
|
|
636
|
+
narration,
|
|
637
|
+
options,
|
|
638
|
+
runtime,
|
|
639
|
+
endpoint: endpoints.tts,
|
|
640
|
+
timeoutMs,
|
|
641
|
+
narrationPath: cliOptions.narration_json,
|
|
642
|
+
});
|
|
643
|
+
printJson({
|
|
644
|
+
ok: true,
|
|
645
|
+
provider: PROVIDER,
|
|
646
|
+
region: "cn",
|
|
647
|
+
mode: "split_scenes",
|
|
648
|
+
model: options.model,
|
|
649
|
+
voice_id: options.voice_id,
|
|
650
|
+
emotion: options.emotion,
|
|
651
|
+
scene_count: split.scenes.length,
|
|
652
|
+
duration_ms: split.durationMs,
|
|
653
|
+
duration_seconds: split.durationMs / 1000,
|
|
654
|
+
manifest_path: split.manifestPath,
|
|
655
|
+
outputs: split.scenes.map((scene) => scene.output_path),
|
|
656
|
+
});
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
|
|
532
660
|
const responseJson = await postMiniMax(runtime.config, endpoints.tts, request, timeoutMs);
|
|
533
661
|
const output = await writeTtsOutput({
|
|
534
662
|
responseJson,
|
|
@@ -539,7 +667,8 @@ async function main() {
|
|
|
539
667
|
|
|
540
668
|
printJson({
|
|
541
669
|
ok: true,
|
|
542
|
-
provider:
|
|
670
|
+
provider: PROVIDER,
|
|
671
|
+
region: "cn",
|
|
543
672
|
model: request.model,
|
|
544
673
|
voice_id: request.voice_setting.voice_id,
|
|
545
674
|
emotion: request.voice_setting.emotion,
|