Commit e8e21050c2d5d5533c96fde3ede8286d54cfd91d

Authored by yibo
1 parent 77fc25b6

Bump default clip duration to 10s (was 5s)

H3_GEN_PARAMS.frames 120 -> 240 (at 24fps, 5s -> 10s), still within H3's
4-15s range (H2 in docs/h3skill.md). Updated the prompt-optimization system
prompt's duration reference and widened its word budget (40-70 -> 60-100)
to match — still one continuous shot, just more room to let the camera move
and the action unfold. Verified against the real GLM endpoint.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144MiJ2cLjMd9jWaeEpVfUJ
Showing 2 changed files with 93 additions and 51 deletions
library.json
... ... @@ -385,7 +385,8 @@
385 385 "likes": 0,
386 386 "createdAt": 1788188423583,
387 387 "promptEn": "woman in white scared, dodging",
388   - "lastPlayedAt": 1788253953855
  388 + "lastPlayedAt": 1788256884709,
  389 + "playCount": 1
389 390 },
390 391 {
391 392 "id": "1597db4be561",
... ... @@ -415,8 +416,9 @@
415 416 "partition": "ref2va",
416 417 "likes": 0,
417 418 "createdAt": 1788186218619,
418   - "lastPlayedAt": 1788253885823,
419   - "promptEn": "woman in white evading, scared"
  419 + "lastPlayedAt": 1788256608572,
  420 + "promptEn": "woman in white evading, scared",
  421 + "playCount": 1
420 422 },
421 423 {
422 424 "id": "6cb4eb75ee09",
... ... @@ -447,7 +449,8 @@
447 449 "likes": 0,
448 450 "createdAt": 1788181569491,
449 451 "promptEn": "a massive warship glides through the stars, the bridge suddenly shakes hard",
450   - "lastPlayedAt": 1788254390052
  452 + "lastPlayedAt": 1788256956743,
  453 + "playCount": 1
451 454 },
452 455 {
453 456 "id": "44bf5b969e94",
... ... @@ -698,7 +701,8 @@
698 701 "likes": 0,
699 702 "createdAt": 1788039783070,
700 703 "promptEn": "silver-haired idol backstage, red light pulsing, offering a blood-red contract",
701   - "lastPlayedAt": 1788251726803
  704 + "lastPlayedAt": 1788256740633,
  705 + "playCount": 1
702 706 },
703 707 {
704 708 "id": "75bdbacd3012",
... ... @@ -713,7 +717,8 @@
713 717 "likes": 0,
714 718 "createdAt": 1788039782992,
715 719 "promptEn": "silver-haired idol backstage, red light pulsing, offering a blood-red contract",
716   - "lastPlayedAt": 1788250966325
  720 + "lastPlayedAt": 1788256952747,
  721 + "playCount": 1
717 722 },
718 723 {
719 724 "id": "69e75a6b3997",
... ... @@ -728,7 +733,8 @@
728 733 "likes": 0,
729 734 "createdAt": 1788027833836,
730 735 "promptEn": "wounded hunter at a ruined subway dungeon entrance, lightning flickers, pointing into the tunnel",
731   - "lastPlayedAt": 1788254268003
  736 + "lastPlayedAt": 1788256770648,
  737 + "playCount": 1
732 738 },
733 739 {
734 740 "id": "cde399c27dc4",
... ... @@ -867,7 +873,8 @@
867 873 "likes": 0,
868 874 "createdAt": 1788025642732,
869 875 "promptEn": "Vecna reaching out a claw in his lair in the Upside Down, red lightning",
870   - "lastPlayedAt": 1788254043902
  876 + "lastPlayedAt": 1788256948747,
  877 + "playCount": 1
871 878 },
872 879 {
873 880 "id": "00862f966c3f",
... ... @@ -1072,7 +1079,8 @@
1072 1079 "likes": 0,
1073 1080 "createdAt": 1788019483999,
1074 1081 "promptEn": "constable rushes in, glances back at the door, then talks to the woman behind the screen",
1075   - "lastPlayedAt": 1788252139001
  1082 + "lastPlayedAt": 1788256844693,
  1083 + "playCount": 1
1076 1084 },
1077 1085 {
1078 1086 "id": "998e3e6f9a2f",
... ... @@ -1541,7 +1549,8 @@
1541 1549 "likes": 0,
1542 1550 "createdAt": 1788010775613,
1543 1551 "promptEn": "facing Voldemort, stayed passive and got cornered",
1544   - "lastPlayedAt": 1788254061908
  1552 + "lastPlayedAt": 1788256874709,
  1553 + "playCount": 1
1545 1554 },
1546 1555 {
1547 1556 "id": "795842efa4a1",
... ... @@ -1571,7 +1580,8 @@
1571 1580 "likes": 0,
1572 1581 "createdAt": 1788010299688,
1573 1582 "promptEn": "facing Thanos, exploiting a flaw to counter him",
1574   - "lastPlayedAt": 1788251102950
  1583 + "lastPlayedAt": 1788256914727,
  1584 + "playCount": 1
1575 1585 },
1576 1586 {
1577 1587 "id": "469294a4ed09",
... ... @@ -1586,7 +1596,8 @@
1586 1596 "likes": 0,
1587 1597 "createdAt": 1788010062535,
1588 1598 "promptEn": "facing Thanos, held the goal but paid a price",
1589   - "lastPlayedAt": 1788254091920
  1599 + "lastPlayedAt": 1788256578563,
  1600 + "playCount": 1
1590 1601 },
1591 1602 {
1592 1603 "id": "324b84ebc607",
... ... @@ -1633,7 +1644,8 @@
1633 1644 "likes": 0,
1634 1645 "createdAt": 1788009346020,
1635 1646 "promptEn": "battlefield on Titan, the last chance to stop Thanos",
1636   - "lastPlayedAt": 1788252467159
  1647 + "lastPlayedAt": 1788256852697,
  1648 + "playCount": 1
1637 1649 },
1638 1650 {
1639 1651 "id": "66a96c6bc7cb",
... ... @@ -1725,7 +1737,8 @@
1725 1737 "likes": 0,
1726 1738 "createdAt": 1788007915610,
1727 1739 "promptEn": "in the ruined city, exploiting a flaw to counter Tomura",
1728   - "lastPlayedAt": 1788252961326
  1740 + "lastPlayedAt": 1788256800671,
  1741 + "playCount": 1
1729 1742 },
1730 1743 {
1731 1744 "id": "f67685cd6862",
... ... @@ -1771,7 +1784,8 @@
1771 1784 "likes": 0,
1772 1785 "createdAt": 1788007201908,
1773 1786 "promptEn": "breaking into the palace, Neferpitou stalling to protect the king",
1774   - "lastPlayedAt": 1788254139946
  1787 + "lastPlayedAt": 1788256816681,
  1788 + "playCount": 1
1775 1789 },
1776 1790 {
1777 1791 "id": "628026375795",
... ... @@ -1880,7 +1894,8 @@
1880 1894 "likes": 0,
1881 1895 "createdAt": 1788005541640,
1882 1896 "promptEn": "facing Frieza, went in head-on and got seen through",
1883   - "lastPlayedAt": 1788253741753
  1897 + "lastPlayedAt": 1788256826688,
  1898 + "playCount": 1
1884 1899 },
1885 1900 {
1886 1901 "id": "574b47b00316",
... ... @@ -2160,7 +2175,8 @@
2160 2175 "likes": 0,
2161 2176 "createdAt": 1788001428705,
2162 2177 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain",
2163   - "lastPlayedAt": 1788253511622
  2178 + "lastPlayedAt": 1788256774651,
  2179 + "playCount": 1
2164 2180 },
2165 2181 {
2166 2182 "id": "e486fab4c24d",
... ... @@ -2207,7 +2223,8 @@
2207 2223 "likes": 0,
2208 2224 "createdAt": 1788000812932,
2209 2225 "promptEn": "facing Pain, went in head-on and got seen through",
2210   - "lastPlayedAt": 1788253905836
  2226 + "lastPlayedAt": 1788256552547,
  2227 + "playCount": 1
2211 2228 },
2212 2229 {
2213 2230 "id": "f691ac021df0",
... ... @@ -2318,7 +2335,8 @@
2318 2335 "likes": 0,
2319 2336 "createdAt": 1787999397097,
2320 2337 "promptEn": "facing Sakazuki, stayed passive and got cornered",
2321   - "lastPlayedAt": 1788253761764
  2338 + "lastPlayedAt": 1788256856695,
  2339 + "playCount": 1
2322 2340 },
2323 2341 {
2324 2342 "id": "88923aaf57f3",
... ... @@ -2412,7 +2430,8 @@
2412 2430 "likes": 0,
2413 2431 "createdAt": 1787831362083,
2414 2432 "promptEn": "constable promises to get her out safely if she trusts him",
2415   - "lastPlayedAt": 1788253719743
  2433 + "lastPlayedAt": 1788256588563,
  2434 + "playCount": 1
2416 2435 },
2417 2436 {
2418 2437 "id": "5ede61c01b22",
... ... @@ -2506,7 +2525,8 @@
2506 2525 "likes": 0,
2507 2526 "createdAt": 1787738044140,
2508 2527 "promptEn": "constable carefully checks the door and window latches, she watches from behind the screen",
2509   - "lastPlayedAt": 1788252857278
  2528 + "lastPlayedAt": 1788256778656,
  2529 + "playCount": 1
2510 2530 },
2511 2531 {
2512 2532 "id": "cfbef6e37ae4",
... ... @@ -2616,7 +2636,8 @@
2616 2636 "likes": 0,
2617 2637 "createdAt": 1787708686397,
2618 2638 "promptEn": "constable accepts the invitation, moves to sit on a stool closer to the screen",
2619   - "lastPlayedAt": 1788254145947
  2639 + "lastPlayedAt": 1788256558556,
  2640 + "playCount": 1
2620 2641 },
2621 2642 {
2622 2643 "id": "ad611bcbd06b",
... ... @@ -2854,7 +2875,8 @@
2854 2875 "likes": 0,
2855 2876 "createdAt": 1787674737743,
2856 2877 "promptEn": "constable slowly looks around the room, discovers her watching him motionlessly through the screen",
2857   - "lastPlayedAt": 1788253445593
  2878 + "lastPlayedAt": 1788256932741,
  2879 + "playCount": 1
2858 2880 },
2859 2881 {
2860 2882 "id": "c74118d0413f",
... ... @@ -2933,7 +2955,8 @@
2933 2955 "likes": 0,
2934 2956 "createdAt": 1787674660698,
2935 2957 "promptEn": "constable smashes the bronze mirror on the table, it shatters, she watches from behind the screen",
2936   - "lastPlayedAt": 1788248649121
  2958 + "lastPlayedAt": 1788256696614,
  2959 + "playCount": 1
2937 2960 },
2938 2961 {
2939 2962 "id": "ed77b83851a2",
... ... @@ -2964,7 +2987,8 @@
2964 2987 "likes": 0,
2965 2988 "createdAt": 1787674642026,
2966 2989 "promptEn": "constable enters from the side and sits down on a stool by the lamp to rest",
2967   - "lastPlayedAt": 1788251330505
  2990 + "lastPlayedAt": 1788256726628,
  2991 + "playCount": 1
2968 2992 },
2969 2993 {
2970 2994 "id": "fe7ffbe65653",
... ... @@ -3120,8 +3144,9 @@
3120 3144 "partition": "ref2va",
3121 3145 "likes": 0,
3122 3146 "createdAt": 1787652321725,
3123   - "lastPlayedAt": 1788250646200,
3124   - "promptEn": "constable talking to the woman through the screen"
  3147 + "lastPlayedAt": 1788256572557,
  3148 + "promptEn": "constable talking to the woman through the screen",
  3149 + "playCount": 1
3125 3150 },
3126 3151 {
3127 3152 "id": "31ade4712105",
... ... @@ -3278,7 +3303,8 @@
3278 3303 "likes": 0,
3279 3304 "createdAt": 1787615240988,
3280 3305 "promptEn": "clay fox sprints off a cliff, slow-mo leap over the canyon",
3281   - "lastPlayedAt": 1788251894893
  3306 + "lastPlayedAt": 1788256758642,
  3307 + "playCount": 1
3282 3308 },
3283 3309 {
3284 3310 "id": "db125dc6a831",
... ... @@ -3308,7 +3334,8 @@
3308 3334 "likes": 0,
3309 3335 "createdAt": 1787588547172,
3310 3336 "promptEn": "product website scrolling down with flashy effects",
3311   - "lastPlayedAt": 1788251228453
  3337 + "lastPlayedAt": 1788256804674,
  3338 + "playCount": 1
3312 3339 },
3313 3340 {
3314 3341 "id": "2e18bf09b46a",
... ... @@ -3432,7 +3459,8 @@
3432 3459 "likes": 0,
3433 3460 "createdAt": 1787588541726,
3434 3461 "promptEn": "woman opens the trunk on a desert road, takes out a bag",
3435   - "lastPlayedAt": 1788254335882
  3462 + "lastPlayedAt": 1788256832684,
  3463 + "playCount": 1
3436 3464 },
3437 3465 {
3438 3466 "id": "97846542ab09",
... ... @@ -3495,7 +3523,8 @@
3495 3523 "likes": 0,
3496 3524 "createdAt": 1787588114381,
3497 3525 "promptEn": "underground rap duo freestyling at the camera",
3498   - "lastPlayedAt": 1788253391568
  3526 + "lastPlayedAt": 1788256628586,
  3527 + "playCount": 1
3499 3528 },
3500 3529 {
3501 3530 "id": "58a439a93c02",
... ... @@ -3589,7 +3618,8 @@
3589 3618 "likes": 0,
3590 3619 "createdAt": 1787576798050,
3591 3620 "promptEn": "man says he's willing to give her his heart",
3592   - "lastPlayedAt": 1788252199033
  3621 + "lastPlayedAt": 1788256716625,
  3622 + "playCount": 1
3593 3623 },
3594 3624 {
3595 3625 "id": "57f2c6fa351d",
... ... @@ -3635,8 +3665,9 @@
3635 3665 "partition": "text",
3636 3666 "likes": 0,
3637 3667 "createdAt": 1787576358982,
3638   - "lastPlayedAt": 1788253923842,
3639   - "promptEn": "man apologizes, says something outside was chasing him"
  3668 + "lastPlayedAt": 1788256794665,
  3669 + "promptEn": "man apologizes, says something outside was chasing him",
  3670 + "playCount": 1
3640 3671 },
3641 3672 {
3642 3673 "id": "9fca8054035f",
... ... @@ -3681,7 +3712,8 @@
3681 3712 "likes": 0,
3682 3713 "createdAt": 1787575164928,
3683 3714 "promptEn": "man apologizes, says something outside was chasing him",
3684   - "lastPlayedAt": 1788249631916
  3715 + "lastPlayedAt": 1788256880712,
  3716 + "playCount": 1
3685 3717 },
3686 3718 {
3687 3719 "id": "250fad90393c",
... ... @@ -3918,7 +3950,8 @@
3918 3950 "likes": 0,
3919 3951 "createdAt": 1787470100107,
3920 3952 "promptEn": "MiniMax H3 brand motion graphics, a dot growing into a network",
3921   - "lastPlayedAt": 1788248973345
  3953 + "lastPlayedAt": 1788256862702,
  3954 + "playCount": 1
3922 3955 },
3923 3956 {
3924 3957 "id": "194e9bd77da6",
... ... @@ -3963,7 +3996,8 @@
3963 3996 "likes": 0,
3964 3997 "createdAt": 1787470099306,
3965 3998 "promptEn": "late-night laundromat footage mixed with glowing hand-drawn animation",
3966   - "lastPlayedAt": 1788254294016
  3999 + "lastPlayedAt": 1788256744635,
  4000 + "playCount": 1
3967 4001 },
3968 4002 {
3969 4003 "id": "c0e23beb4132",
... ... @@ -4073,7 +4107,8 @@
4073 4107 "likes": 0,
4074 4108 "createdAt": 1787450754171,
4075 4109 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4076   - "lastPlayedAt": 1788253279519
  4110 + "lastPlayedAt": 1788256646594,
  4111 + "playCount": 1
4077 4112 },
4078 4113 {
4079 4114 "id": "fd0183c54763",
... ... @@ -4289,7 +4324,8 @@
4289 4324 "likes": 0,
4290 4325 "createdAt": 1787412952086,
4291 4326 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4292   - "lastPlayedAt": 1788253367553
  4327 + "lastPlayedAt": 1788256920735,
  4328 + "playCount": 1
4293 4329 },
4294 4330 {
4295 4331 "id": "59fd7a087f5b",
... ... @@ -4492,7 +4528,8 @@
4492 4528 "likes": 0,
4493 4529 "createdAt": 1787367454249,
4494 4530 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4495   - "lastPlayedAt": 1788252831263
  4531 + "lastPlayedAt": 1788256850694,
  4532 + "playCount": 1
4496 4533 },
4497 4534 {
4498 4535 "id": "c48af2f34e62",
... ... @@ -4523,7 +4560,8 @@
4523 4560 "likes": 0,
4524 4561 "createdAt": 1787367453839,
4525 4562 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4526   - "lastPlayedAt": 1788254041895
  4563 + "lastPlayedAt": 1788256642593,
  4564 + "playCount": 1
4527 4565 },
4528 4566 {
4529 4567 "id": "8402adae59dc",
... ... @@ -4697,7 +4735,8 @@
4697 4735 "likes": 0,
4698 4736 "createdAt": 1787304031103,
4699 4737 "promptEn": "constable asks how she's sure it's not human, she says a person would make a sound",
4700   - "lastPlayedAt": 1788252124992
  4738 + "lastPlayedAt": 1788256900724,
  4739 + "playCount": 1
4701 4740 },
4702 4741 {
4703 4742 "id": "807e042dce0d",
... ... @@ -4759,7 +4798,8 @@
4759 4798 "likes": 0,
4760 4799 "createdAt": 1787231456079,
4761 4800 "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own",
4762   - "lastPlayedAt": 1788251682774
  4801 + "lastPlayedAt": 1788256546550,
  4802 + "playCount": 1
4763 4803 },
4764 4804 {
4765 4805 "id": "66158f543a20",
... ... @@ -4789,7 +4829,8 @@
4789 4829 "likes": 0,
4790 4830 "createdAt": 1787225897650,
4791 4831 "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own",
4792   - "lastPlayedAt": 1788254544113
  4832 + "lastPlayedAt": 1788256970757,
  4833 + "playCount": 1
4793 4834 },
4794 4835 {
4795 4836 "id": "ed3663dcda7f",
... ... @@ -4820,7 +4861,8 @@
4820 4861 "likes": 0,
4821 4862 "createdAt": 1787224519456,
4822 4863 "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own",
4823   - "lastPlayedAt": 1788252627218
  4864 + "lastPlayedAt": 1788256710623,
  4865 + "playCount": 1
4824 4866 },
4825 4867 {
4826 4868 "id": "a1cc621cc6b2",
... ...
server.js
... ... @@ -131,22 +131,22 @@ function glmChat(messages) {
131 131  
132 132 // Distilled from docs/h3skill.md (MiniMax's own H3 prompt-writing methodology) down to the one
133 133 // path that applies here: T2VA (no reference images — every chat prompt is plain text) on a clip
134   -// fixed at ~5s (H3_GEN_PARAMS.frames / FPS). At that length it's one continuous shot, never a
135   -// multi-cut montage — the earlier version asked for "shot-by-shot" and reliably got 4-5 fake cuts
136   -// with timestamps running out to 8-10s, which the model can't actually deliver in 5 seconds.
  134 +// fixed at ~10s (H3_GEN_PARAMS.frames / FPS). At that length it's one continuous shot, never a
  135 +// multi-cut montage — an earlier version asked for "shot-by-shot" and reliably got 4-5 fake cuts
  136 +// with timestamps running past the clip's own length, which the model can't actually deliver.
137 137 const PROMPT_OPTIMIZE_SYSTEM = `You are writing H3 text-to-video generation prompts (T2VA mode — no
138 138 reference images, pure text-to-video). Expand the user's short request (may be in Chinese or English)
139 139 into the official H3 three-field format, in this exact order, using these exact field labels:
140 140  
141 141 integrated_multimodal_description: [Shot 1] one short style statement, e.g. "Live-action, cinematic."
142   -Then describe, in one continuous unbroken shot (the clip is only about 5 seconds long — never split
  142 +Then describe, in one continuous unbroken shot (the clip is only about 10 seconds long — never split
143 143 into multiple shots or write more than [Shot 1]): the setting, the subject's specific action, and ONE
144 144 dominant camera movement using this vocabulary — Zoom In/Out, Push In/Pull Out, Pan Left/Right, Truck
145 145 Left/Right, Tilt Up/Down, Pedestal Up/Down, Arc Shot, Tracking Shot, Static Shot, Shake Slightly/
146 146 Strongly, POV, Roll Clockwise/Counterclockwise — stated as type + amplitude (small/large) + speed
147 147 (slow/fast). Describe light concretely: where it comes from, what it hits, what effect it creates.
148 148 Never use hollow quality words alone (8K, HD, masterpiece, stunning, cinematic used alone, beautiful,
149   -high quality) — replace them with what is actually visible. 40-70 English words.
  149 +high quality) — replace them with what is actually visible. 60-100 English words.
150 150  
151 151 overall_soundscape: 1-4 English sentences describing the ambient environmental sound the scene would
152 152 naturally have.
... ... @@ -180,7 +180,7 @@ async function optimizePrompt(userPrompt) {
180 180 // own past-entry trimming naturally handles a state file that's gone stale
181 181 // (server was down long enough that every persisted entry is in the past).
182 182 const FILLER_DURATION_MS = 30000; // keep the schedule filled at least this far ahead
183   -const H3_GEN_PARAMS = { width: 480, height: 832, frames: 120, steps: 20, turbo: false, seed: 0 };
  183 +const H3_GEN_PARAMS = { width: 480, height: 832, frames: 240, steps: 20, turbo: false, seed: 0 };
184 184 const FPS = 24;
185 185  
186 186 const initialLiveState = loadLiveState();
... ...