Commit c638c96c5d9574d3df47dedb0c80163d18aa39eb

Authored by yibo
1 parent daebde4d

Rewrite the prompt-optimization system prompt against H3's own methodology

The previous system prompt asked GLM for a free-form "shot-by-shot" expansion,
which reliably produced 4-5 fake cuts with timestamps running out to 8-10s —
impossible for a clip fixed at ~5s (H3_GEN_PARAMS.frames / FPS). Rewrote it
against docs/h3skill.md (MiniMax's own H3 prompt-writing methodology, added
alongside this commit): every chat prompt has no reference images, so it's
always T2VA mode, and at ~5s it's one continuous shot, never a montage.

The new prompt asks for H3's actual three-field T2VA structure
(integrated_multimodal_description / overall_soundscape / non_diegetic_music,
fixed order and labels), a single dominant camera movement from the official
vocabulary (type + amplitude + speed), concrete lighting (no hollow buzzwords
like "8K"/"cinematic" alone), and — previously missing entirely — explicit
sound design. Verified against the real GLM endpoint on several sample
prompts: single continuous shot throughout, correct field structure, no more
impossible multi-shot timestamps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144MiJ2cLjMd9jWaeEpVfUJ
docs/h3skill.md 0 → 100644
  1 +---
  2 +name: h3-video-prompt-main-skill
  3 +version: 0.6.1 (hotfix: url 载体硬不变量)
  4 +status: enabled(2026-08-29 由 org-innovator 热修 Deploy 落位,取代 v0.6.0;回滚源 = git 或 train/evolve/SKILL_v5.md)
  5 +source: MiniMax 官方一手飞书语料(train/hunt/cache_v5/,revision doc1=1297 / doc2=252,逐字落盘):
  6 + doc1 = H3 使用手册(feishu_doc1…FIWjwgL33ipnkekzk30crmKUnIh.md)
  7 + doc2 = Prompt 写作全能指南(feishu_doc2…Vztzwstuqi3MQKkxs8QcGmxinxe.md)
  8 + v4 及以前的 GitHub 镜像信源(base-en.txt / ref-en.txt / co-op 模板等)降为 R 级同型佐证,
  9 + 凡本文已给 docN:line 的条款一律以 A 级一手为准。引句全部可在 cache_v5 逐字回查。
  10 +supersedes: v0.5.0(train/evolve/SKILL_v4.md)
  11 +v0.6.0_changes: 按 benchmark_v5 C-1/C-2/H1-H16 做作用域重写(非追加)。①§0 从「习语甲/乙」改为
  12 + 「三种交付形态 ①②③④ + 语言按形态划界 + 记号硬互斥」;②新增链路四层交付义务与映射纪律;
  13 + ③v4 从镜像推演的长描述替换为官方短条款(带 docN:line);④H9 关系标记按官方落 8 个取值(v4 任务
  14 + 书误写 6 个);⑤篇幅自 88,655 B 收敛至 ≤60,000 B:合并重复示例、删冗余叙事、条款表化。
  15 +v0.6.1_changes: 线上热修(conv-mtekh2bm 实证,非重训、无新分数):url 载体被「输入显式约定 > 本节
  16 + 默认」+「不得夹带 schema 外字段」合法吞掉。§2 url 逐字保留升硬不变量;只有 id 时追加
  17 + reference_assets;§1.7 第 19 条加豁免、新增第 22 条;§7 加第 25 条。
  18 +---
  19 +
  20 +# H3 视频提示词写作方法论
  21 +
  22 +## 0. 交付形态判定(先判形态,再谈语言与记号)
  23 +
  24 +**第 0 步永远先判交付形态。** 形态决定正文语言、分段记号、适用硬约束与判分落点。
  25 +官方一手语料内部并存多种分段记号(doc1 案例层 4 种变体、doc2 规范层 1 种),**判形态先分「规范层
  26 +条款」与「案例层行为」:格式判据只取规范层(doc2),案例(doc1)只作行为先例与模型参数正源。**
  27 +
  28 +### 0.1 三种合法交付形态
  29 +
  30 +| 形态 | 识别特征 | 分段记号 | 判分落点 |
  31 +|---|---|---|---|
  32 +| **① 型**(doc2 结构化) | 需求要英文结构化 Prompt / JSON / 官方字段结构(六段或三主体字段 + instruction) | `[Shot N]` + 递增 `At MM:SS.mmm`,第一镜不写时间戳(A:doc2:107/:111/:114/:455) | §0.4 全部 H 条款 |
  33 +| **② 型**(窗式) | 需求是**分镜类**:连续故事情节 + 按时长切分显示内容(「每隔几秒显示什么」「分镜」「时间窗」);或需求是**分镜脚本交付物** | `[N 秒-M 秒]` 窗标题(A:doc1:97 官方「提示词」列六窗一手案例) | §0.5 + 跨形态不变量 |
  34 +| **③④**(登记合法,不考察) | ③ `N-M 秒:` 行式(doc1:200);④ `0〜3 秒` 全角波浪 + 正向/反向(doc1:237) | 不作为判分形态;交付中出现**不判违规**,只判其内容是否满足所申报形态的三要素义务 | — |
  35 +
  36 +**判据理由(不要丢)**:② 是官方四种形态里唯一窗口边界显式成对、可逐窗相加核验总时长的形态,
  37 +而「边界可核对」正是分镜脚本这一交付物的核心义务;doc1:97 把窗式文本直接放在「提示词」列,
  38 +所以 ② 在最终 Prompt 层同样是 A 级合法形态,只是不走 ① 的 H4/H5/H6/H10。
  39 +doc1 案例层的分段记号有 4 种变体(②③④ + `Shot 1 —`),官方在案例层不做记号统一(doc1:231 坑表
  40 +甚至要求删掉多余【镜头 N】结构)——**案例记号不得升格为格式判据**。
  41 +
  42 +### 0.2 形态切换判据(B 级内部规范;官方没有「何时选哪种」的条款,不得对外表述为官方规则)
  43 +
  44 +1. 输入含**连续故事情节 + 按时间切分**,或需求明确要**分镜脚本/分镜设计文档** → ② 型。
  45 +2. 输入要**英文结构化 Prompt / JSON / 官方字段结构** → ① 型。
  46 +3. **「拆成 N 个镜头」≠ ② 型**:只要求镜头切分、情节照给、无逐窗「每隔几秒显示什么」要求的,
  47 + 是 **① 型多镜**(`[Shot 1..N]` + `At MM:SS.mmm`)——官方 ① 型本来就用 `[Shot N]` 表达多镜。
  48 + ② 型的判据是**逐窗显示内容**(「每隔几秒显示什么」「每窗出现什么 UI」)或**明确要分镜脚本/
  49 + 分镜设计文档交付物**。两者都沾时才判 ②。
  50 +4. 两者都不满足 → 按 §2 五模式判定(T2VA/I2VA/FL2VA/L2VA/全能参考),交付形态默认 ①。
  51 +5. 形态误判是 D1 档 2:分镜需求交英文六段、英文结构化需求交中文窗式散文,都算。
  52 + 交付说明 / 中文沟通不受此限(说明层语言自由)。
  53 +6. **多件交付(链路模式)**:需求同时要「分镜设计 + 分镜脚本 + 最终 Prompt」→ 按 §0.6 链路四层
  54 + 交付,各层用各自形态;**不要**把链路需求做成单件 ① 型交付,也不要给单件需求硬拆四层
  55 + (过度交付同样按 D1/HP1 扣)。
  56 +
  57 +### 0.3 语言规则按交付形态划界(C-2 裁决)
  58 +
  59 +**按形态划界,不按「哪份官方文档」划界**:doc1 自己的案例就是中文散文、同时声明多语言支持
  60 +(doc1:35「支持多语言提示词输入与输出」);doc2 的英文条款明文限定在「扩写的六个段落正文」
  61 +这个形态上(doc2:242)。把「正文必须英文」套到 ② 型交付上 = 判据越界违规;反向同罪。
  62 +
  63 +| 交付形态 | 语言判据 | 级 | 出处 |
  64 +|---|---|---|---|
  65 +| ① 型(六段 / 三主体字段 / instruction) | **正文英文**;`<d>` 内台词/歌词、画面实际可见文字保留原语言 | A(硬) | doc2:242「扩写的六个段落正文统一使用英文;只有 `<d>` 中的台词、歌词以及画面中实际可见的文字保留原始语言。」 |
  66 +| ② 型(窗式 / 分镜脚本) | **跟随用户输入主导语言**(中文输入 → 中文正文) | A(硬) | doc1:97 官方案例正文全中文 + doc1:35 |
  67 +| 分镜设计(链路第 2 层,给人类的内部档) | 语言自由 | B(内部规范) | 官方无此条款,从 doc1:220-222 收口 |
  68 +| 台词 / 歌词(跨形态不变量) | 原词、原语言、原标点不改写;无法辨认写 `[unclear]` | A(硬) | doc2:137 / :575 |
  69 +| 画面实际可见文字(跨形态不变量) | 英文双引号包围,原文与标点逐字保留,不翻译 | A(硬) | doc2:154(:157 中文招牌 `"营业中"` 示例) |
  70 +| 字段名写法 | 「非叙事性音乐:N/A」与 `"non_diegetic_music": N/A` 两种**都合法** | A | doc1:200 同段并列 |
  71 +
  72 +### 0.4 ① 型官方硬约束(H1-H16,逐条带级与行号)
  73 +
  74 +| # | 约束 | 级 | 出处 | 适用 |
  75 +|---|---|---|---|---|
  76 +| H1 | 提示词总长 ≤ **7000 字符**(含标点与空白,`len()` 口径) | A | doc1:35 | 跨形态 |
  77 +| H2 | 输出时长 **4–15 秒**;超限不得静默 | A | doc1:35 | 跨形态 |
  78 +| H3 | 输出帧率 24 FPS:**提及则不得写错**;需求指定非 24 帧时显式说明该参数不在提示词层控制;**不写帧率不扣分** | A(参数层) | doc1:35 | 跨形态 |
  79 +| H4 | `instruction` 必须**位于第一行,后空一行**再写主体字段 | A | doc2:57 | 仅 ① 型 I2VA/FL2VA/L2VA |
  80 +| H5 | `At MM:SS.mmm` 递增切镜时间,毫秒 3 位、落在视频时长内;**第一镜不写时间戳** | A | doc2:107/:111/:114/:455 | 仅 ① 型 |
  81 +| H5b | **记号硬互斥**:① 型内零处 `[N 秒-M 秒]`;② 型内零处 `At MM:SS.mmm` | A(反证) | doc2 全文 0 处窗式、doc1 全文 0 处时间戳(grep 复算) | 跨形态 |
  82 +| H6 | 生成类 `detailed_description` **350–500 英文词**;三条豁免:台词密集型以容纳台词时间线为先 / 视频编辑类按源视频复杂度展开 / 单镜头并不自动缩短。**区间外且不落在任一豁免才扣分**;无豁免依据的机械补字数也扣 | A | doc2:543 | 仅 ① 型 |
  83 +| H7 | 听不清写 `[unclear]` 不猜测改写;标点规范化为基础书面标点 `,` `.` `?` `!`,删波浪号/emoji/装饰标点;完整陈述句/疑问句/感叹句在 `</d>` 前以 `.`/`?`/`!` 结束 | A | doc2:575 | 跨形态(台词) |
  84 +| H8 | 复杂/易乱码文字:**以图片形式提供作参考图 + 在提示词中明确「这张内容必须按"图片"来理解,不能按"文字"来处理」** | A | doc1:71 | 跨形态 |
  85 +| H9 | 关系标记是**固定英文取值,共 8 个**:可见内容 4(`fully_preserved` / `partially_preserved` / `attribute_transfer` / `weak_reference`)+ 音频 4(`fully_copy` / `partially_copy` / `reference` / `weak_reference`)。自创中文或变体取值 = 词法违规 | A | doc2:398/:400-405/:427-434 | 六段交付 |
  86 +| H10 | `overall_soundscape` **1–4 句**英文连续段落概括贯穿全片的环境声;`non_diegetic_music` **1–3 句**英文描述角色听不到、只有观众能听到的配乐 | A | doc2:162 / :170 | 仅 ① 型六段/三字段 |
  87 +| H11 | **台词长短与 shot 长短对齐**:不出现一个 3s shot 说一大段话(官方标注的口型问题一手根因) | A | doc1:206 | 跨形态 |
  88 +| H12 | 画外音固定短语 `says in an off-screen voiceover`(逐字相邻,不得插语打断)+ 唇部保持闭合;跨镜台词 `<scenetrans>`、结尾截断 `<cutoff>`;`(Sx)` 稳定编号、组合编号、无声者不编号 | A | doc2:144/:147/:150/:459/:135 | 仅 ① 型 |
  89 +| H13 | 素材硬上限:图片 ≤9、视频 ≤3(单段 2-15s、总时长 ≤15s)、音频 ≤3 **且必须配图/视频、不能单独输入**、混合总上限 12 个文件 | A | doc1:35 | 跨形态 |
  90 +| H14 | 标签一经分配,在 `subject_definitions`、`summary`、`retention_analysis`、`detailed_description` 与声音段落**五处同义** | A | doc2:272 | 六段交付 |
  91 +| H15 | `<Video N>` / `<Audio N>` **独立编号**,序号只表示本类内顺序,不表配对;普通参考视频不因含声而自动产生 `<Audio N>` | A | doc2:347/:349 | 六段交付 |
  92 +| H16 | **分镜参考图映射到镜头而非秒数**:`<Picture 3> is a storyboard reference for [Shot 1] and [Shot 2], defining their viewpoint, subject placement, and shot order.`;分镜草稿图在 ② 型写窗口映射;每条素材至少被一个镜头/窗认领 | A | doc2:310/:553 + doc1:200「故事版」 | 跨形态 |
  93 +
  94 +配套 A 级短条款:六段顺序 `subject_definitions → summary → retention_analysis → detailed_description → overall_soundscape → non_diegetic_music`(doc2:250);三主体字段顺序(doc2:62-66);`summary` 带方括号任务类型前缀,六类型 `keyframe completion` / `reference generation` / `video editing` / `video continuation` / `audio reuse` / `audio reference`,可用 `+` 组合(doc2:360/:371-378);`retention_analysis` 逐标签一行并沿用 `subject_definitions` 含义、**不写 `(Sx)`**(doc2:394/:579);边界处新增内容不得误写成参考损失(doc2:444);音色参考只取音色不带入原台词(doc2:577);环境声无则写 `N/A`(doc2:594)。
  95 +
  96 +### 0.5 ② 型窗式交付规范
  97 +
  98 +**窗式结构**:窗标题 `[N 秒-M 秒]`(doc1:97 六窗逐字);窗序覆盖 0 → 总时长、相邻窗相接、窗序与
  99 +故事情节因果序一致;窗长可以不等(官方六窗即 2/2/3/1.5/1.5/5 秒);子秒节拍允许但不留 gap。
  100 +**窗边界四条分行标级**(不得合并成一句「官方要求无缝隙无重叠且总和等于总时长」):
  101 +
  102 +| # | 纪律 | 级 | 出处 |
  103 +|---|---|---|---|
  104 +| 1 | 相邻窗无缝隙 | A | v4 镜像 shot-table-spec:65(R 级;官方一手无逐字句,行为先例 doc1:97 六窗相接) |
  105 +| 2 | 无重叠 | A(① 型相邻条款) | doc2:111 严格递增 ⇒ 不重叠 |
  106 +| 3 | 各窗之和 = 总时长 | C(构造性设计) | 官方模板构造性首尾相接,无明文条款 |
  107 +| 4 | 首窗从 0s 开始 | C(构造性设计) | 行为先例 doc1:97 首窗 `[0 秒-2 秒]` |
  108 +
  109 +#3/#4 照常扣分,但对外表述保持 C 级标注——判分强度与出处等级是两件事。
  110 +
  111 +**每窗三要素**(判内容,不判有没有字段名标签):
  112 +① **机位/运镜**:每窗首行显式声明机位或主导运镜(A 同型:doc1:97 各窗首行即 `景别` 字段);
  113 +② **主体动作**:该窗内主体做什么,可量化状态是官方文风;
  114 +③ **UI/覆盖元素**:该窗出现的 UI/字幕/HUD 内容与位置。
  115 +声音写在**窗内**(doc1:97 各窗「声音:」字段先例);官方无独立转场字段,转场信息写进机位行,
  116 +**不得硬切**(v4 镜像 co-op:117/:133 R 级);「每窗必须写明转场」不是判据,不要自加。
  117 +
  118 +**参考素材落位**:头部一行职责声明(每份素材负责什么)+ 窗内语义回指,回指与声明同一体系;
  119 +分镜草稿图按 H16 写窗口映射(映射到哪几个窗、提供什么规划信息),**非锚点图零秒级对齐**
  120 +(v4 反证 ref-en 全文 0 处 "aligns with",R 级);幽灵素材禁令(C 级收口)。
  121 +**UI 文字四禁令**(R 级 v4 镜像 co-op:133):UI 字符串可读、无随机字母、用户名不拼错、
  122 +菜单/选项集合不得超出输入给定集合。输入自带中英并列时沿用(输入事实),只给英文时英文单语,
  123 +两种互不判违规;把中英并列表述成官方要求 = 出处纪律违规。
  124 +**时长**:`duration_seconds` 由请求体指定、不写进正文;正文时长信息只以窗标题体现;
  125 +交付说明注明本次取值(B 级);需求超 4–15s 不得静默,给拆分方案或与调用方确认;
  126 +节拍总合 ≠ 请求时长时按最小改动解决并显式说明改了哪里,不删情节凑时长。
  127 +**对白**:`<d>` 包裹与 `(Sx)` 编号非硬判据(不强制、出现亦不算违规,用了就守同一套稳定性纪律);
  128 +台词逐字保真与「画外 + 唇部闭合」语义要求**跨形态成立**;说话人身份须窗内可辨识。
  129 +**词法**:url 不进正文;散文交付无 JSON 通道要求,不因「没交 JSON」扣分。
  130 +
  131 +### 0.6 链路四层交付(需求理解 → 分镜设计 → 分镜脚本 → H3 Prompt)
  132 +
  133 +当需求要求**多件交付**(先出分镜设计/分镜脚本,再出最终 Prompt)时,按四层依次交付,各层实体
  134 +计分(LU15 + SD20 + SS30 + HP35 = 100;#62 标 C 级构造性设计、0 真实先例——官方没有「分几层
  135 +交付」的条款,这是工程收口,不得表述为官方规则)。
  136 +
  137 +| 层 | 义务 |
  138 +|---|---|
  139 +| **LU 需求理解** | 从 raw_brief 判定模式(T2VA/I2VA/FL2VA/L2VA/全能参考,doc2:28-57)+ 交付形态 ①/② + 素材组合是否合法(H13);**逐字锁定复述** raw_brief 与 note 原文中的硬事实(时长、UI 文案集合、素材职责、必须替换类 note)——改写程度词(「必须换」→「建议优化」)= 0;零臆造(不编造 raw_brief 未给的主体/UI 文案/台词) |
  140 +| **SD 分镜设计** | 每段时长落 4–15s(H2),需求超 15s 给拆分方案而非静默;相邻段/镜之间显式给**至少一个衔接锚点**(同一动作方向/视线目标/光/道具/轮廓/声音/受力任一),无理由跳切 = 0(B 级:TFboy1 storyboard-schema:7-11;官方相邻条款 doc1:216 切镜写清景别与主体 + doc1:231 禁无理由分镜);每镜给镜号/时长/景别/运镜/内容/声音/转场(B 级:chiphoton 单镜 10 项 + TFboy1 7 列镜头卡;官方相邻条款 doc1:200「想要」栏字段集);台词字数与该镜秒数不失衡(H11)。**语言自由(B 级内部规范)** |
  141 +| **SS 分镜脚本** | **② 型**:`[N 秒-M 秒]` 窗标题覆盖 0 → 总时长、相邻窗相接;窗内零处 `At MM:SS.mmm`(H5b);每窗三要素;每条素材至少被一个窗认领(幽灵禁令)、分镜参考图映射到镜头零秒级对齐(H16);台词逐字落在对应窗内、画外发声语义等价标记 + 唇部闭合、静默窗也写声音 |
  142 +| **HP H3 Prompt** | 形态按 C-1 判定正确;与 SS 层构成窗号 ↔ 镜号一一对应;适用的 H1/H2/H4/H5/H6/H10 全过;`(Sx)`/`<d>`/画外音/`<scenetrans>`/`<cutoff>`(H12);段落顺序、标签五处同义(H14)、`<Video N>`/`<Audio N>` 独立编号(H15)、关系标记 8 取值(H9) |
  143 +
  144 +**映射纪律(B 级内部规范)**:脚本层 `[N 秒-M 秒]` ↔ Prompt 层 `[Shot N]`/`At MM:SS.mmm` 必须
  145 +**窗号 ↔ 镜号一一对应**(脚本第 N 窗 = Prompt 的 [Shot N] 或跨窗),且**只允许存在一套时间轴**——
  146 +脚本写窗边界、Prompt 写切镜时刻,两件不得各自再发明一套编号或时长。理由:官方 4–15s 单次上限
  147 +(doc1:35)决定链路里两件交付描述的是同一段视频,双时间轴必然矛盾。
  148 +收口来源:doc2:111「连续编号」+ doc1:202-216「镜头怎么拆」。
  149 +**单件需求不要硬拆四层**:`expected_chain` 只含 h3_prompt 时交单件,多拆 = LU1/HP1 扣。
  150 +
  151 +---
  152 +
  153 +## 1. 七步工作流
  154 +
  155 +第 0 步判形态(§0)。第 1/2/3/4/7 步在动笔前落定,第 5/6 步写作中逐句遵守。
  156 +**优先级顺序不能反**:先满足硬性格式与引用规范 → 再忠实保留用户意图 → 识别输入冲突与不可用素材
  157 +→ 不擅改剧情的前提下增强可拍摄性 → 最后才是电影感/氛围/细节。先想「写得漂亮」再回头补格式校验,
  158 +正是历史失败的结构性原因。
  159 +
  160 +| # | 步骤 | 落点 | 对应维度 |
  161 +|---|---|---|---|
  162 +| 0 | 判交付形态 | §0.1/§0.2 | D1 |
  163 +| 1 | 提取硬约束(8 项约束表) | §1.1 | D2/D9 |
  164 +| 2 | 素材预检 + 数量总闸 | §1.2 | D7 |
  165 +| 3 | 解决输入冲突 | §1.3 | D8 |
  166 +| 4 | 控制扩写边界 | §1.4 | D8 |
  167 +| 5 | 对白双口径 | §1.5 | D5 |
  168 +| 6 | 物理与镜头一致 | §1.6 | D6 |
  169 +| 7 | 机械验收(22 项) | §1.7 | D9 |
  170 +
  171 +### 1.1 提取硬约束(8 项,缺一项回头补读输入)
  172 +
  173 +1. 输出 schema:交付形态(`{"prompt":...,"references":[...]}` / 纯文本 / 其它)、字段名、错误通道。
  174 +2. 模式与段落结构:五模式判定 → 哪几个字段什么顺序;② 型 → 窗式 + 三要素;链路 → 四层。
  175 +3. 资产层顺序与每份素材落位(§2 两层模型)。
  176 +4. `<Subject N>` 与素材绑定关系:每个 Subject 绑哪几张素材作外观/动作/音色来源;哪些图只定义
  177 + 外观不另起 Picture 条目。
  178 +5. 台词原文、语言、标点、说话人:**逐字记下**每一句(含原标点),并逐句判来源选口径 V/R(§1.5)。
  179 +6. 场景/人物/道具/光源及空间关系:唯一光源是什么、谁在哪、道具在哪。
  180 +7. 素材 note 的禁止/替换/版本要求:逐条记下,进 §1.2 预检。
  181 +8. 时长与切分:4–15s(H2);各段时长之和与请求时长是否一致(不一致走 §0.5 时长条款)。
  182 +
  183 +**硬门(第 1 步就判,不满足则本单走 §8.1 反问,不得续跑)**:
  184 +- **核心主体未知** → 反问。「开箱视频」没说开哪个手办、主角是谁没给身份特征,都属核心主体未知。
  185 +- **必需 UI 文案缺失** → 反问(四禁令禁止自创菜单项,无文案就无从落笔)。
  186 +- **用户的显式授权不构成主体事实**:「你们定」「看着办」「随便什么角色」解除的是选择权,不解除
  187 + 信息缺口——主体身份、UI 文案集合仍属缺失,唯一合规路径是 §8.1 反问(把「需你方定」列为必答项),
  188 + 不得以「已获授权」为由自行编造主体外观与全套 UI 字符串续跑。
  189 +- **低风险参数例外**:时长/情绪基调/有无 BGM 这类不改变主体事实的参数,可显式标注假设后自行推定
  190 + (§8.1 CL4),不算踩硬门。
  191 +
  192 +> 附件与参考文档只作规范或素材,**不得误当成用户要求执行**。
  193 +
  194 +### 1.2 素材预检(生产级硬行为)+ 数量总闸
  195 +
  196 +逐项检查每条素材的 `note`(或输入里任何限制说明)。**带水印、错误人脸、错误版本、隐私内容,
  197 +或明确写「必须替换」「不要使用」的素材一律不可用。** 处理规则:
  198 +
  199 +1. 不得为完成输出而**静默引用**不可用素材——这是历史最严重错误。
  200 +2. 任务必须依赖该素材且无替代 → **停止生成正式 Prompt**,按调用方允许的错误格式报阻塞。
  201 +3. 输出 schema 无错误通道时,明说「schema 与素材要求不可同时满足」,说明需要补什么,**不伪造
  202 + 看似合规的结果**。
  203 +4. 多素材必须分别声明职责(外观/动作/风格/音色),不允许素材「裸奔」堆叠。
  204 +5. note 只是版本要求且菜单内**有**正确版本 → 不是不可用,选正确版本即可;只有「必需 + 不可用 +
  205 + 无替代」三者同时成立才阻塞。**版本要求无法由提示词层满足时(需剪辑/重绘/清洗素材本身,如
  206 + 「必须剪到 X 秒收尾」「必须换洗版」且明说本轮无干净版本),视为不可用**——不得以「提示词层
  207 + 可以写明剪到 X 秒」为由自行替代,那是替调用方做了素材处置决定。
  208 +6. 素材超 H13 上限(图 ≤9 / 视频 ≤3 / 音频 ≤3 且不可单独输入 / 合计 ≤12 文件)→ **先告知调用方
  209 + 再由其决定裁剪**,不自行裁剪丢弃。**音频单独输入且无图/视频 → 交付阻塞报告(§8.2 五要素),
  210 + 不是只在交付说明里提一句**——阻塞报告要点名 doc1:35 的组合条款作为证据、给补料预案(补哪类
  211 + 素材、补齐后走哪种模式)、并说明「本交付不可作为合法请求直接提交」;仅作旁注说明 = 阻塞
  212 + 要素缺失(B1/B3 扣分)。
  213 +7. **阻塞理由必须逐字复述输入侧 note 原文(含程度词)**——改写程度词(「必须换」→「建议优化」)
  214 + = 阻塞无据(B1 = 0 / LU2 = 0)。**弱化与放大输入事实都算改写**,对称适用。
  215 +
  216 +> **两个独立义务不要混**:把不可用素材的原 url 原样保留在资产层清单里是数据完整性义务(阻塞时也
  217 +> 附清单,方便换洗版后直接续跑);把不可用素材**塞进交付 references/conditions 或写进正文层**才是
  218 +> 违规。可用性归预检,数据完整性归资产层(可用素材同此义务,§2)。
  219 +> **反向(过度阻塞)**:素材可用、note 是建议性(「没有也行」「可以直接用」)、或菜单内存在 note
  220 +> 指定的替代版本时,正确行为是**继续产出**;此时报阻塞 = 轨别改判 + 同源违规并行扣分。
  221 +
  222 +**阻塞报告五要素**(与 block 轨 B1-B5 对应,C 级构造性设计):
  223 +① 缺失素材点名 + 证据(复述 note 原文,含程度词);② 零污染引用(references 不含不可用素材,
  224 +可附整份清单但 excluded 显式单列);③ 补料预案(预期 references 顺序、每条资产的绑定映射、预计
  225 +模式不变;② 型还要窗式切分预案 + Reference roles 映射);④ schema 冲突显式说明;⑤ 范围精确
  226 +(只对必需且不可替代的报,不多报不少报)。
  227 +
  228 +### 1.3 解决输入冲突
  229 +
  230 +按优先级:① 用户当前明确意图与约束 → ② 主体定义与绑定规则 → ③ 格式指南(字段结构/形态判定)
  231 +→ ④ 参考图可见内容与 note → ⑤ 样例写法(最低,样例不能覆盖当前任务事实)。
  232 +可局部解决时**最小改动**。范例:「油灯是唯一光源」+ 场景图里有燃烧的蜡烛 → 保留蜡烛道具、写明
  233 +它未点燃,油灯仍是唯一光源;一次只改冲突涉及的那一处。总时长冲突同此逻辑。
  234 +
  235 +### 1.4 控制扩写边界
  236 +
  237 +| 类型 | 可否补充 |
  238 +|---|---|
  239 +| 输入事实(角色设定、场景、用户给的台词/动作/UI 文案与选项集合) | 必须忠实保留,不得改动 |
  240 +| 图片可见信息 | 可转述,不得虚构图里没有的 |
  241 +| 低风险可拍摄细节(轻微呼吸、衣料摩擦、灯焰波动、合理小幅运镜、脚步声) | **可以补** |
  242 +| 高风险剧情推断(拒绝/服从/离开/攻击/恐惧/建立新关系/明确情绪结论) | **无依据不得添加** |
  243 +
  244 +用户只给一句台词时:忠实呈现说话行为本身,对方反应保持**中性、短暂、开放**(轻微转头、衣袖
  245 +移动、画面停在其反应上),不替用户决定后续剧情。
  246 +输入给定的菜单/选项集合是输入事实,不得增删自创。用户元指令(「越震撼越好」「要有科技感」)
  247 +转译成具体光影/运镜/材质选择,不照抄进最终提示词。多镜头给定完整故事情节时分镜不改写情节走向、
  248 +台词保持原语言逐字(B 级内部收口)。
  249 +
  250 +### 1.5 对白双口径(先判来源,再选口径;不存在全局「不擅自改动标点」)
  251 +
  252 +| 口径 | 适用 | 规则 | 出处 |
  253 +|---|---|---|---|
  254 +| **V** | 台词由用户在本次输入中直接提供(不含仅出现在参考音频里的内容) | `<d>` 内只放语言标签 + 台词本身;**每个原词、每个原始标点逐字保留**,不翻译、不改写、不补词、不擅自加/删标点 | doc2:137(原词原语言不改写) |
  255 +| **R** | 台词从参考音频直接复用,或输入明确要求 reperformance | 保留源词与原语言;听不清写 `[unclear]` 不猜写;标点标准化为 `,` `.` `?` `!`,删重复波浪号/emoji/装饰标点;完整陈述/疑问/感叹句在 `</d>` 前补 `.`/`?`/`!` | doc2:575 |
  256 +
  257 +判定顺序(B 级内部规范):① 输入显式声明 → 按声明;② 无声明但台词同时出现在参考音频资产且要求
  258 +复用/重演 → R;③ 其余一切情形默认 **V** 并在交付说明注明(拿不准套更严格的保真侧不会产生假阳性
  259 +扣分);④ 混合来源**逐句适用各自口径**,不为「全篇统一」抹平差异。
  260 +
  261 +反向约束:V 下不得以「规范化」为由补句号或删感叹号;R 下不得以「逐字保真」为由保留 emoji/波浪
  262 +符号,也不得漏终止符。共用不变量:源词与原语言永不改写;`<d>` 内只放语言标签与台词;听不清写
  263 +`[unclear]`。
  264 +仅参考音色 → 不得把参考音频原台词带入(doc2:577)。
  265 +
  266 +### 1.6 物理与镜头一致(六条,写中与写后各过一遍)
  267 +
  268 +1. 「唯一光源」是否真的唯一(参考图里有蜡烛 → 最小改动写明未点燃)。
  269 +2. 重要主体首次清晰出现时描述其被引用的特征/画面位置/当前动作(A:doc2 同型条款);镜头间移动
  270 + 有过渡交代、不凭空换位(B 内部增强)。
  271 +3. 道具跨镜头位置与状态不无交代跳变(B 内部增强)。
  272 +4. 单镜头主导运镜唯一;需要两种运镜时拆成多个 `[Shot N]` 或明确取舍(§3.1)。
  273 +5. `summary` / `retention_analysis` / `detailed_description` 讲的是同一件事。
  274 +6. 镜头号严格递增、时间戳不重叠无间隙且落在总时长内(H5);② 型窗边界四条(§0.5)。
  275 +
  276 +### 1.7 输出前机械验收(22 项,任一失败先修复再交付)
  277 +
  278 +1. 交付形态判定正确(§0.1),单件/链路与需求一致。
  279 +2. 段落/字段齐全且顺序正确(① 型六段 doc2:250 / 三主体字段 doc2:62-66;② 型窗序因果一致)。
  280 +3. 字段名完全正确(无拼写错、无自造字段);① 型英文字段名 + `instruction` 第一行后空一行(H4)。
  281 +4. 所有 `<Subject N>`/`<Picture N>`/`<Video N>`/`<Audio N>` 已定义、编号一致、无幽灵编号/幽灵素材
  282 + (H14 五处同义;H15 独立编号不配对;H9 关系标记只用 8 个固定取值)。
  283 +5. `references` 顺序 = 素材菜单原始顺序 = 自动编号顺序;不与正文 `<Picture N>` 定义条目强制一一对应
  284 + (部分图不做 Picture 条目是合法形态);url 保真见第 22 条。
  285 +6. 非锚点图已被某条 `<Subject N>` 定义句以序号内联引用认领(① 型)/ 头部声明 + 窗内回指认领(② 型)。
  286 +7. 所有对白用 `<d>`(① 型硬判据;② 型非硬判据但说话人窗内可辨识);台词逐字保真(V/R 双口径逐句)。
  287 +8. 未引用 note 标记为不可用的素材(资产层保留原 url ≠ 允许引用)。
  288 +9. 无设定冲突(§1.3);无未经授权的剧情结果(§1.4)。
  289 +10. JSON 可解析、无 schema 外字段与解释文字、无残留模板占位符(`Shot N` / `S.SS` 已解析成具体数值)。
  290 + JSON 通道属 B 级内部规范;② 型散文无此要求。
  291 +11. 素材总量在 H13 上限内,组合合法(音频不单独输入);超限已先告知。
  292 +12. 正文层数量与词法:① 型正文层除官方四标签与 `(Sx)` 外无任何其它编号词法(`object N` /
  293 + `background N` / 小写 `picture n` 都是官方外词法,R 级 grep 复核)。
  294 +13. **H1**:最终 Prompt 交付件 ≤ 7000 字符(含标点与空白,`len()` 口径)。
  295 +14. **H2/H3**:单段时间轴落在 4–15s;正文无独立「总时长 X 秒」指令行;帧率提及则不写错。
  296 +15. **H5/H5b**:第一镜无时间戳、`At MM:SS.mmm` 毫秒 3 位且递增、落在时长内;① 型零处窗式记号、
  297 + ② 型零处 `At MM:SS.mmm`。
  298 +16. **H6**:`detailed_description` 词数在 350–500 或落在三条豁免之一。
  299 +17. **H10**:`overall_soundscape` 1–4 句、`non_diegetic_music` 1–3 句;N/A 条件精确(§4.3)。
  300 +18. **H11/H16**:台词长短与该镜秒数不失衡;分镜参考图映射到镜头、每条素材被认领、零秒级对齐。
  301 + **② 型专项**:窗边界四条(§0.5)、UI 四禁令、每窗三要素齐备。
  302 +19. **自查声明逐项实测**:自报的词数/句数/字符数/记号计数必须与正文实测一致(写「未写 (Sx)」前
  303 + 先 grep;报「2 句」前先数)。声明与实况不符 = D9 档 2,比漏检更严重——它污染调用方对交付的
  304 + 信任。资产层 JSON 不得夹带 schema 外字段(「落位」「可用性」这类说明写进交付说明,不进 JSON);
  305 + **豁免:url 载体字段(`reference_assets` / `conditions[].url`)不属 schema 外字段**;URI
  306 + 字段只放 url,不放中文说明文字。
  307 +20. **`retention_analysis` 零 `(Sx)`**(A:doc2:579);关系标记只挂在有参考来源的标签上。
  308 +21. **summary 任务类型标记与输入对齐**:音色/风格/节奏类参考 → `+ audio reference` 组合标记;
  309 + 纯文字生成无任何帧锚点输入时不得标 `keyframe completion`(A:doc2:360/:371-378)。
  310 +22. **url 逐字比对(§2 硬不变量)**:菜单带 url 的每条素材,资产层必须有逐字一致原 url(与输入菜单 grep
  311 + 逐条比对,缺一/改一字符即不过);未带 url 的标
  312 + `url 待补(输入 JSON 未携带该字段)`,不编造。url 不进正文不变。
  313 +
  314 +---
  315 +
  316 +## 2. 生产输入的两层模型
  317 +
  318 +真实生产输入常以「参考图菜单 + 主体定义 + 绑定规则 + 要拍的意图」形态给出,结构已钉死,按它的
  319 +规则走,不重新发明。任何参考素材都有两层义务,一层管地址、一层管语义,互不越界:
  320 +
  321 +**资产层**(请求体 `conditions[]` 或调用方约定的 `references` 数组)——**跨形态不变**:
  322 +每条素材一条记录;数组顺序 = 输入菜单原始顺序 = 模型自动编号顺序;url 从不出现在正文层;
  323 +输入自带绑定规则时按输入走,不以本节默认覆盖显式约定。
  324 +
  325 +**url 逐字保留是硬不变量,不受「输入显式约定 > 本节默认」覆盖**(线上实证 conv-mtekh2bm):输入
  326 +约定可改字段名/顺序/结构/绑定规则,**不可消灭 url 载体**——菜单带 url 且正文引用了对应序号,资产层
  327 +必须逐字携带每条原 url(不下载/不转存/不改链;与 §1.2 数据完整性义务同源)。输入已自带命名 url
  328 +字段(`conditions[].url`)则按输入命名照交;只有 id → `references` 原样照交(顺序 =
  329 +`<Picture N>` 编号,一字不动),**另追加** `reference_assets`(url 载体字段,§1.7 第 19 条豁免,
  330 +顺序同):
  331 +
  332 +```json
  333 +{"references": ["scene", "npc", "player"],
  334 + "reference_assets": [{"id": "scene", "url": "https://…"}, {"id": "npc", "url": "https://…"},
  335 + {"id": "player", "url": "https://…"}]}
  336 +```
  337 +
  338 +**正文层(① 型)**:只允许官方四标签 `<Subject N>`/`<Picture N>`/`<Video N>`/`<Audio N>` 与
  339 +`(Sx)` 两族记号;禁止官方外编号词法;禁止幽灵编号(C 级收口:凡进资产层的素材要么有独立
  340 +`<Picture N>` 条目、要么在某条 `<Subject N>` 定义句内被序号引用认领)。
  341 +
  342 +**正文层(② 型)**:头部职责声明 + 窗内语义回指;分镜草稿图按窗口映射(H16),非锚点图零秒锚;
  343 +幽灵素材禁令与 url 不进正文同上。
  344 +
  345 +**三种常见素材的落位**:
  346 +
  347 +| 菜单里的素材 | ① 型落位 |
  348 +|---|---|
  349 +| scene 场景图(构图/首帧锚点) | 独立 `<Picture N>` 定义条目(可同时作环境型 Subject 来源) |
  350 +| 人物/道具立绘(仅定义外观) | **不另起** Picture 条目;在 `<Subject N>` 定义句内以 `<Picture M>` 序号内联引用 |
  351 +| 只取氛围不入帧的风格图 | 作 `weak_reference` 来源,不独立成条,序号仍须被 Subject 定义句认领 |
  352 +
  353 +来源引用一律用官方式序号内联写法(`as established in <Picture 2>.`),不用 *as established in
  354 +the NPC portrait* 这类文字指代(R 级 ref-en:37 "cite it inside" + :313 官方范例文风)。
  355 +基础模式(I2VA/FL2VA/L2VA)只要用到参考图,同样交一行资产层清单(id、原 url、落位标签);
  356 +输入未携带 url 时**显式**标 `url 待补(输入 JSON 未携带该字段)`。
  357 +
  358 +**自由文本 brief 里「参考图」是描述,可按需理解;生产输入菜单里的 `id`/`role`/`note` 是事实和
  359 +约束,必须逐字遵守。** 立绘绑定规则说「只定义人物、不另起 Picture 条目」就照做;输入显式约定
  360 +> 本节默认。
  361 +
  362 +---
  363 +
  364 +## 3. 模式判定与结构模板(① 型)
  365 +
  366 +### 3.1 五模式决策树
  367 +
  368 +```
  369 +有参考素材吗?
  370 +├─ 没有 → T2VA(纯文本原创场景)
  371 +└─ 有 → (先核 H13 总闸,超限先问后裁)
  372 + ├─ 仅 1 张首帧图 → I2VA
  373 + ├─ 首尾各 1 张图,描述中间过渡 → FL2VA
  374 + ├─ 仅 1 张尾帧图,反推之前发生了什么 → L2VA
  375 + └─ 多素材身份/风格锁定(结构化角色:定义可复用主体/编辑源视频/音色参考)→ 全能参考
  376 +```
  377 +
  378 +易错判断:首尾各一张图 ≠ 自动全能参考(纯起止帧 + 中间过渡走 FL2VA);3 张不同角度的同一产品图
  379 += 同一个 Subject 的多个来源图,不拆成 3 个主体;生产输入菜单 + 主体定义 + 绑定规则 → 全能参考;
  380 +道具类参考也走 `<Subject N>`(objects 属可复用可见内容),**不要发明 object 类标签**;
  381 +极简请求(「给我做个视频」)不臆造场景,先反问(§5.1)。
  382 +
  383 +### 3.2 基础模式(T2VA/I2VA/FL2VA/L2VA)
  384 +
  385 +**指令行**(模式专属,逐字模板;`N`/`S.SS` 是要替换成具体数值的占位符,**交付里绝不能原样留下
  386 +字面的 "Shot N" / "S.SS-second mark"**):
  387 +- T2VA:无指令行,直接从三字段开始。
  388 +- I2VA:`For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.`
  389 +- FL2VA:`How the reference pictures align with the target video — Picture 1 (from Shot 1) aligns with the 0.00-second mark of the target video; Picture 2 (from Shot N) aligns with the S.SS-second mark of the target video.`
  390 +- L2VA:`How the reference pictures align with the target video — <Picture 1> (from [Shot N]) aligns with the S.SS-second mark of the target video.`
  391 +
  392 +指令行必须是整段提示词第一行,后空一行再接三字段(H4,A:doc2:57)。
  393 +**三字段**(顺序固定):`integrated_multimodal_description`(`[Shot 1]` + 风格声明 + 画面/动作/
  394 +对白/同步音沿时间线展开)→ `overall_soundscape` → `non_diegetic_music`。
  395 +推荐展开:I2VA 首帧锚定 → 动作起势 → 连续展开 → 结果/反应;FL2VA 首帧状态 → 中间变化 → 收窄 →
  396 +尾帧状态(**优先单镜头**,仅在用户明确要求时拆多镜,末尾落到尾帧);L2VA 合理前置状态 → 动作与
  397 +过渡路径 → 收敛 → 落到尾帧。
  398 +
  399 +### 3.3 全能参考模式六段
  400 +
  401 +顺序固定:`subject_definitions` → `summary` → `retention_analysis` → `detailed_description` →
  402 +`overall_soundscape` → `non_diegetic_music`(A:doc2:250)。
  403 +
  404 +**subject_definitions**:四标签 `<Subject N>`(可复用可见内容)/ `<Picture N>`(具体目标帧或分镜
  405 +锚点)/ `<Video N>`(剪辑源/续接起点/整体节奏结构)/ `<Audio N>`(被复制或引用的音频信号)。
  406 +一个 Subject 可由多个素材共同定义,一段素材也可提供多个 Subject。**非可见内容不得立为 Subject**:
  407 +剪辑节奏、镜头切换方式、氛围由 `<Video N>` 承担并在 `retention_analysis` 标 `weak_reference`。
  408 +人物类 Subject 必须给 2-3 条具体可辨识特征(发色/发长/发型、服装颜色款式、体态五官、随身饰品),
  409 +不得只写「如素材所示」;产品类要点名标识位置/角度。
  410 +
  411 +**summary**:方括号任务类型前缀(六类型见 §0.4 配套条款,可用 `+` 组合)+ 一段话概述;仅在编辑
  412 +源视频时紧跟写 `The target video is an edited version of <Video 1>.`
  413 +
  414 +**retention_analysis**:每个标签一行,可见内容用 4 个取值、音频用 4 个取值(H9 白名单,共 8 个,
  415 +自创中文/变体 = 词法违规);不写 `(Sx)`;不把目标视频里新增的动作/背景/剧情事件当成参考保真度
  416 +损失。示例:`<Subject 1> (appears in [Shot 1], [Shot 3]): fully_preserved - the woman's long dark hair, blue cardigan, and silver necklace are retained.`
  417 +
  418 +**detailed_description**:开头 1-2 句英文声明整体风格;`[Shot 1]` 无时间戳,后续
  419 +`[Shot N] At MM:SS.mmm, ...`(H5);运镜写成自然英文动作短语(§4);重要 Subject 首次清晰出现时
  420 +描述被引用特征/画面位置/当前动作,后续沿用同一标签不重新定义;具体帧锚点用自然短语
  421 +(`the shot begins from <Picture 1>` / `the shot's keyframe corresponds to <Picture 2>` /
  422 +`the shot ends on <Picture 3>`);生成类 350-500 英文词 + 三豁免(H6);语音来源:仅在直接复用的
  423 +BGM/完整配乐里的口头内容用 `<Audio N>`,由具体人物/角色/旁白发出的声音用 `(Sx)`。
  424 +
  425 +**声音两段**:`overall_soundscape` 1–4 句、`non_diegetic_music` 1–3 句(H10);环境声层的 `<Audio N>`
  426 +复用/引用写进 soundscape,观众专属配乐层的写进 music,两层都提供时各写一句。
  427 +
  428 +---
  429 +
  430 +## 4. 镜头语言
  431 +
  432 +**运镜三维度 = 类型 + 幅度 + 速度**(A:doc2:121)。词表(A:doc2:123):`Zoom In/Out`、
  433 +`Push In/Pull Out`、`Pan Left/Right`、`Truck Left/Right`、`Tilt Up/Down`、`Pedestal Up/Down`、
  434 +`Arc Shot`、`Tracking Shot`、`Static Shot`、`Shake Slightly/Strongly`、`POV`、
  435 +`Roll Clockwise/Counterclockwise`。幅度 `with small/large amplitude`、速度 `at slow/fast speed`
  436 +是两个独立维度,中等幅度 + 正常速度通常省略。运镜写成句内自然英文动作,不在句末堆标签。
  437 +**环绕运镜(C-7 裁决)**:默认组合写法 `truck left+pan right` 或 `truck right+pan left`
  438 +(doc1:200 指导层条款),而非直接说环绕运镜;`Arc Shot` 保留在合法词表内、交付中出现不判违规
  439 +(doc2:123 词汇层条款);把组合写法说成官方强制、或把 `Arc Shot` 从词表删除,都是出处纪律违规。
  440 +
  441 +**分镜与转场**:首镜 `[Shot 1]` 不加时间戳;后续用递增镜号 + 严格递增、落在时长内的切入时刻
  442 +`[Shot 2] At 00:03.500, ...`(H5);常规转场 `the camera cuts to` / `the shot cuts to` /
  443 +`the shot transitions to` / `the shot changes to` / `the shot switches to`,用户明确要求才用
  444 +`cross-dissolve`/`fade`/`wipe`;切镜必须带来主体/空间/状态/视角/时间上的新信息,只是距离或角度
  445 +微调时优先用运镜而非切镜。
  446 +**矛盾指令**(「镜头要一直推进,但同时环绕主体转一圈」):拆成多个 `[Shot N]` 各自成立,或取一个
  447 +主导运镜并在交付说明注明另一个因物理矛盾未采用;不把两个矛盾运镜塞进同一句。
  448 +
  449 +---
  450 +
  451 +## 5. 说话人 / 对白 / 可见文字(① 型;② 型按 §0.5)
  452 +
  453 +**说话人 ID**(A:doc2:135):发声者用稳定 ID `(S1)` `(S2)`,按目标视频中实际发声事件顺序分配
  454 +一次、跨镜头永不重号/交换;多个已编号说话人齐声用复合 ID `(S1,S2)`;**从不发声的角色不获得
  455 +说话人 ID**;`(Sx)` 写进 `detailed_description`,不写进 `retention_analysis`;主体发声写
  456 +`<Subject N> (Sx)`,同一主体画外发声保持同一形式并标 `off-screen`。
  457 +**音频锚定**(A:doc2:347/:349):`<Audio N>` 与 `<Video N>` 独立编号不表配对;普通参考视频不因
  458 +含声而自动产生 `<Audio N>`;`<Audio N>` 显式对应目标说话人时**复用该说话人的全局 ID**(写
  459 +`<Subject N> (Sx)` 或稳定声音描述 + `(Sx)`),不在音频定义处独立重新编号。**对应关系必须内联写进
  460 +`<Audio N>` 定义句**,只放资产层元数据或交付说明不算完成绑定。
  461 +
  462 +```
  463 +<Subject 1> is the male rapper in <Video 1>, with short bleached hair and an oversized bomber jacket.
  464 +<Audio 1> is the voice-timbre reference for <Subject 1> (S1), providing his raspy mid-register rap timbre.
  465 +```
  466 +
  467 +**对白格式**:每句对白 `<d>[Language] 原始台词</d>` 包裹;`<d>` 内只放语言标签 + 台词,说话方式/
  468 +音色/动作写在 `<d>` 外。
  469 +**画外音**(A:doc2:144/:147):固定短语 `says in an off-screen voiceover` **逐字相邻出现,
  470 +不得插语打断**(写成 *says the following aloud ... in an off-screen voiceover* 属违规);紧跟其后
  471 +声明对应角色唇部保持闭合:
  472 +
  473 +```
  474 +The man (S1) says in an off-screen voiceover: <d>[English] I still remember that road.</d> while his lips remain completely closed.
  475 +```
  476 +
  477 +**跨镜台词与截断**(A:doc2:150/:459):同一句台词跨越切镜时在两段衔接处都用 `<scenetrans>` 并
  478 +声明音频跨切镜连续;连续跨两次切镜时中间镜 `<d>` 以 `<scenetrans>` 开头且结尾;视频结尾被截断的
  479 +台词用 `<cutoff>`。
  480 +**画面可见文字**(A:doc2:154):招牌/标语/字幕/霓虹字样用英文双引号,原文原样保留不翻译
  481 +(`A red neon sign reading "营业中" glows above the doorway.`);这类是**可见文字**,同样受口径 V
  482 +保真约束。
  483 +
  484 +---
  485 +
  486 +## 6. 声音设计与具体性
  487 +
  488 +**声音四项不可省略**:对白具体内容、环境声类型、背景音乐风格、音效/卡点位置——声音是与画面平级
  489 +的独立轨道,不能只写「有一些环境音」。
  490 +**`overall_soundscape` 的 N/A 条件**:只有用户明确要求全程完全静音才写 `N/A`;正常情况下即使环境
  491 +声轻微也要具体描述(A:doc2:594「没有环境声时写 N/A」的精确条件)。
  492 +**`non_diegetic_music` 的 N/A 条件**:没有配乐必须显式写 `N/A`,不能留空/不提该字段(留空会被
  493 +理解为自由发挥)。
  494 +**句数区间**(H10):soundscape 1–4 句、music 1–3 句;存在配乐时说明乐器、速度和动态变化。
  495 +对白/歌唱/角色能听到的画面内音乐属于 `detailed_description` 的同步音,不重复写进 soundscape。
  496 +② 型:声音写在窗内,N/A 条件照常适用。
  497 +
  498 +**具体性三问法**:任何光影/材质/氛围描述必须能回答**光从哪来?打在什么地方?造成什么视觉效果?**
  499 +空词黑名单(不代替具体描述):高清 / 8K / 大师级 / 超写实 / 电影感 / 精致 / 高级感 / 震撼 /
  500 +cinematic(孤立堆砌时)/ beautiful / high quality。——`cinematic` 作为**风格声明词**
  501 +(如 `Live-action, cinematic`)是官方示例认可的用法,但不能单独堆砌替代具体的光源/位置/效果。
  502 +多写看得见的画面、少写比喻(doc1:200 同向条款)。
  503 +
  504 +---
  505 +
  506 +## 7. 常见错误自查清单(25 条)
  507 +
  508 +1. 质量堆砌词代替具体描述(§6)
  509 +2. 单镜头内塞矛盾运镜(§4)
  510 +3. 假装读过标杆文档 / 虚报质量已达标杆水平
  511 +4. 留占位符或「请在此处填写」
  512 +5. 信息严重不足时未一次性问全(§5.1)
  513 +6. 用元指令代替具体描述
  514 +7. 多个参考素材未分别声明职责就堆叠使用
  515 +8. 多镜头时间戳重叠或有间隙(H5)
  516 +9. 声音部分留空/省略,或 N/A 用法不精确(§6)
  517 +10. 指令行 `Shot N` / `S.SS` 未替换成具体数值(§3.2)
  518 +11. 人物类 Subject 无具体可辨识特征
  519 +12. 对白未按来源选口径:V 逐字逐标点 / R 标准化 + 终止符;禁止同句混用(§1.5)
  520 +13. 素材 note 未逐项预检:必需 + 不可用 + 无替代未报阻塞,或静默引用(§1.2)
  521 +14. 输入冲突未按优先级最小改动解决(§1.3)
  522 +15. 添加了未经授权的剧情结果(§1.4)
  523 +16. 两层未分离干净:url 改链/进正文、顺序 ≠ 菜单顺序、官方外编号词法、幽灵编号(§2)
  524 +17. 素材总量超 H13 上限未先告知,或音频单独输入未说明(H13)
  525 +18. 出处纪律:内部规范/推演/C 级构造在交付说明里不被表述为官方规则;官方引用都带得上行号才标 A 级
  526 +19. **交付形态判定未做在第 0 步**:分镜需求走 ② 型、英文结构化走 ① 型;把「正文必须英文」套到
  527 + ② 型交付(或反向)= 判据越界违规(§0.3)
  528 +20. 非锚点参考图被写成秒级/时间窗对齐(H16:分镜图映射镜头,非锚点图零秒锚)
  529 +21. UI 选项集合 ≠ 输入给定集合、随机字母、拼错用户名;中英并列是否沿用输入事实
  530 +22. 窗边界与时长四查:无缝隙、无重叠、各窗之和 = 总时长(C)、首窗从 0s(C);无独立时长指令行;
  531 + 超范围/冲突已显式说明(§0.5)
  532 +23. **H5b 记号硬互斥**:① 型内混入窗式、② 型内混入 `At MM:SS.mmm`(§0.4)
  533 +24. **链路映射纪律**:窗号 ↔ 镜号一一对应、只有一套时间轴;单件需求未硬拆四层(§0.6)
  534 +25. **输入给的参考图 url 在交付件里失联**:菜单带 url 而资产层只剩 id / 被改链(§2、§1.7 第 22 条)
  535 +
  536 +---
  537 +
  538 +## 8. 边界情况
  539 +
  540 +### 8.1 信息严重不足(clarify 轨五要素,C 级构造性设计)
  541 +
  542 +一次性列出全部缺失关键信息反问,不臆造场景往下写。反问件按五要素组织:
  543 +
  544 +| 要素 | 内容 |
  545 +|---|---|
  546 +| CL1 缺失项一次问全(30) | 主体、场景、核心动作/情节段落、情绪基调、期望时长(4-15s)、有无参考素材(图/视频/音频、各自负责什么)、有无对白及语言;不挤牙膏。漏问**会改变产出形态**的关键项(如主体)→ 不合格;**把不改变结果的可推断项也拿去问(过度反问)→ CL1 ≤ 20** |
  547 +| CL2 零臆造(25) | 不编造主体/场景/剧情往下写、不产出「看似合规」的 Prompt 假装完成;替用户编造主体外观属越权;带出半成品 Prompt → 不合格并按 D8 并行扣分。**核心主体或必需 UI 文案完全缺失时,编造主体续跑 = CL2 = 0 且改判 prompt 轨并行扣 D8** |
  548 +| CL3 分支预判(15) | 预判各答案分支会走的模式与形态(「有情节+要分镜 → ② 型;要英文结构化 → ① 型;有参考素材 → 全能参考」),预告各自交付形态 |
  549 +| CL4 已知信息锁定 + 推定显式标注(15) | 已知信息明确锁定复述;仅对不改变主体事实的低风险参数(时长/基调)在**显式标注假设**前提下自行推定,不把推定混进反问 |
  550 +| CL5 通道与格式(15) | 不伪造看似合规的 JSON 交付;schema 无反问通道时明确说明信息不足;说明层与产出层分离干净 |
  551 +
  552 +**反向(过度反问)**:raw_brief 已给全部关键信息、仅余不改变主体事实的低风险参数(如有无 BGM /
  553 +节奏快慢)时,正确行为是**直接产出 + 显式标注推定**;此时发问清单 = 过度反问,改判 clarify 轨
  554 +按 CL1 ≤ 20 计。不惩罚零臆造与锁定推定——那是正确保守行为。
  555 +
  556 +### 8.2 素材阻塞(block 轨五要素)
  557 +
  558 +当 §1.2 判定「必需素材不可用且无替代」时,交付**阻塞报告**而不是 Prompt,按五要素①-⑤组织
  559 +(§1.2)。schema 无错误通道时明确说明「schema 与素材要求不可同时满足」并给补齐后的处理预案。
  560 +**不要**报阻塞的同时又附一个引用了不可用素材的 Prompt——比静默引用更不可接受。
  561 +这不是失败,是正确行为。**反向**:素材可用 / note 为建议性 / 菜单内有替代版本时继续产出
  562 +(§1.2 反向条款);此时报阻塞 = 过度阻塞。
  563 +
  564 +---
  565 +
  566 +## 9. 交付清单
  567 +
  568 +- **最终提示词原文**:① 型 = 英文结构字段 + 保留原语言的 `<d>` 对白/可见文字;② 型 = 中文
  569 + 时间窗散文 + 每窗三要素 + UI 四禁令;链路 = 四层齐全(§0.6)。
  570 +- **资产层清单**(有参考素材时跨形态必交):`references`/`conditions[]` 数组,每条原 url 原样、
  571 + 顺序 = 菜单顺序;不可用素材标 excluded 单列,不与可引用素材混列。
  572 +- **交付说明(可中文,说明层语言自由)**:每个关键选择对应用户需求里的哪句话;注明本次
  573 + `duration_seconds` 取值(B 级);冲突取舍/素材阻塞的处理方式;逐句台词适用口径 V 还是 R;
  574 + 涉及 C 级构造(窗之和、首窗 0s、幽灵禁令、master 序号回指、链路四层)如实标 C 级,不得表述为
  575 + 官方条款。
  576 +- 交付前必须通过 §1.7 的 22 项机械验收,任一不过先修复再输出。
  577 +
  578 +---
  579 +
  580 +## 10. 来源标注与篇幅登记
  581 +
  582 +- **A 级**:MiniMax 官方一手飞书语料,`train/hunt/cache_v5/` 两篇全文落盘(doc1 rev 1297 /
  583 + doc2 rev 252),本文所有 `docN:line` 引句均可在 cache_v5 逐字回查(Digester 已用 python 逐行
  584 + 抽取比对,benchmark_v5_revision_notes.md 附录 A;Evolver 侧 SKILL 引句另跑 R4 审计脚本留痕)。
  585 +- **R 级(v4 镜像同型佐证)**:GitHub MiniMax-AI/MiniMax-H3 仓库 base-en.txt / ref-en.txt /
  586 + SKILL.md / co-op 模板 / shot-table-spec / storyboard-guidelines / README(sha256 已在 v3/v4
  587 + 登记)。凡本文已给 docN:line 的条款以 A 级为准,镜像行号仅作同型佐证保留(窗边界 #1、UI 四禁令、
  588 + `duration_seconds` 不进正文、非锚点图零秒锚、词法 grep 等暂无 A 级一手行号)。
  589 +- **B 级(社区一手实践)**:chiphoton production-workflow.md(单镜 10 项)、TFboy1
  590 + storyboard-schema.md(7 类衔接锚点 + 7 列镜头卡)。与官方冲突时以官方为准。
  591 +- **C 级(构造性设计,0 真实先例)**:窗之和 = 总时长、首窗从 0s、幽灵素材禁令、中英并列 UI、
  592 + master 序号回指、阻塞五要素、clarify 五要素、链路四层(#62)。对外不得表述为官方条款。
  593 +- **篇幅登记**:v0.5.0 88,655 B → v0.6.0 50,281 B → v0.6.1 51809 B(净增 +1528 B,url 载体条款;
  594 + 收敛手法见 evolve_report_v5.md)。**下轮若分数反常,本文件长度仍是第一怀疑对象**。
  595 +- 未解决登记:开放平台 schema 仍 blocked(新线索 `platform.minimaxi.com`,doc1:15);`conditions[].role`
  596 + 枚举第二信源缺;H1 字符计量口径官方未定义(取 `len()` 语义,B 级内部规范)。
library.json
1 [ 1 [
2 { 2 {
  3 + "id": "e9e9907999a3",
  4 + "source": "h3console",
  5 + "prompt": "明日香大战老太太",
  6 + "fullPrompt": "明日香大战老太太",
  7 + "edited": false,
  8 + "width": 480,
  9 + "height": 832,
  10 + "duration": 5,
  11 + "partition": "fl2va",
  12 + "likes": 0,
  13 + "createdAt": 1788254902903
  14 + },
  15 + {
  16 + "id": "13baa0ba32c5",
  17 + "source": "h3console",
  18 + "prompt": "明日香大战老太太",
  19 + "fullPrompt": "明日香大战老太太",
  20 + "edited": false,
  21 + "width": 480,
  22 + "height": 832,
  23 + "duration": 5,
  24 + "partition": "text",
  25 + "likes": 0,
  26 + "createdAt": 1788254902838
  27 + },
  28 + {
  29 + "id": "8d782b62dd8e",
  30 + "source": "h3console",
  31 + "prompt": "星际迷航穿越沙漠",
  32 + "fullPrompt": "星际迷航穿越沙漠",
  33 + "edited": false,
  34 + "width": 832,
  35 + "height": 480,
  36 + "duration": 5,
  37 + "partition": "text",
  38 + "likes": 0,
  39 + "createdAt": 1788254437728
  40 + },
  41 + {
  42 + "id": "1d116e9a5424",
  43 + "source": "h3console",
  44 + "prompt": "为什么跑这么快",
  45 + "fullPrompt": "为什么跑这么快",
  46 + "edited": false,
  47 + "width": 832,
  48 + "height": 480,
  49 + "duration": 5,
  50 + "partition": "text",
  51 + "likes": 0,
  52 + "createdAt": 1788254400661
  53 + },
  54 + {
3 "id": "4af4c61b64a6", 55 "id": "4af4c61b64a6",
4 "source": "h3console", 56 "source": "h3console",
5 "prompt": "一只白猫坐着,镜头缓慢推进,最终定格", 57 "prompt": "一只白猫坐着,镜头缓慢推进,最终定格",
@@ -10,8 +62,7 @@ @@ -10,8 +62,7 @@
10 "duration": 1, 62 "duration": 1,
11 "partition": "fl2va", 63 "partition": "fl2va",
12 "likes": 0, 64 "likes": 0,
13 - "createdAt": 1788251288958,  
14 - "lastPlayedAt": 1788254550116 65 + "createdAt": 1788251288958
15 }, 66 },
16 { 67 {
17 "id": "8024972d6019", 68 "id": "8024972d6019",
@@ -65,7 +116,8 @@ @@ -65,7 +116,8 @@
65 "likes": 0, 116 "likes": 0,
66 "createdAt": 1788192916199, 117 "createdAt": 1788192916199,
67 "promptEn": "taoist eyes the old house suspiciously", 118 "promptEn": "taoist eyes the old house suspiciously",
68 - "lastPlayedAt": 1788253021349 119 + "lastPlayedAt": 1788254770005,
  120 + "playCount": 1
69 }, 121 },
70 { 122 {
71 "id": "cb5baad5d724", 123 "id": "cb5baad5d724",
@@ -80,7 +132,8 @@ @@ -80,7 +132,8 @@
80 "likes": 0, 132 "likes": 0,
81 "createdAt": 1788192915845, 133 "createdAt": 1788192915845,
82 "promptEn": "scholar watches the room warily", 134 "promptEn": "scholar watches the room warily",
83 - "lastPlayedAt": 1788253865811 135 + "lastPlayedAt": 1788256422749,
  136 + "playCount": 1
84 }, 137 },
85 { 138 {
86 "id": "e8cbb73560ef", 139 "id": "e8cbb73560ef",
@@ -125,7 +178,8 @@ @@ -125,7 +178,8 @@
125 "likes": 0, 178 "likes": 0,
126 "createdAt": 1788192914949, 179 "createdAt": 1788192914949,
127 "promptEn": "taoist acts tough but is nervous", 180 "promptEn": "taoist acts tough but is nervous",
128 - "lastPlayedAt": 1788252613211 181 + "lastPlayedAt": 1788255954592,
  182 + "playCount": 1
129 }, 183 },
130 { 184 {
131 "id": "167ce1bfa285", 185 "id": "167ce1bfa285",
@@ -140,7 +194,8 @@ @@ -140,7 +194,8 @@
140 "likes": 0, 194 "likes": 0,
141 "createdAt": 1788192914047, 195 "createdAt": 1788192914047,
142 "promptEn": "scholar looks scared, wants to flee", 196 "promptEn": "scholar looks scared, wants to flee",
143 - "lastPlayedAt": 1788252155012 197 + "lastPlayedAt": 1788254591422,
  198 + "playCount": 1
144 }, 199 },
145 { 200 {
146 "id": "053bc957b4f8", 201 "id": "053bc957b4f8",
@@ -155,7 +210,8 @@ @@ -155,7 +210,8 @@
155 "likes": 0, 210 "likes": 0,
156 "createdAt": 1788192913886, 211 "createdAt": 1788192913886,
157 "promptEn": "taoist panics, freaked out", 212 "promptEn": "taoist panics, freaked out",
158 - "lastPlayedAt": 1788253751763 213 + "lastPlayedAt": 1788256170460,
  214 + "playCount": 1
159 }, 215 },
160 { 216 {
161 "id": "45c1136d1e05", 217 "id": "45c1136d1e05",
@@ -170,7 +226,8 @@ @@ -170,7 +226,8 @@
170 "likes": 0, 226 "likes": 0,
171 "createdAt": 1788192913551, 227 "createdAt": 1788192913551,
172 "promptEn": "taoist looking panicked and scared", 228 "promptEn": "taoist looking panicked and scared",
173 - "lastPlayedAt": 1788252637227 229 + "lastPlayedAt": 1788254914080,
  230 + "playCount": 1
174 }, 231 },
175 { 232 {
176 "id": "d169d42a67de", 233 "id": "d169d42a67de",
@@ -185,7 +242,8 @@ @@ -185,7 +242,8 @@
185 "likes": 0, 242 "likes": 0,
186 "createdAt": 1788192913492, 243 "createdAt": 1788192913492,
187 "promptEn": "scholar defiant out of desperation", 244 "promptEn": "scholar defiant out of desperation",
188 - "lastPlayedAt": 1788252431138 245 + "lastPlayedAt": 1788255404326,
  246 + "playCount": 1
189 }, 247 },
190 { 248 {
191 "id": "2abd2793fae9", 249 "id": "2abd2793fae9",
@@ -200,7 +258,8 @@ @@ -200,7 +258,8 @@
200 "likes": 0, 258 "likes": 0,
201 "createdAt": 1788192913244, 259 "createdAt": 1788192913244,
202 "promptEn": "scholar cornered but still defiant", 260 "promptEn": "scholar cornered but still defiant",
203 - "lastPlayedAt": 1788253347544 261 + "lastPlayedAt": 1788255156196,
  262 + "playCount": 1
204 }, 263 },
205 { 264 {
206 "id": "bbf7efb467e0", 265 "id": "bbf7efb467e0",
@@ -215,7 +274,8 @@ @@ -215,7 +274,8 @@
215 "likes": 0, 274 "likes": 0,
216 "createdAt": 1788192912912, 275 "createdAt": 1788192912912,
217 "promptEn": "taoist charmed, hesitating", 276 "promptEn": "taoist charmed, hesitating",
218 - "lastPlayedAt": 1788253947848 277 + "lastPlayedAt": 1788256108674,
  278 + "playCount": 1
219 }, 279 },
220 { 280 {
221 "id": "f8da9934c823", 281 "id": "f8da9934c823",
@@ -230,7 +290,8 @@ @@ -230,7 +290,8 @@
230 "likes": 0, 290 "likes": 0,
231 "createdAt": 1788192912819, 291 "createdAt": 1788192912819,
232 "promptEn": "scholar dazed, charmed", 292 "promptEn": "scholar dazed, charmed",
233 - "lastPlayedAt": 1788252975330 293 + "lastPlayedAt": 1788254860902,
  294 + "playCount": 1
234 }, 295 },
235 { 296 {
236 "id": "feb96d5be50f", 297 "id": "feb96d5be50f",
@@ -245,7 +306,8 @@ @@ -245,7 +306,8 @@
245 "likes": 0, 306 "likes": 0,
246 "createdAt": 1788191432903, 307 "createdAt": 1788191432903,
247 "promptEn": "woman in white startled, a bit shy", 308 "promptEn": "woman in white startled, a bit shy",
248 - "lastPlayedAt": 1788252189029 309 + "lastPlayedAt": 1788256332708,
  310 + "playCount": 1
249 }, 311 },
250 { 312 {
251 "id": "14f482bdae7f", 313 "id": "14f482bdae7f",
@@ -260,7 +322,8 @@ @@ -260,7 +322,8 @@
260 "likes": 0, 322 "likes": 0,
261 "createdAt": 1788191432362, 323 "createdAt": 1788191432362,
262 "promptEn": "woman in white being intimate and alluring", 324 "promptEn": "woman in white being intimate and alluring",
263 - "lastPlayedAt": 1788251702786 325 + "lastPlayedAt": 1788255084160,
  326 + "playCount": 1
264 }, 327 },
265 { 328 {
266 "id": "362b15ab1811", 329 "id": "362b15ab1811",
@@ -290,7 +353,8 @@ @@ -290,7 +353,8 @@
290 "likes": 0, 353 "likes": 0,
291 "createdAt": 1788191431505, 354 "createdAt": 1788191431505,
292 "promptEn": "woman in white scared, dodging the question", 355 "promptEn": "woman in white scared, dodging the question",
293 - "lastPlayedAt": 1788252941314 356 + "lastPlayedAt": 1788256176464,
  357 + "playCount": 1
294 }, 358 },
295 { 359 {
296 "id": "667978d52305", 360 "id": "667978d52305",
@@ -305,7 +369,8 @@ @@ -305,7 +369,8 @@
305 "likes": 0, 369 "likes": 0,
306 "createdAt": 1788191431016, 370 "createdAt": 1788191431016,
307 "promptEn": "woman in white coldly threatening", 371 "promptEn": "woman in white coldly threatening",
308 - "lastPlayedAt": 1788251764831 372 + "lastPlayedAt": 1788255162198,
  373 + "playCount": 1
309 }, 374 },
310 { 375 {
311 "id": "7f5213748d87", 376 "id": "7f5213748d87",
@@ -334,8 +399,9 @@ @@ -334,8 +399,9 @@
334 "partition": "ref2va", 399 "partition": "ref2va",
335 "likes": 0, 400 "likes": 0,
336 "createdAt": 1788187365789, 401 "createdAt": 1788187365789,
337 - "lastPlayedAt": 1788251380546,  
338 - "promptEn": "woman in white being gentle and comforting" 402 + "lastPlayedAt": 1788255462355,
  403 + "promptEn": "woman in white being gentle and comforting",
  404 + "playCount": 1
339 }, 405 },
340 { 406 {
341 "id": "88d71d85058f", 407 "id": "88d71d85058f",
@@ -365,7 +431,8 @@ @@ -365,7 +431,8 @@
365 "likes": 0, 431 "likes": 0,
366 "createdAt": 1788185090875, 432 "createdAt": 1788185090875,
367 "promptEn": "woman in white cold and threatening", 433 "promptEn": "woman in white cold and threatening",
368 - "lastPlayedAt": 1788253487611 434 + "lastPlayedAt": 1788255142186,
  435 + "playCount": 1
369 }, 436 },
370 { 437 {
371 "id": "a46f1daa9ee0", 438 "id": "a46f1daa9ee0",
@@ -395,7 +462,8 @@ @@ -395,7 +462,8 @@
395 "likes": 0, 462 "likes": 0,
396 "createdAt": 1788162094002, 463 "createdAt": 1788162094002,
397 "promptEn": "woman in old chinese robe talking, gentle but wary, in an old room", 464 "promptEn": "woman in old chinese robe talking, gentle but wary, in an old room",
398 - "lastPlayedAt": 1788250690213 465 + "lastPlayedAt": 1788254868055,
  466 + "playCount": 1
399 }, 467 },
400 { 468 {
401 "id": "e17cfe57f56a", 469 "id": "e17cfe57f56a",
@@ -455,7 +523,8 @@ @@ -455,7 +523,8 @@
455 "likes": 0, 523 "likes": 0,
456 "createdAt": 1788157177505, 524 "createdAt": 1788157177505,
457 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen", 525 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
458 - "lastPlayedAt": 1788250622191 526 + "lastPlayedAt": 1788254955075,
  527 + "playCount": 1
459 }, 528 },
460 { 529 {
461 "id": "a9c4ba5e453b", 530 "id": "a9c4ba5e453b",
@@ -470,7 +539,8 @@ @@ -470,7 +539,8 @@
470 "likes": 0, 539 "likes": 0,
471 "createdAt": 1788156878022, 540 "createdAt": 1788156878022,
472 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen", 541 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
473 - "lastPlayedAt": 1788254209972 542 + "lastPlayedAt": 1788256376724,
  543 + "playCount": 1
474 }, 544 },
475 { 545 {
476 "id": "a0b752e7ac0d", 546 "id": "a0b752e7ac0d",
@@ -485,7 +555,8 @@ @@ -485,7 +555,8 @@
485 "likes": 0, 555 "likes": 0,
486 "createdAt": 1788154942596, 556 "createdAt": 1788154942596,
487 "promptEn": "constable talking, looking scared", 557 "promptEn": "constable talking, looking scared",
488 - "lastPlayedAt": 1788252145004 558 + "lastPlayedAt": 1788254919873,
  559 + "playCount": 1
489 }, 560 },
490 { 561 {
491 "id": "b6608e2eac60", 562 "id": "b6608e2eac60",
@@ -500,7 +571,8 @@ @@ -500,7 +571,8 @@
500 "likes": 0, 571 "likes": 0,
501 "createdAt": 1788153988474, 572 "createdAt": 1788153988474,
502 "promptEn": "astronaut at a martian canyon, visor reflecting alien ruins, then aerial view of the city", 573 "promptEn": "astronaut at a martian canyon, visor reflecting alien ruins, then aerial view of the city",
503 - "lastPlayedAt": 1788253845801 574 + "lastPlayedAt": 1788256486789,
  575 + "playCount": 1
504 }, 576 },
505 { 577 {
506 "id": "194fc2b56cb5", 578 "id": "194fc2b56cb5",
@@ -515,7 +587,8 @@ @@ -515,7 +587,8 @@
515 "likes": 0, 587 "likes": 0,
516 "createdAt": 1788138492364, 588 "createdAt": 1788138492364,
517 "promptEn": "astronaut on a Martian canyon, helmet reflecting an alien ruined city", 589 "promptEn": "astronaut on a Martian canyon, helmet reflecting an alien ruined city",
518 - "lastPlayedAt": 1788253805777 590 + "lastPlayedAt": 1788255096170,
  591 + "playCount": 1
519 }, 592 },
520 { 593 {
521 "id": "f84b8f044ec5", 594 "id": "f84b8f044ec5",
@@ -530,7 +603,8 @@ @@ -530,7 +603,8 @@
530 "likes": 0, 603 "likes": 0,
531 "createdAt": 1788120171725, 604 "createdAt": 1788120171725,
532 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen", 605 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
533 - "lastPlayedAt": 1788253571659 606 + "lastPlayedAt": 1788255758515,
  607 + "playCount": 1
534 }, 608 },
535 { 609 {
536 "id": "5c364152e54c", 610 "id": "5c364152e54c",
@@ -560,7 +634,8 @@ @@ -560,7 +634,8 @@
560 "likes": 0, 634 "likes": 0,
561 "createdAt": 1788106707982, 635 "createdAt": 1788106707982,
562 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen", 636 "promptEn": "constable bursts in and blocks the door, talks to a pale woman behind the screen",
563 - "lastPlayedAt": 1788247638248 637 + "lastPlayedAt": 1788254838039,
  638 + "playCount": 1
564 }, 639 },
565 { 640 {
566 "id": "1fa40bca47f5", 641 "id": "1fa40bca47f5",
@@ -575,7 +650,8 @@ @@ -575,7 +650,8 @@
575 "likes": 0, 650 "likes": 0,
576 "createdAt": 1788085282201, 651 "createdAt": 1788085282201,
577 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen", 652 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
578 - "lastPlayedAt": 1788254023891 653 + "lastPlayedAt": 1788255328296,
  654 + "playCount": 1
579 }, 655 },
580 { 656 {
581 "id": "683ab2fd4681", 657 "id": "683ab2fd4681",
@@ -590,7 +666,8 @@ @@ -590,7 +666,8 @@
590 "likes": 0, 666 "likes": 0,
591 "createdAt": 1788071067702, 667 "createdAt": 1788071067702,
592 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen", 668 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
593 - "lastPlayedAt": 1788253999874 669 + "lastPlayedAt": 1788256078660,
  670 + "playCount": 1
594 }, 671 },
595 { 672 {
596 "id": "2e09fcd3d42c", 673 "id": "2e09fcd3d42c",
@@ -605,7 +682,8 @@ @@ -605,7 +682,8 @@
605 "likes": 0, 682 "likes": 0,
606 "createdAt": 1788062322252, 683 "createdAt": 1788062322252,
607 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen", 684 "promptEn": "constable stands still, quietly says he won't make a sound, woman stays silent behind the screen",
608 - "lastPlayedAt": 1788252491166 685 + "lastPlayedAt": 1788255426343,
  686 + "playCount": 1
609 }, 687 },
610 { 688 {
611 "id": "12ea9ce00f36", 689 "id": "12ea9ce00f36",
@@ -680,7 +758,8 @@ @@ -680,7 +758,8 @@
680 "likes": 0, 758 "likes": 0,
681 "createdAt": 1788026876886, 759 "createdAt": 1788026876886,
682 "promptEn": "apartment manager in an eerie corridor, red elevator light flickering, holding out a key", 760 "promptEn": "apartment manager in an eerie corridor, red elevator light flickering, holding out a key",
683 - "lastPlayedAt": 1788253825788 761 + "lastPlayedAt": 1788255138188,
  762 + "playCount": 1
684 }, 763 },
685 { 764 {
686 "id": "cdd03cca8461", 765 "id": "cdd03cca8461",
@@ -695,7 +774,8 @@ @@ -695,7 +774,8 @@
695 "likes": 0, 774 "likes": 0,
696 "createdAt": 1788026569422, 775 "createdAt": 1788026569422,
697 "promptEn": "stitched-face long-haired curse on a subway platform, flickering lights, cruel smile", 776 "promptEn": "stitched-face long-haired curse on a subway platform, flickering lights, cruel smile",
698 - "lastPlayedAt": 1788253043365 777 + "lastPlayedAt": 1788256094667,
  778 + "playCount": 1
699 }, 779 },
700 { 780 {
701 "id": "b8dd0f62f648", 781 "id": "b8dd0f62f648",
@@ -755,7 +835,8 @@ @@ -755,7 +835,8 @@
755 "likes": 0, 835 "likes": 0,
756 "createdAt": 1788026568242, 836 "createdAt": 1788026568242,
757 "promptEn": "magma commander in a white coat, raising a lava fist on the battlefield", 837 "promptEn": "magma commander in a white coat, raising a lava fist on the battlefield",
758 - "lastPlayedAt": 1788254205974 838 + "lastPlayedAt": 1788256448766,
  839 + "playCount": 1
759 }, 840 },
760 { 841 {
761 "id": "1442013e94f0", 842 "id": "1442013e94f0",
@@ -770,7 +851,8 @@ @@ -770,7 +851,8 @@
770 "likes": 0, 851 "likes": 0,
771 "createdAt": 1788026068497, 852 "createdAt": 1788026068497,
772 "promptEn": "black-haired prince in a red cloak, pressing down an execution order in the trial hall", 853 "promptEn": "black-haired prince in a red cloak, pressing down an execution order in the trial hall",
773 - "lastPlayedAt": 1788253425586 854 + "lastPlayedAt": 1788255396328,
  855 + "playCount": 1
774 }, 856 },
775 { 857 {
776 "id": "0a5e37bb328c", 858 "id": "0a5e37bb328c",
@@ -800,7 +882,8 @@ @@ -800,7 +882,8 @@
800 "likes": 0, 882 "likes": 0,
801 "createdAt": 1788025640972, 883 "createdAt": 1788025640972,
802 "promptEn": "Voldemort in a graveyard, wand raised, stepping closer", 884 "promptEn": "Voldemort in a graveyard, wand raised, stepping closer",
803 - "lastPlayedAt": 1788253469603 885 + "lastPlayedAt": 1788254858047,
  886 + "playCount": 1
804 }, 887 },
805 { 888 {
806 "id": "c3875fbd6cc4", 889 "id": "c3875fbd6cc4",
@@ -815,7 +898,8 @@ @@ -815,7 +898,8 @@
815 "likes": 0, 898 "likes": 0,
816 "createdAt": 1788025632028, 899 "createdAt": 1788025632028,
817 "promptEn": "a giant mouth embedded in the wall at the end of an endless hotel corridor, slowly opening", 900 "promptEn": "a giant mouth embedded in the wall at the end of an endless hotel corridor, slowly opening",
818 - "lastPlayedAt": 1788252701202 901 + "lastPlayedAt": 1788256138682,
  902 + "playCount": 1
819 }, 903 },
820 { 904 {
821 "id": "1c6e2df243f4", 905 "id": "1c6e2df243f4",
@@ -830,7 +914,8 @@ @@ -830,7 +914,8 @@
830 "likes": 0, 914 "likes": 0,
831 "createdAt": 1788025630249, 915 "createdAt": 1788025630249,
832 "promptEn": "white-haired villain in a ruined street at night, cracked smile, reaching out a hand", 916 "promptEn": "white-haired villain in a ruined street at night, cracked smile, reaching out a hand",
833 - "lastPlayedAt": 1788251462624 917 + "lastPlayedAt": 1788254713983,
  918 + "playCount": 1
834 }, 919 },
835 { 920 {
836 "id": "d735f1fc010f", 921 "id": "d735f1fc010f",
@@ -845,7 +930,8 @@ @@ -845,7 +930,8 @@
845 "likes": 0, 930 "likes": 0,
846 "createdAt": 1788025624377, 931 "createdAt": 1788025624377,
847 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them", 932 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them",
848 - "lastPlayedAt": 1788252499167 933 + "lastPlayedAt": 1788255436346,
  934 + "playCount": 1
849 }, 935 },
850 { 936 {
851 "id": "b16b64e52f83", 937 "id": "b16b64e52f83",
@@ -860,7 +946,8 @@ @@ -860,7 +946,8 @@
860 "likes": 0, 946 "likes": 0,
861 "createdAt": 1788025623833, 947 "createdAt": 1788025623833,
862 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them", 948 "promptEn": "cat-eared white-haired guard crouching in a ruined palace, purple aura around them",
863 - "lastPlayedAt": 1788253528965 949 + "lastPlayedAt": 1788255754514,
  950 + "playCount": 1
864 }, 951 },
865 { 952 {
866 "id": "0d721acbc298", 953 "id": "0d721acbc298",
@@ -875,7 +962,8 @@ @@ -875,7 +962,8 @@
875 "likes": 0, 962 "likes": 0,
876 "createdAt": 1788025622363, 963 "createdAt": 1788025622363,
877 "promptEn": "detective in a surveillance room squinting at the monitors", 964 "promptEn": "detective in a surveillance room squinting at the monitors",
878 - "lastPlayedAt": 1788253255505 965 + "lastPlayedAt": 1788256282688,
  966 + "playCount": 1
879 }, 967 },
880 { 968 {
881 "id": "639069dea7c5", 969 "id": "639069dea7c5",
@@ -890,7 +978,8 @@ @@ -890,7 +978,8 @@
890 "likes": 0, 978 "likes": 0,
891 "createdAt": 1788025620717, 979 "createdAt": 1788025620717,
892 "promptEn": "alien tyrant holding a glowing energy sphere, sneering on a rocky green battlefield", 980 "promptEn": "alien tyrant holding a glowing energy sphere, sneering on a rocky green battlefield",
893 - "lastPlayedAt": 1788253757767 981 + "lastPlayedAt": 1788255248247,
  982 + "playCount": 1
894 }, 983 },
895 { 984 {
896 "id": "9db41d807330", 985 "id": "9db41d807330",
@@ -935,7 +1024,8 @@ @@ -935,7 +1024,8 @@
935 "likes": 0, 1024 "likes": 0,
936 "createdAt": 1788024900966, 1025 "createdAt": 1788024900966,
937 "promptEn": "player 101 blocking the path on a high glass bridge, threatening you", 1026 "promptEn": "player 101 blocking the path on a high glass bridge, threatening you",
938 - "lastPlayedAt": 1788253797782 1027 + "lastPlayedAt": 1788255958603,
  1028 + "playCount": 1
939 }, 1029 },
940 { 1030 {
941 "id": "d6aab3fce63d", 1031 "id": "d6aab3fce63d",
@@ -950,7 +1040,8 @@ @@ -950,7 +1040,8 @@
950 "likes": 0, 1040 "likes": 0,
951 "createdAt": 1788024747209, 1041 "createdAt": 1788024747209,
952 "promptEn": "wounded hunter leaning on a subway turnstile, ordering you into the tunnel", 1042 "promptEn": "wounded hunter leaning on a subway turnstile, ordering you into the tunnel",
953 - "lastPlayedAt": 1788253507622 1043 + "lastPlayedAt": 1788255324295,
  1044 + "playCount": 1
954 }, 1045 },
955 { 1046 {
956 "id": "fdefca4e4980", 1047 "id": "fdefca4e4980",
@@ -965,7 +1056,8 @@ @@ -965,7 +1056,8 @@
965 "likes": 0, 1056 "likes": 0,
966 "createdAt": 1788024491625, 1057 "createdAt": 1788024491625,
967 "promptEn": "prince signs an execution order in the trial hall, points at the guillotine", 1058 "promptEn": "prince signs an execution order in the trial hall, points at the guillotine",
968 - "lastPlayedAt": 1788253737754 1059 + "lastPlayedAt": 1788255392324,
  1060 + "playCount": 1
969 }, 1061 },
970 { 1062 {
971 "id": "8a933feb52c4", 1063 "id": "8a933feb52c4",
@@ -1010,7 +1102,8 @@ @@ -1010,7 +1102,8 @@
1010 "likes": 0, 1102 "likes": 0,
1011 "createdAt": 1788016434846, 1103 "createdAt": 1788016434846,
1012 "promptEn": "pirate negotiation, catching Barbossa's flaw and turning the tables", 1104 "promptEn": "pirate negotiation, catching Barbossa's flaw and turning the tables",
1013 - "lastPlayedAt": 1788251638752 1105 + "lastPlayedAt": 1788254979611,
  1106 + "playCount": 1
1014 }, 1107 },
1015 { 1108 {
1016 "id": "03e32ff5f0ef", 1109 "id": "03e32ff5f0ef",
@@ -1040,7 +1133,8 @@ @@ -1040,7 +1133,8 @@
1040 "likes": 0, 1133 "likes": 0,
1041 "createdAt": 1788015968838, 1134 "createdAt": 1788015968838,
1042 "promptEn": "pirate negotiation, held the goal but paid a price", 1135 "promptEn": "pirate negotiation, held the goal but paid a price",
1043 - "lastPlayedAt": 1788249093401 1136 + "lastPlayedAt": 1788256104663,
  1137 + "playCount": 1
1044 }, 1138 },
1045 { 1139 {
1046 "id": "b328649000d1", 1140 "id": "b328649000d1",
@@ -1070,7 +1164,8 @@ @@ -1070,7 +1164,8 @@
1070 "likes": 0, 1164 "likes": 0,
1071 "createdAt": 1788015493445, 1165 "createdAt": 1788015493445,
1072 "promptEn": "pirate negotiation, went in head-on and Barbossa saw it coming", 1166 "promptEn": "pirate negotiation, went in head-on and Barbossa saw it coming",
1073 - "lastPlayedAt": 1788250790245 1167 + "lastPlayedAt": 1788256412747,
  1168 + "playCount": 1
1074 }, 1169 },
1075 { 1170 {
1076 "id": "3f30f5097438", 1171 "id": "3f30f5097438",
@@ -1085,7 +1180,8 @@ @@ -1085,7 +1180,8 @@
1085 "likes": 0, 1180 "likes": 0,
1086 "createdAt": 1788015035234, 1181 "createdAt": 1788015035234,
1087 "promptEn": "pirate negotiation, stayed passive and got cornered", 1182 "promptEn": "pirate negotiation, stayed passive and got cornered",
1088 - "lastPlayedAt": 1788251632751 1183 + "lastPlayedAt": 1788255772518,
  1184 + "playCount": 1
1089 }, 1185 },
1090 { 1186 {
1091 "id": "6a0d14cabe17", 1187 "id": "6a0d14cabe17",
@@ -1100,7 +1196,8 @@ @@ -1100,7 +1196,8 @@
1100 "likes": 0, 1196 "likes": 0,
1101 "createdAt": 1788014791733, 1197 "createdAt": 1788014791733,
1102 "promptEn": "pirate negotiation, stayed passive and got cornered", 1198 "promptEn": "pirate negotiation, stayed passive and got cornered",
1103 - "lastPlayedAt": 1788252169019 1199 + "lastPlayedAt": 1788254585426,
  1200 + "playCount": 1
1104 }, 1201 },
1105 { 1202 {
1106 "id": "08120928cc77", 1203 "id": "08120928cc77",
@@ -1115,7 +1212,8 @@ @@ -1115,7 +1212,8 @@
1115 "likes": 0, 1212 "likes": 0,
1116 "createdAt": 1788014790969, 1213 "createdAt": 1788014790969,
1117 "promptEn": "pirate negotiation, stayed passive and got cornered", 1214 "promptEn": "pirate negotiation, stayed passive and got cornered",
1118 - "lastPlayedAt": 1788253191467 1215 + "lastPlayedAt": 1788256262677,
  1216 + "playCount": 1
1119 }, 1217 },
1120 { 1218 {
1121 "id": "e14fe7c3220e", 1219 "id": "e14fe7c3220e",
@@ -1130,7 +1228,8 @@ @@ -1130,7 +1228,8 @@
1130 "likes": 0, 1228 "likes": 0,
1131 "createdAt": 1788014563344, 1229 "createdAt": 1788014563344,
1132 "promptEn": "captain's cabin on the Black Pearl, surrounded by pirates, negotiation could turn into an execution", 1230 "promptEn": "captain's cabin on the Black Pearl, surrounded by pirates, negotiation could turn into an execution",
1133 - "lastPlayedAt": 1788252563192 1231 + "lastPlayedAt": 1788254910082,
  1232 + "playCount": 1
1134 }, 1233 },
1135 { 1234 {
1136 "id": "c6e8560f62a2", 1235 "id": "c6e8560f62a2",
@@ -1160,7 +1259,8 @@ @@ -1160,7 +1259,8 @@
1160 "likes": 0, 1259 "likes": 0,
1161 "createdAt": 1788014099497, 1260 "createdAt": 1788014099497,
1162 "promptEn": "glass bridge game, exploiting a flaw to push back player 101", 1261 "promptEn": "glass bridge game, exploiting a flaw to push back player 101",
1163 - "lastPlayedAt": 1788251098395 1262 + "lastPlayedAt": 1788255994616,
  1263 + "playCount": 1
1164 }, 1264 },
1165 { 1265 {
1166 "id": "24576c264a25", 1266 "id": "24576c264a25",
@@ -1190,7 +1290,8 @@ @@ -1190,7 +1290,8 @@
1190 "likes": 0, 1290 "likes": 0,
1191 "createdAt": 1788013634333, 1291 "createdAt": 1788013634333,
1192 "promptEn": "glass bridge game, held the goal but paid a price", 1292 "promptEn": "glass bridge game, held the goal but paid a price",
1193 - "lastPlayedAt": 1788254355883 1293 + "lastPlayedAt": 1788256336707,
  1294 + "playCount": 1
1194 }, 1295 },
1195 { 1296 {
1196 "id": "5b8ef21616d4", 1297 "id": "5b8ef21616d4",
@@ -1205,7 +1306,8 @@ @@ -1205,7 +1306,8 @@
1205 "likes": 0, 1306 "likes": 0,
1206 "createdAt": 1788013632065, 1307 "createdAt": 1788013632065,
1207 "promptEn": "glass bridge game, held the goal but paid a price", 1308 "promptEn": "glass bridge game, held the goal but paid a price",
1208 - "lastPlayedAt": 1788252935312 1309 + "lastPlayedAt": 1788256464777,
  1310 + "playCount": 1
1209 }, 1311 },
1210 { 1312 {
1211 "id": "892b923eed29", 1313 "id": "892b923eed29",
@@ -1220,7 +1322,8 @@ @@ -1220,7 +1322,8 @@
1220 "likes": 0, 1322 "likes": 0,
1221 "createdAt": 1788013393463, 1323 "createdAt": 1788013393463,
1222 "promptEn": "guessed wrong in a survival game, got countered", 1324 "promptEn": "guessed wrong in a survival game, got countered",
1223 - "lastPlayedAt": 1788250071902 1325 + "lastPlayedAt": 1788256516804,
  1326 + "playCount": 1
1224 }, 1327 },
1225 { 1328 {
1226 "id": "7880a91928c6", 1329 "id": "7880a91928c6",
@@ -1250,7 +1353,8 @@ @@ -1250,7 +1353,8 @@
1250 "likes": 0, 1353 "likes": 0,
1251 "createdAt": 1788012917294, 1354 "createdAt": 1788012917294,
1252 "promptEn": "standing on the glass bridge, facing off with player 101", 1355 "promptEn": "standing on the glass bridge, facing off with player 101",
1253 - "lastPlayedAt": 1788253839798 1356 + "lastPlayedAt": 1788255356310,
  1357 + "playCount": 1
1254 }, 1358 },
1255 { 1359 {
1256 "id": "8f23de61904f", 1360 "id": "8f23de61904f",
@@ -1265,7 +1369,8 @@ @@ -1265,7 +1369,8 @@
1265 "likes": 0, 1369 "likes": 0,
1266 "createdAt": 1788012917185, 1370 "createdAt": 1788012917185,
1267 "promptEn": "standing on the glass bridge, facing off with player 101", 1371 "promptEn": "standing on the glass bridge, facing off with player 101",
1268 - "lastPlayedAt": 1788250786246 1372 + "lastPlayedAt": 1788256286703,
  1373 + "playCount": 1
1269 }, 1374 },
1270 { 1375 {
1271 "id": "bb4a8351d822", 1376 "id": "bb4a8351d822",
@@ -1280,7 +1385,8 @@ @@ -1280,7 +1385,8 @@
1280 "likes": 0, 1385 "likes": 0,
1281 "createdAt": 1788012679740, 1386 "createdAt": 1788012679740,
1282 "promptEn": "in the mental lair, exploiting a flaw to counter Vecna", 1387 "promptEn": "in the mental lair, exploiting a flaw to counter Vecna",
1283 - "lastPlayedAt": 1788250124975 1388 + "lastPlayedAt": 1788255036140,
  1389 + "playCount": 1
1284 }, 1390 },
1285 { 1391 {
1286 "id": "3913752bbe3a", 1392 "id": "3913752bbe3a",
@@ -1340,7 +1446,8 @@ @@ -1340,7 +1446,8 @@
1340 "likes": 0, 1446 "likes": 0,
1341 "createdAt": 1788011964828, 1447 "createdAt": 1788011964828,
1342 "promptEn": "facing Vecna, stayed passive and got cornered", 1448 "promptEn": "facing Vecna, stayed passive and got cornered",
1343 - "lastPlayedAt": 1788247774359 1449 + "lastPlayedAt": 1788254655959,
  1450 + "playCount": 1
1344 }, 1451 },
1345 { 1452 {
1346 "id": "7161aecafa32", 1453 "id": "7161aecafa32",
@@ -1355,7 +1462,8 @@ @@ -1355,7 +1462,8 @@
1355 "likes": 0, 1462 "likes": 0,
1356 "createdAt": 1788011727444, 1463 "createdAt": 1788011727444,
1357 "promptEn": "entering Vecna's mental lair, red lightning, twisted space", 1464 "promptEn": "entering Vecna's mental lair, red lightning, twisted space",
1358 - "lastPlayedAt": 1788251520666 1465 + "lastPlayedAt": 1788254934172,
  1466 + "playCount": 1
1359 }, 1467 },
1360 { 1468 {
1361 "id": "6a9af7e7368d", 1469 "id": "6a9af7e7368d",
@@ -1370,7 +1478,8 @@ @@ -1370,7 +1478,8 @@
1370 "likes": 0, 1478 "likes": 0,
1371 "createdAt": 1788011488775, 1479 "createdAt": 1788011488775,
1372 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort", 1480 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort",
1373 - "lastPlayedAt": 1788253875818 1481 + "lastPlayedAt": 1788255500375,
  1482 + "playCount": 1
1374 }, 1483 },
1375 { 1484 {
1376 "id": "24845be71ea0", 1485 "id": "24845be71ea0",
@@ -1385,7 +1494,8 @@ @@ -1385,7 +1494,8 @@
1385 "likes": 0, 1494 "likes": 0,
1386 "createdAt": 1788011488667, 1495 "createdAt": 1788011488667,
1387 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort", 1496 "promptEn": "graveyard standoff, exploiting a flaw to counter Voldemort",
1388 - "lastPlayedAt": 1788252803254 1497 + "lastPlayedAt": 1788254960102,
  1498 + "playCount": 1
1389 }, 1499 },
1390 { 1500 {
1391 "id": "f1012a3d7aa7", 1501 "id": "f1012a3d7aa7",
@@ -1415,7 +1525,8 @@ @@ -1415,7 +1525,8 @@
1415 "likes": 0, 1525 "likes": 0,
1416 "createdAt": 1788011013309, 1526 "createdAt": 1788011013309,
1417 "promptEn": "facing Voldemort, went in head-on and got seen through", 1527 "promptEn": "facing Voldemort, went in head-on and got seen through",
1418 - "lastPlayedAt": 1788252965327 1528 + "lastPlayedAt": 1788254930090,
  1529 + "playCount": 1
1419 }, 1530 },
1420 { 1531 {
1421 "id": "682cbc166479", 1532 "id": "682cbc166479",
@@ -1490,7 +1601,8 @@ @@ -1490,7 +1601,8 @@
1490 "likes": 0, 1601 "likes": 0,
1491 "createdAt": 1788009825082, 1602 "createdAt": 1788009825082,
1492 "promptEn": "facing Thanos, went in head-on and got seen through", 1603 "promptEn": "facing Thanos, went in head-on and got seen through",
1493 - "lastPlayedAt": 1788252393143 1604 + "lastPlayedAt": 1788256098668,
  1605 + "playCount": 1
1494 }, 1606 },
1495 { 1607 {
1496 "id": "a6ead2cbe03f", 1608 "id": "a6ead2cbe03f",
@@ -1505,7 +1617,8 @@ @@ -1505,7 +1617,8 @@
1505 "likes": 0, 1617 "likes": 0,
1506 "createdAt": 1788009586293, 1618 "createdAt": 1788009586293,
1507 "promptEn": "facing Thanos, stayed passive and got cornered", 1619 "promptEn": "facing Thanos, stayed passive and got cornered",
1508 - "lastPlayedAt": 1788253869815 1620 + "lastPlayedAt": 1788256306693,
  1621 + "playCount": 1
1509 }, 1622 },
1510 { 1623 {
1511 "id": "438c98cf4973", 1624 "id": "438c98cf4973",
@@ -1535,7 +1648,8 @@ @@ -1535,7 +1648,8 @@
1535 "likes": 0, 1648 "likes": 0,
1536 "createdAt": 1788009108302, 1649 "createdAt": 1788009108302,
1537 "promptEn": "in the endless hotel, exploiting a flaw to counter the Eternity Devil", 1650 "promptEn": "in the endless hotel, exploiting a flaw to counter the Eternity Devil",
1538 - "lastPlayedAt": 1788252247056 1651 + "lastPlayedAt": 1788255052143,
  1652 + "playCount": 1
1539 }, 1653 },
1540 { 1654 {
1541 "id": "71c590b0ea8f", 1655 "id": "71c590b0ea8f",
@@ -1580,7 +1694,8 @@ @@ -1580,7 +1694,8 @@
1580 "likes": 0, 1694 "likes": 0,
1581 "createdAt": 1788008394344, 1695 "createdAt": 1788008394344,
1582 "promptEn": "facing the Eternity Devil, stayed passive and got cornered", 1696 "promptEn": "facing the Eternity Devil, stayed passive and got cornered",
1583 - "lastPlayedAt": 1788252833268 1697 + "lastPlayedAt": 1788255400330,
  1698 + "playCount": 1
1584 }, 1699 },
1585 { 1700 {
1586 "id": "1a57de01bad0", 1701 "id": "1a57de01bad0",
@@ -1640,7 +1755,8 @@ @@ -1640,7 +1755,8 @@
1640 "likes": 0, 1755 "likes": 0,
1641 "createdAt": 1788007441156, 1756 "createdAt": 1788007441156,
1642 "promptEn": "battlefield in Jaku city, the city in ruins, heroes in crisis", 1757 "promptEn": "battlefield in Jaku city, the city in ruins, heroes in crisis",
1643 - "lastPlayedAt": 1788253771767 1758 + "lastPlayedAt": 1788256522850,
  1759 + "playCount": 1
1644 }, 1760 },
1645 { 1761 {
1646 "id": "68219d6b68c8", 1762 "id": "68219d6b68c8",
@@ -1670,7 +1786,8 @@ @@ -1670,7 +1786,8 @@
1670 "likes": 0, 1786 "likes": 0,
1671 "createdAt": 1788006964122, 1787 "createdAt": 1788006964122,
1672 "promptEn": "grabbing an evidence flaw to counter L", 1788 "promptEn": "grabbing an evidence flaw to counter L",
1673 - "lastPlayedAt": 1788253259502 1789 + "lastPlayedAt": 1788255550395,
  1790 + "playCount": 1
1674 }, 1791 },
1675 { 1792 {
1676 "id": "0c6306b07f79", 1793 "id": "0c6306b07f79",
@@ -1685,7 +1802,8 @@ @@ -1685,7 +1802,8 @@
1685 "likes": 0, 1802 "likes": 0,
1686 "createdAt": 1788006725887, 1803 "createdAt": 1788006725887,
1687 "promptEn": "facing off with L, went in head-on and got seen through", 1804 "promptEn": "facing off with L, went in head-on and got seen through",
1688 - "lastPlayedAt": 1788252617213 1805 + "lastPlayedAt": 1788255738510,
  1806 + "playCount": 1
1689 }, 1807 },
1690 { 1808 {
1691 "id": "ee82188227fa", 1809 "id": "ee82188227fa",
@@ -1730,7 +1848,8 @@ @@ -1730,7 +1848,8 @@
1730 "likes": 0, 1848 "likes": 0,
1731 "createdAt": 1788006015175, 1849 "createdAt": 1788006015175,
1732 "promptEn": "on the ruined planet, exploiting a flaw to counter Frieza", 1850 "promptEn": "on the ruined planet, exploiting a flaw to counter Frieza",
1733 - "lastPlayedAt": 1788252971329 1851 + "lastPlayedAt": 1788256212662,
  1852 + "playCount": 1
1734 }, 1853 },
1735 { 1854 {
1736 "id": "e6fda5c2237d", 1855 "id": "e6fda5c2237d",
@@ -1745,7 +1864,8 @@ @@ -1745,7 +1864,8 @@
1745 "likes": 0, 1864 "likes": 0,
1746 "createdAt": 1788005778588, 1865 "createdAt": 1788005778588,
1747 "promptEn": "facing Frieza, held the goal but paid a price", 1866 "promptEn": "facing Frieza, held the goal but paid a price",
1748 - "lastPlayedAt": 1788249925828 1867 + "lastPlayedAt": 1788256090667,
  1868 + "playCount": 1
1749 }, 1869 },
1750 { 1870 {
1751 "id": "b96cc9762cf6", 1871 "id": "b96cc9762cf6",
@@ -1775,7 +1895,8 @@ @@ -1775,7 +1895,8 @@
1775 "likes": 0, 1895 "likes": 0,
1776 "createdAt": 1788005305091, 1896 "createdAt": 1788005305091,
1777 "promptEn": "facing Frieza, stayed passive and got cornered", 1897 "promptEn": "facing Frieza, stayed passive and got cornered",
1778 - "lastPlayedAt": 1788252623220 1898 + "lastPlayedAt": 1788254619433,
  1899 + "playCount": 1
1779 }, 1900 },
1780 { 1901 {
1781 "id": "d680e111ade5", 1902 "id": "d680e111ade5",
@@ -1790,7 +1911,8 @@ @@ -1790,7 +1911,8 @@
1790 "likes": 0, 1911 "likes": 0,
1791 "createdAt": 1788005066484, 1912 "createdAt": 1788005066484,
1792 "promptEn": "Namek is about to be destroyed, the dragon ball wish still up for grabs", 1913 "promptEn": "Namek is about to be destroyed, the dragon ball wish still up for grabs",
1793 - "lastPlayedAt": 1788251174432 1914 + "lastPlayedAt": 1788255118176,
  1915 + "playCount": 1
1794 }, 1916 },
1795 { 1917 {
1796 "id": "565059763888", 1918 "id": "565059763888",
@@ -1820,7 +1942,8 @@ @@ -1820,7 +1942,8 @@
1820 "likes": 0, 1942 "likes": 0,
1821 "createdAt": 1788004590937, 1943 "createdAt": 1788004590937,
1822 "promptEn": "facing Mahito, held the goal but paid a price", 1944 "promptEn": "facing Mahito, held the goal but paid a price",
1823 - "lastPlayedAt": 1788253015358 1945 + "lastPlayedAt": 1788255308286,
  1946 + "playCount": 1
1824 }, 1947 },
1825 { 1948 {
1826 "id": "9996a8ac8326", 1949 "id": "9996a8ac8326",
@@ -1835,7 +1958,8 @@ @@ -1835,7 +1958,8 @@
1835 "likes": 0, 1958 "likes": 0,
1836 "createdAt": 1788004353928, 1959 "createdAt": 1788004353928,
1837 "promptEn": "facing Mahito, went in head-on and got seen through", 1960 "promptEn": "facing Mahito, went in head-on and got seen through",
1838 - "lastPlayedAt": 1788251822858 1961 + "lastPlayedAt": 1788256418748,
  1962 + "playCount": 1
1839 }, 1963 },
1840 { 1964 {
1841 "id": "971d80ec087c", 1965 "id": "971d80ec087c",
@@ -1850,7 +1974,8 @@ @@ -1850,7 +1974,8 @@
1850 "likes": 0, 1974 "likes": 0,
1851 "createdAt": 1788004115725, 1975 "createdAt": 1788004115725,
1852 "promptEn": "facing Mahito, stayed passive and got cornered", 1976 "promptEn": "facing Mahito, stayed passive and got cornered",
1853 - "lastPlayedAt": 1788252799252 1977 + "lastPlayedAt": 1788256356716,
  1978 + "playCount": 1
1854 }, 1979 },
1855 { 1980 {
1856 "id": "5dd52c568f66", 1981 "id": "5dd52c568f66",
@@ -1865,7 +1990,8 @@ @@ -1865,7 +1990,8 @@
1865 "likes": 0, 1990 "likes": 0,
1866 "createdAt": 1788004115612, 1991 "createdAt": 1788004115612,
1867 "promptEn": "facing Mahito, stayed passive and got cornered", 1992 "promptEn": "facing Mahito, stayed passive and got cornered",
1868 - "lastPlayedAt": 1788253899831 1993 + "lastPlayedAt": 1788256128678,
  1994 + "playCount": 1
1869 }, 1995 },
1870 { 1996 {
1871 "id": "f4a2870386c6", 1997 "id": "f4a2870386c6",
@@ -1925,7 +2051,8 @@ @@ -1925,7 +2051,8 @@
1925 "likes": 0, 2051 "likes": 0,
1926 "createdAt": 1788003166117, 2052 "createdAt": 1788003166117,
1927 "promptEn": "facing Enmu, stayed passive and got cornered", 2053 "promptEn": "facing Enmu, stayed passive and got cornered",
1928 - "lastPlayedAt": 1788252727219 2054 + "lastPlayedAt": 1788254595913,
  2055 + "playCount": 1
1929 }, 2056 },
1930 { 2057 {
1931 "id": "a3f39da74c1f", 2058 "id": "a3f39da74c1f",
@@ -1940,7 +2067,8 @@ @@ -1940,7 +2067,8 @@
1940 "likes": 0, 2067 "likes": 0,
1941 "createdAt": 1788002929455, 2068 "createdAt": 1788002929455,
1942 "promptEn": "facing Reiner, exploiting a flaw to counter him", 2069 "promptEn": "facing Reiner, exploiting a flaw to counter him",
1943 - "lastPlayedAt": 1788254288010 2070 + "lastPlayedAt": 1788255768521,
  2071 + "playCount": 1
1944 }, 2072 },
1945 { 2073 {
1946 "id": "ea8b38014674", 2074 "id": "ea8b38014674",
@@ -2000,7 +2128,8 @@ @@ -2000,7 +2128,8 @@
2000 "likes": 0, 2128 "likes": 0,
2001 "createdAt": 1788001981272, 2129 "createdAt": 1788001981272,
2002 "promptEn": "basement in Shiganshina, the titan secret weighing down on you", 2130 "promptEn": "basement in Shiganshina, the titan secret weighing down on you",
2003 - "lastPlayedAt": 1788252675244 2131 + "lastPlayedAt": 1788255694482,
  2132 + "playCount": 1
2004 }, 2133 },
2005 { 2134 {
2006 "id": "7c2351a27a96", 2135 "id": "7c2351a27a96",
@@ -2015,7 +2144,8 @@ @@ -2015,7 +2144,8 @@
2015 "likes": 0, 2144 "likes": 0,
2016 "createdAt": 1788001508988, 2145 "createdAt": 1788001508988,
2017 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain", 2146 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain",
2018 - "lastPlayedAt": 1788253801782 2147 + "lastPlayedAt": 1788255128181,
  2148 + "playCount": 1
2019 }, 2149 },
2020 { 2150 {
2021 "id": "79304c061606", 2151 "id": "79304c061606",
@@ -2045,7 +2175,8 @@ @@ -2045,7 +2175,8 @@
2045 "likes": 0, 2175 "likes": 0,
2046 "createdAt": 1788001285796, 2176 "createdAt": 1788001285796,
2047 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain", 2177 "promptEn": "in the ruins of Konoha, exploiting a flaw to counter Pain",
2048 - "lastPlayedAt": 1788253477606 2178 + "lastPlayedAt": 1788255410335,
  2179 + "playCount": 1
2049 }, 2180 },
2050 { 2181 {
2051 "id": "808e89ca06a4", 2182 "id": "808e89ca06a4",
@@ -2060,7 +2191,8 @@ @@ -2060,7 +2191,8 @@
2060 "likes": 0, 2191 "likes": 0,
2061 "createdAt": 1788001049233, 2192 "createdAt": 1788001049233,
2062 "promptEn": "facing Pain, held the goal but paid a price", 2193 "promptEn": "facing Pain, held the goal but paid a price",
2063 - "lastPlayedAt": 1788254115931 2194 + "lastPlayedAt": 1788255476364,
  2195 + "playCount": 1
2064 }, 2196 },
2065 { 2197 {
2066 "id": "7ecd480a3c31", 2198 "id": "7ecd480a3c31",
@@ -2090,7 +2222,8 @@ @@ -2090,7 +2222,8 @@
2090 "likes": 0, 2222 "likes": 0,
2091 "createdAt": 1788000577474, 2223 "createdAt": 1788000577474,
2092 "promptEn": "facing Pain, stayed passive and got cornered", 2224 "promptEn": "facing Pain, stayed passive and got cornered",
2093 - "lastPlayedAt": 1788253009344 2225 + "lastPlayedAt": 1788255208219,
  2226 + "playCount": 1
2094 }, 2227 },
2095 { 2228 {
2096 "id": "5ef9489bdc5b", 2229 "id": "5ef9489bdc5b",
@@ -2105,7 +2238,8 @@ @@ -2105,7 +2238,8 @@
2105 "likes": 0, 2238 "likes": 0,
2106 "createdAt": 1788000341927, 2239 "createdAt": 1788000341927,
2107 "promptEn": "Konoha destroyed by Shinra Tensei, Pain declaring order in the ruins", 2240 "promptEn": "Konoha destroyed by Shinra Tensei, Pain declaring order in the ruins",
2108 - "lastPlayedAt": 1788253434714 2241 + "lastPlayedAt": 1788255484369,
  2242 + "playCount": 1
2109 }, 2243 },
2110 { 2244 {
2111 "id": "e245dbcc6d36", 2245 "id": "e245dbcc6d36",
@@ -2120,7 +2254,8 @@ @@ -2120,7 +2254,8 @@
2120 "likes": 0, 2254 "likes": 0,
2121 "createdAt": 1788000105889, 2255 "createdAt": 1788000105889,
2122 "promptEn": "facing Sakazuki, exploiting a flaw to counter him", 2256 "promptEn": "facing Sakazuki, exploiting a flaw to counter him",
2123 - "lastPlayedAt": 1788253821783 2257 + "lastPlayedAt": 1788255314291,
  2258 + "playCount": 1
2124 }, 2259 },
2125 { 2260 {
2126 "id": "c9be7c07b793", 2261 "id": "c9be7c07b793",
@@ -2135,7 +2270,8 @@ @@ -2135,7 +2270,8 @@
2135 "likes": 0, 2270 "likes": 0,
2136 "createdAt": 1787999869694, 2271 "createdAt": 1787999869694,
2137 "promptEn": "facing Sakazuki, held the goal but paid a price", 2272 "promptEn": "facing Sakazuki, held the goal but paid a price",
2138 - "lastPlayedAt": 1788251688777 2273 + "lastPlayedAt": 1788255056146,
  2274 + "playCount": 1
2139 }, 2275 },
2140 { 2276 {
2141 "id": "677941e683c4", 2277 "id": "677941e683c4",
@@ -2150,7 +2286,8 @@ @@ -2150,7 +2286,8 @@
2150 "likes": 0, 2286 "likes": 0,
2151 "createdAt": 1787999633745, 2287 "createdAt": 1787999633745,
2152 "promptEn": "facing Sakazuki, went in head-on and got seen through", 2288 "promptEn": "facing Sakazuki, went in head-on and got seen through",
2153 - "lastPlayedAt": 1788251912902 2289 + "lastPlayedAt": 1788255042142,
  2290 + "playCount": 1
2154 }, 2291 },
2155 { 2292 {
2156 "id": "932d15f7f8bd", 2293 "id": "932d15f7f8bd",
@@ -2165,7 +2302,8 @@ @@ -2165,7 +2302,8 @@
2165 "likes": 0, 2302 "likes": 0,
2166 "createdAt": 1787999633670, 2303 "createdAt": 1787999633670,
2167 "promptEn": "facing Sakazuki, went in head-on and got seen through", 2304 "promptEn": "facing Sakazuki, went in head-on and got seen through",
2168 - "lastPlayedAt": 1788253777771 2305 + "lastPlayedAt": 1788255204217,
  2306 + "playCount": 1
2169 }, 2307 },
2170 { 2308 {
2171 "id": "a8b8b4430ee3", 2309 "id": "a8b8b4430ee3",
@@ -2195,7 +2333,8 @@ @@ -2195,7 +2333,8 @@
2195 "likes": 0, 2333 "likes": 0,
2196 "createdAt": 1787999161013, 2334 "createdAt": 1787999161013,
2197 "promptEn": "execution platform at Marineford, Ace about to be executed, navy vs pirates", 2335 "promptEn": "execution platform at Marineford, Ace about to be executed, navy vs pirates",
2198 - "lastPlayedAt": 1788253025350 2336 + "lastPlayedAt": 1788254924211,
  2337 + "playCount": 1
2199 }, 2338 },
2200 { 2339 {
2201 "id": "00476b62bf75", 2340 "id": "00476b62bf75",
@@ -2210,7 +2349,8 @@ @@ -2210,7 +2349,8 @@
2210 "likes": 0, 2349 "likes": 0,
2211 "createdAt": 1787903583872, 2350 "createdAt": 1787903583872,
2212 "promptEn": "constable asks if she's always been alone here, she doesn't answer", 2351 "promptEn": "constable asks if she's always been alone here, she doesn't answer",
2213 - "lastPlayedAt": 1788253047365 2352 + "lastPlayedAt": 1788255504379,
  2353 + "playCount": 1
2214 }, 2354 },
2215 { 2355 {
2216 "id": "2ab2094e5679", 2356 "id": "2ab2094e5679",
@@ -2240,7 +2380,8 @@ @@ -2240,7 +2380,8 @@
2240 "likes": 0, 2380 "likes": 0,
2241 "createdAt": 1787850191899, 2381 "createdAt": 1787850191899,
2242 "promptEn": "constable reaches out to touch her hand through the screen gap, no response", 2382 "promptEn": "constable reaches out to touch her hand through the screen gap, no response",
2243 - "lastPlayedAt": 1788251708784 2383 + "lastPlayedAt": 1788255918582,
  2384 + "playCount": 1
2244 }, 2385 },
2245 { 2386 {
2246 "id": "9bd8c9fbf1f6", 2387 "id": "9bd8c9fbf1f6",
@@ -2255,7 +2396,8 @@ @@ -2255,7 +2396,8 @@
2255 "likes": 0, 2396 "likes": 0,
2256 "createdAt": 1787847447661, 2397 "createdAt": 1787847447661,
2257 "promptEn": "constable tells the woman behind the screen he'll trust her tonight", 2398 "promptEn": "constable tells the woman behind the screen he'll trust her tonight",
2258 - "lastPlayedAt": 1788253581662 2399 + "lastPlayedAt": 1788256396733,
  2400 + "playCount": 1
2259 }, 2401 },
2260 { 2402 {
2261 "id": "8cb493338cb3", 2403 "id": "8cb493338cb3",
@@ -2285,7 +2427,8 @@ @@ -2285,7 +2427,8 @@
2285 "likes": 0, 2427 "likes": 0,
2286 "createdAt": 1787762342686, 2428 "createdAt": 1787762342686,
2287 "promptEn": "woman tells him from behind the screen to go check outside, he steps out warily", 2429 "promptEn": "woman tells him from behind the screen to go check outside, he steps out warily",
2288 - "lastPlayedAt": 1788250091902 2430 + "lastPlayedAt": 1788255062148,
  2431 + "playCount": 1
2289 }, 2432 },
2290 { 2433 {
2291 "id": "47a6de809c61", 2434 "id": "47a6de809c61",
@@ -2300,7 +2443,8 @@ @@ -2300,7 +2443,8 @@
2300 "likes": 0, 2443 "likes": 0,
2301 "createdAt": 1787762332289, 2444 "createdAt": 1787762332289,
2302 "promptEn": "woman behind the screen stirs and softly reassures him", 2445 "promptEn": "woman behind the screen stirs and softly reassures him",
2303 - "lastPlayedAt": 1788251932913 2446 + "lastPlayedAt": 1788255220228,
  2447 + "playCount": 1
2304 }, 2448 },
2305 { 2449 {
2306 "id": "0abf6e529c92", 2450 "id": "0abf6e529c92",
@@ -2330,7 +2474,8 @@ @@ -2330,7 +2474,8 @@
2330 "likes": 0, 2474 "likes": 0,
2331 "createdAt": 1787762286261, 2475 "createdAt": 1787762286261,
2332 "promptEn": "constable stares at her through the screen, silent, saying nothing", 2476 "promptEn": "constable stares at her through the screen, silent, saying nothing",
2333 - "lastPlayedAt": 1788251618745 2477 + "lastPlayedAt": 1788256182461,
  2478 + "playCount": 1
2334 }, 2479 },
2335 { 2480 {
2336 "id": "59711a102e84", 2481 "id": "59711a102e84",
@@ -2345,7 +2490,8 @@ @@ -2345,7 +2490,8 @@
2345 "likes": 0, 2490 "likes": 0,
2346 "createdAt": 1787762224218, 2491 "createdAt": 1787762224218,
2347 "promptEn": "constable stands under the lamp, holding her gaze through the screen, not backing away", 2492 "promptEn": "constable stands under the lamp, holding her gaze through the screen, not backing away",
2348 - "lastPlayedAt": 1788253631690 2493 + "lastPlayedAt": 1788254940098,
  2494 + "playCount": 1
2349 }, 2495 },
2350 { 2496 {
2351 "id": "f2e70205766b", 2497 "id": "f2e70205766b",
@@ -2375,7 +2521,8 @@ @@ -2375,7 +2521,8 @@
2375 "likes": 0, 2521 "likes": 0,
2376 "createdAt": 1787730413689, 2522 "createdAt": 1787730413689,
2377 "promptEn": "constable grabs the oil lamp and hurls it at the portrait, the scroll catches fire", 2523 "promptEn": "constable grabs the oil lamp and hurls it at the portrait, the scroll catches fire",
2378 - "lastPlayedAt": 1788253556971 2524 + "lastPlayedAt": 1788255020134,
  2525 + "playCount": 1
2379 }, 2526 },
2380 { 2527 {
2381 "id": "e6c23c6adc42", 2528 "id": "e6c23c6adc42",
@@ -2405,7 +2552,8 @@ @@ -2405,7 +2552,8 @@
2405 "likes": 0, 2552 "likes": 0,
2406 "createdAt": 1787730331663, 2553 "createdAt": 1787730331663,
2407 "promptEn": "constable steps in from the rainy night, spots her, introduces himself with a cover story", 2554 "promptEn": "constable steps in from the rainy night, spots her, introduces himself with a cover story",
2408 - "lastPlayedAt": 1788253781772 2555 + "lastPlayedAt": 1788256000614,
  2556 + "playCount": 1
2409 }, 2557 },
2410 { 2558 {
2411 "id": "84e8337de242", 2559 "id": "84e8337de242",
@@ -2420,7 +2568,8 @@ @@ -2420,7 +2568,8 @@
2420 "likes": 0, 2568 "likes": 0,
2421 "createdAt": 1787724313620, 2569 "createdAt": 1787724313620,
2422 "promptEn": "first-person view bursting into the room, glancing back in fear, the woman startled", 2570 "promptEn": "first-person view bursting into the room, glancing back in fear, the woman startled",
2423 - "lastPlayedAt": 1788252843270 2571 + "lastPlayedAt": 1788254753999,
  2572 + "playCount": 1
2424 }, 2573 },
2425 { 2574 {
2426 "id": "81b6c3789111", 2575 "id": "81b6c3789111",
@@ -2435,7 +2584,8 @@ @@ -2435,7 +2584,8 @@
2435 "likes": 0, 2584 "likes": 0,
2436 "createdAt": 1787708713767, 2585 "createdAt": 1787708713767,
2437 "promptEn": "constable stops looking around, turns to face the screen, speaks to her silhouette", 2586 "promptEn": "constable stops looking around, turns to face the screen, speaks to her silhouette",
2438 - "lastPlayedAt": 1788254322029 2587 + "lastPlayedAt": 1788255720502,
  2588 + "playCount": 1
2439 }, 2589 },
2440 { 2590 {
2441 "id": "5dc95a15cd5d", 2591 "id": "5dc95a15cd5d",
@@ -2450,7 +2600,8 @@ @@ -2450,7 +2600,8 @@
2450 "likes": 0, 2600 "likes": 0,
2451 "createdAt": 1787708701547, 2601 "createdAt": 1787708701547,
2452 "promptEn": "constable gently tells her he'll stay and keep her company", 2602 "promptEn": "constable gently tells her he'll stay and keep her company",
2453 - "lastPlayedAt": 1788252873286 2603 + "lastPlayedAt": 1788255778520,
  2604 + "playCount": 1
2454 }, 2605 },
2455 { 2606 {
2456 "id": "8d9c1dad041f", 2607 "id": "8d9c1dad041f",
@@ -2480,7 +2631,8 @@ @@ -2480,7 +2631,8 @@
2480 "likes": 0, 2631 "likes": 0,
2481 "createdAt": 1787708684658, 2632 "createdAt": 1787708684658,
2482 "promptEn": "constable sees her silent gesture, lets go of his sword hilt, steps closer and agrees", 2633 "promptEn": "constable sees her silent gesture, lets go of his sword hilt, steps closer and agrees",
2483 - "lastPlayedAt": 1788251970926 2634 + "lastPlayedAt": 1788254641958,
  2635 + "playCount": 1
2484 }, 2636 },
2485 { 2637 {
2486 "id": "abdbe25f3121", 2638 "id": "abdbe25f3121",
@@ -2495,7 +2647,8 @@ @@ -2495,7 +2647,8 @@
2495 "likes": 0, 2647 "likes": 0,
2496 "createdAt": 1787708674508, 2648 "createdAt": 1787708674508,
2497 "promptEn": "constable sees through her painted disguise and rips her face off, revealing a demonic visage underneath", 2649 "promptEn": "constable sees through her painted disguise and rips her face off, revealing a demonic visage underneath",
2498 - "lastPlayedAt": 1788252661239 2650 + "lastPlayedAt": 1788254693983,
  2651 + "playCount": 1
2499 }, 2652 },
2500 { 2653 {
2501 "id": "6d433dcc104c", 2654 "id": "6d433dcc104c",
@@ -2510,7 +2663,8 @@ @@ -2510,7 +2663,8 @@
2510 "likes": 0, 2663 "likes": 0,
2511 "createdAt": 1787708663418, 2664 "createdAt": 1787708663418,
2512 "promptEn": "constable catches his breath, thanks her, and rests on the couch while she watches", 2665 "promptEn": "constable catches his breath, thanks her, and rests on the couch while she watches",
2513 - "lastPlayedAt": 1788253353548 2666 + "lastPlayedAt": 1788256266678,
  2667 + "playCount": 1
2514 }, 2668 },
2515 { 2669 {
2516 "id": "cd22c2b491fc", 2670 "id": "cd22c2b491fc",
@@ -2540,7 +2694,8 @@ @@ -2540,7 +2694,8 @@
2540 "likes": 0, 2694 "likes": 0,
2541 "createdAt": 1787708648409, 2695 "createdAt": 1787708648409,
2542 "promptEn": "she reaches a hand through the screen gap beckoning him, he steps back and firmly refuses", 2696 "promptEn": "she reaches a hand through the screen gap beckoning him, he steps back and firmly refuses",
2543 - "lastPlayedAt": 1788254125936 2697 + "lastPlayedAt": 1788256362719,
  2698 + "playCount": 1
2544 }, 2699 },
2545 { 2700 {
2546 "id": "3f0c28f5373a", 2701 "id": "3f0c28f5373a",
@@ -2555,7 +2710,8 @@ @@ -2555,7 +2710,8 @@
2555 "likes": 0, 2710 "likes": 0,
2556 "createdAt": 1787708646888, 2711 "createdAt": 1787708646888,
2557 "promptEn": "constable studies her through the screen growing suspicious, hand drifting to his sword", 2712 "promptEn": "constable studies her through the screen growing suspicious, hand drifting to his sword",
2558 - "lastPlayedAt": 1788253697730 2713 + "lastPlayedAt": 1788255522386,
  2714 + "playCount": 1
2559 }, 2715 },
2560 { 2716 {
2561 "id": "1c0c203cfb3b", 2717 "id": "1c0c203cfb3b",
@@ -2570,7 +2726,8 @@ @@ -2570,7 +2726,8 @@
2570 "likes": 0, 2726 "likes": 0,
2571 "createdAt": 1787708641782, 2727 "createdAt": 1787708641782,
2572 "promptEn": "constable sits down at the table, studying her expression through the screen", 2728 "promptEn": "constable sits down at the table, studying her expression through the screen",
2573 - "lastPlayedAt": 1788252435140 2729 + "lastPlayedAt": 1788255934591,
  2730 + "playCount": 1
2574 }, 2731 },
2575 { 2732 {
2576 "id": "89975be9def4", 2733 "id": "89975be9def4",
@@ -2585,7 +2742,8 @@ @@ -2585,7 +2742,8 @@
2585 "likes": 0, 2742 "likes": 0,
2586 "createdAt": 1787708626228, 2743 "createdAt": 1787708626228,
2587 "promptEn": "constable drinks some water first, thanks her, watching the screen warily as he drinks", 2744 "promptEn": "constable drinks some water first, thanks her, watching the screen warily as he drinks",
2588 - "lastPlayedAt": 1788253265514 2745 + "lastPlayedAt": 1788254986119,
  2746 + "playCount": 1
2589 }, 2747 },
2590 { 2748 {
2591 "id": "e08f7f7e54dd", 2749 "id": "e08f7f7e54dd",
@@ -2600,7 +2758,8 @@ @@ -2600,7 +2758,8 @@
2600 "likes": 0, 2758 "likes": 0,
2601 "createdAt": 1787708622306, 2759 "createdAt": 1787708622306,
2602 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod", 2760 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod",
2603 - "lastPlayedAt": 1788250263997 2761 + "lastPlayedAt": 1788256382726,
  2762 + "playCount": 1
2604 }, 2763 },
2605 { 2764 {
2606 "id": "538dc7e5746f", 2765 "id": "538dc7e5746f",
@@ -2615,7 +2774,8 @@ @@ -2615,7 +2774,8 @@
2615 "likes": 0, 2774 "likes": 0,
2616 "createdAt": 1787708622178, 2775 "createdAt": 1787708622178,
2617 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod", 2776 "promptEn": "constable gives a clasped-hand salute and thanks her, she gives a subtle nod",
2618 - "lastPlayedAt": 1788253057370 2777 + "lastPlayedAt": 1788256532860,
  2778 + "playCount": 1
2619 }, 2779 },
2620 { 2780 {
2621 "id": "1721c75dbc3b", 2781 "id": "1721c75dbc3b",
@@ -2630,7 +2790,8 @@ @@ -2630,7 +2790,8 @@
2630 "likes": 0, 2790 "likes": 0,
2631 "createdAt": 1787708615415, 2791 "createdAt": 1787708615415,
2632 "promptEn": "she slides her hand through the screen gap asking him to warm it, he hesitates without touching", 2792 "promptEn": "she slides her hand through the screen gap asking him to warm it, he hesitates without touching",
2633 - "lastPlayedAt": 1788252911303 2793 + "lastPlayedAt": 1788254789321,
  2794 + "playCount": 1
2634 }, 2795 },
2635 { 2796 {
2636 "id": "c2b145b111e2", 2797 "id": "c2b145b111e2",
@@ -2645,7 +2806,8 @@ @@ -2645,7 +2806,8 @@
2645 "likes": 0, 2806 "likes": 0,
2646 "createdAt": 1787708613364, 2807 "createdAt": 1787708613364,
2647 "promptEn": "constable steps in, notices her behind the screen, greets her, she just watches silently", 2808 "promptEn": "constable steps in, notices her behind the screen, greets her, she just watches silently",
2648 - "lastPlayedAt": 1788252945316 2809 + "lastPlayedAt": 1788254723988,
  2810 + "playCount": 1
2649 }, 2811 },
2650 { 2812 {
2651 "id": "a5d5d353bbf8", 2813 "id": "a5d5d353bbf8",
@@ -2660,7 +2822,8 @@ @@ -2660,7 +2822,8 @@
2660 "likes": 0, 2822 "likes": 0,
2661 "createdAt": 1787674768144, 2823 "createdAt": 1787674768144,
2662 "promptEn": "constable lifts a bronze mirror, reflecting candlelight onto the portrait on the wall", 2824 "promptEn": "constable lifts a bronze mirror, reflecting candlelight onto the portrait on the wall",
2663 - "lastPlayedAt": 1788251856874 2825 + "lastPlayedAt": 1788255968600,
  2826 + "playCount": 1
2664 }, 2827 },
2665 { 2828 {
2666 "id": "3be1f275fde2", 2829 "id": "3be1f275fde2",
@@ -2675,7 +2838,8 @@ @@ -2675,7 +2838,8 @@
2675 "likes": 0, 2838 "likes": 0,
2676 "createdAt": 1787674743188, 2839 "createdAt": 1787674743188,
2677 "promptEn": "constable draws his sword and breaks the sealed talisman on the screen, revealing her behind it", 2840 "promptEn": "constable draws his sword and breaks the sealed talisman on the screen, revealing her behind it",
2678 - "lastPlayedAt": 1788252539184 2841 + "lastPlayedAt": 1788255174203,
  2842 + "playCount": 1
2679 }, 2843 },
2680 { 2844 {
2681 "id": "693e0b9ca66a", 2845 "id": "693e0b9ca66a",
@@ -2705,7 +2869,8 @@ @@ -2705,7 +2869,8 @@
2705 "likes": 0, 2869 "likes": 0,
2706 "createdAt": 1787674716075, 2870 "createdAt": 1787674716075,
2707 "promptEn": "constable watches the oil lamp flame flicker, her silhouette motionless behind the screen", 2871 "promptEn": "constable watches the oil lamp flame flicker, her silhouette motionless behind the screen",
2708 - "lastPlayedAt": 1788251352521 2872 + "lastPlayedAt": 1788255706491,
  2873 + "playCount": 1
2709 }, 2874 },
2710 { 2875 {
2711 "id": "23d1ae1982e6", 2876 "id": "23d1ae1982e6",
@@ -2720,7 +2885,8 @@ @@ -2720,7 +2885,8 @@
2720 "likes": 0, 2885 "likes": 0,
2721 "createdAt": 1787674713724, 2886 "createdAt": 1787674713724,
2722 "promptEn": "constable enters and cautiously looks around, his gaze settling on her silhouette behind the screen", 2887 "promptEn": "constable enters and cautiously looks around, his gaze settling on her silhouette behind the screen",
2723 - "lastPlayedAt": 1788252056963 2888 + "lastPlayedAt": 1788254882052,
  2889 + "playCount": 1
2724 }, 2890 },
2725 { 2891 {
2726 "id": "b69389094416", 2892 "id": "b69389094416",
@@ -2735,7 +2901,8 @@ @@ -2735,7 +2901,8 @@
2735 "likes": 0, 2901 "likes": 0,
2736 "createdAt": 1787674695703, 2902 "createdAt": 1787674695703,
2737 "promptEn": "constable stops, faces the screen, quietly promises to keep his voice down", 2903 "promptEn": "constable stops, faces the screen, quietly promises to keep his voice down",
2738 - "lastPlayedAt": 1788252743222 2904 + "lastPlayedAt": 1788254661960,
  2905 + "playCount": 1
2739 }, 2906 },
2740 { 2907 {
2741 "id": "94dc455e26bf", 2908 "id": "94dc455e26bf",
@@ -2750,7 +2917,8 @@ @@ -2750,7 +2917,8 @@
2750 "likes": 0, 2917 "likes": 0,
2751 "createdAt": 1787674688717, 2918 "createdAt": 1787674688717,
2752 "promptEn": "constable agrees to stay, lets his guard down, she gives a barely-there nod", 2919 "promptEn": "constable agrees to stay, lets his guard down, she gives a barely-there nod",
2753 - "lastPlayedAt": 1788254161950 2920 + "lastPlayedAt": 1788256144453,
  2921 + "playCount": 1
2754 }, 2922 },
2755 { 2923 {
2756 "id": "4874fe3fdbc9", 2924 "id": "4874fe3fdbc9",
@@ -2780,7 +2948,8 @@ @@ -2780,7 +2948,8 @@
2780 "likes": 0, 2948 "likes": 0,
2781 "createdAt": 1787674642139, 2949 "createdAt": 1787674642139,
2782 "promptEn": "constable forms hand seals and summons a giant toad out of smoke", 2950 "promptEn": "constable forms hand seals and summons a giant toad out of smoke",
2783 - "lastPlayedAt": 1788254251995 2951 + "lastPlayedAt": 1788256216659,
  2952 + "playCount": 1
2784 }, 2953 },
2785 { 2954 {
2786 "id": "e9a6320e18a9", 2955 "id": "e9a6320e18a9",
@@ -2810,7 +2979,8 @@ @@ -2810,7 +2979,8 @@
2810 "likes": 0, 2979 "likes": 0,
2811 "createdAt": 1787674639055, 2980 "createdAt": 1787674639055,
2812 "promptEn": "constable checks his reflection in the mirror, sees her behind his shoulder in it, turns around to find the screen empty", 2981 "promptEn": "constable checks his reflection in the mirror, sees her behind his shoulder in it, turns around to find the screen empty",
2813 - "lastPlayedAt": 1788253073377 2982 + "lastPlayedAt": 1788255000140,
  2983 + "playCount": 1
2814 }, 2984 },
2815 { 2985 {
2816 "id": "ebaf0dde3d9f", 2986 "id": "ebaf0dde3d9f",
@@ -2825,7 +2995,8 @@ @@ -2825,7 +2995,8 @@
2825 "likes": 0, 2995 "likes": 0,
2826 "createdAt": 1787674623678, 2996 "createdAt": 1787674623678,
2827 "promptEn": "constable bows to the screen, thanking her for sheltering him", 2997 "promptEn": "constable bows to the screen, thanking her for sheltering him",
2828 - "lastPlayedAt": 1788253536965 2998 + "lastPlayedAt": 1788254739995,
  2999 + "playCount": 1
2829 }, 3000 },
2830 { 3001 {
2831 "id": "d94991a1e21b", 3002 "id": "d94991a1e21b",
@@ -2840,7 +3011,8 @@ @@ -2840,7 +3011,8 @@
2840 "likes": 0, 3011 "likes": 0,
2841 "createdAt": 1787674609636, 3012 "createdAt": 1787674609636,
2842 "promptEn": "constable silently watches her through the screen gaps, camera slowly zooming in on her face", 3013 "promptEn": "constable silently watches her through the screen gaps, camera slowly zooming in on her face",
2843 - "lastPlayedAt": 1788253983858 3014 + "lastPlayedAt": 1788256196466,
  3015 + "playCount": 1
2844 }, 3016 },
2845 { 3017 {
2846 "id": "5e53f7f5fe9b", 3018 "id": "5e53f7f5fe9b",
@@ -2855,7 +3027,8 @@ @@ -2855,7 +3027,8 @@
2855 "likes": 0, 3027 "likes": 0,
2856 "createdAt": 1787674446841, 3028 "createdAt": 1787674446841,
2857 "promptEn": "player panics into the room, glances back, out of breath, says something's chasing him outside", 3029 "promptEn": "player panics into the room, glances back, out of breath, says something's chasing him outside",
2858 - "lastPlayedAt": 1788254185961 3030 + "lastPlayedAt": 1788256062650,
  3031 + "playCount": 1
2859 }, 3032 },
2860 { 3033 {
2861 "id": "c25d53a5e086", 3034 "id": "c25d53a5e086",
@@ -2885,7 +3058,8 @@ @@ -2885,7 +3058,8 @@
2885 "likes": 0, 3058 "likes": 0,
2886 "createdAt": 1787674361187, 3059 "createdAt": 1787674361187,
2887 "promptEn": "constable presses his hand to his chest, vowing his heart to her, she gives a knowing smile", 3060 "promptEn": "constable presses his hand to his chest, vowing his heart to her, she gives a knowing smile",
2888 - "lastPlayedAt": 1788252451148 3061 + "lastPlayedAt": 1788254774002,
  3062 + "playCount": 1
2889 }, 3063 },
2890 { 3064 {
2891 "id": "8aba0a6bf05b", 3065 "id": "8aba0a6bf05b",
@@ -2900,7 +3074,8 @@ @@ -2900,7 +3074,8 @@
2900 "likes": 0, 3074 "likes": 0,
2901 "createdAt": 1787674351536, 3075 "createdAt": 1787674351536,
2902 "promptEn": "constable searches an old house at night, candle flickering, woman hiding behind the screen", 3076 "promptEn": "constable searches an old house at night, candle flickering, woman hiding behind the screen",
2903 - "lastPlayedAt": 1788253615680 3077 + "lastPlayedAt": 1788255680474,
  3078 + "playCount": 1
2904 }, 3079 },
2905 { 3080 {
2906 "id": "dc13e4f165dc", 3081 "id": "dc13e4f165dc",
@@ -2930,7 +3105,8 @@ @@ -2930,7 +3105,8 @@
2930 "likes": 0, 3105 "likes": 0,
2931 "createdAt": 1787665100787, 3106 "createdAt": 1787665100787,
2932 "promptEn": "constable politely asks the woman behind the screen for tea", 3107 "promptEn": "constable politely asks the woman behind the screen for tea",
2933 - "lastPlayedAt": 1788253439598 3108 + "lastPlayedAt": 1788254709984,
  3109 + "playCount": 1
2934 }, 3110 },
2935 { 3111 {
2936 "id": "d2c77b87b84b", 3112 "id": "d2c77b87b84b",
@@ -2960,7 +3136,8 @@ @@ -2960,7 +3136,8 @@
2960 "likes": 0, 3136 "likes": 0,
2961 "createdAt": 1787642579766, 3137 "createdAt": 1787642579766,
2962 "promptEn": "a summoner chants and calls a giant toad, which swallows the white-robed ghost whole", 3138 "promptEn": "a summoner chants and calls a giant toad, which swallows the white-robed ghost whole",
2963 - "lastPlayedAt": 1788253597668 3139 + "lastPlayedAt": 1788256502800,
  3140 + "playCount": 1
2964 }, 3141 },
2965 { 3142 {
2966 "id": "22a666455198", 3143 "id": "22a666455198",
@@ -2989,8 +3166,9 @@ @@ -2989,8 +3166,9 @@
2989 "partition": "ref2va", 3166 "partition": "ref2va",
2990 "likes": 0, 3167 "likes": 0,
2991 "createdAt": 1787639957338, 3168 "createdAt": 1787639957338,
2992 - "lastPlayedAt": 1788251344514,  
2993 - "promptEn": "constable talking to the woman through the screen" 3169 + "lastPlayedAt": 1788254613432,
  3170 + "promptEn": "constable talking to the woman through the screen",
  3171 + "playCount": 1
2994 }, 3172 },
2995 { 3173 {
2996 "id": "9f9638cb5b62", 3174 "id": "9f9638cb5b62",
@@ -3020,7 +3198,8 @@ @@ -3020,7 +3198,8 @@
3020 "likes": 0, 3198 "likes": 0,
3021 "createdAt": 1787635935502, 3199 "createdAt": 1787635935502,
3022 "promptEn": "constable bursts in panicked, spots the woman behind the screen", 3200 "promptEn": "constable bursts in panicked, spots the woman behind the screen",
3023 - "lastPlayedAt": 1788250520137 3201 + "lastPlayedAt": 1788255092168,
  3202 + "playCount": 1
3024 }, 3203 },
3025 { 3204 {
3026 "id": "b32769bf80db", 3205 "id": "b32769bf80db",
@@ -3035,7 +3214,8 @@ @@ -3035,7 +3214,8 @@
3035 "likes": 0, 3214 "likes": 0,
3036 "createdAt": 1787632587351, 3215 "createdAt": 1787632587351,
3037 "promptEn": "constable bursts in panicked, spots the woman behind the screen", 3216 "promptEn": "constable bursts in panicked, spots the woman behind the screen",
3038 - "lastPlayedAt": 1788250612184 3217 + "lastPlayedAt": 1788255382318,
  3218 + "playCount": 1
3039 }, 3219 },
3040 { 3220 {
3041 "id": "282281777d1b", 3221 "id": "282281777d1b",
@@ -3050,7 +3230,8 @@ @@ -3050,7 +3230,8 @@
3050 "likes": 0, 3230 "likes": 0,
3051 "createdAt": 1787615243753, 3231 "createdAt": 1787615243753,
3052 "promptEn": "robot arm picks up a red block and puts it down", 3232 "promptEn": "robot arm picks up a red block and puts it down",
3053 - "lastPlayedAt": 1788251258468 3233 + "lastPlayedAt": 1788254681970,
  3234 + "playCount": 1
3054 }, 3235 },
3055 { 3236 {
3056 "id": "d040eec16a88", 3237 "id": "d040eec16a88",
@@ -3065,7 +3246,8 @@ @@ -3065,7 +3246,8 @@
3065 "likes": 0, 3246 "likes": 0,
3066 "createdAt": 1787615242602, 3247 "createdAt": 1787615242602,
3067 "promptEn": "otome game male lead showcase PV", 3248 "promptEn": "otome game male lead showcase PV",
3068 - "lastPlayedAt": 1788251108401 3249 + "lastPlayedAt": 1788256248669,
  3250 + "playCount": 1
3069 }, 3251 },
3070 { 3252 {
3071 "id": "423a20afba5a", 3253 "id": "423a20afba5a",
@@ -3080,7 +3262,8 @@ @@ -3080,7 +3262,8 @@
3080 "likes": 0, 3262 "likes": 0,
3081 "createdAt": 1787615241814, 3263 "createdAt": 1787615241814,
3082 "promptEn": "xianxia character turning, only back and side profile shown", 3264 "promptEn": "xianxia character turning, only back and side profile shown",
3083 - "lastPlayedAt": 1788253329541 3265 + "lastPlayedAt": 1788256310695,
  3266 + "playCount": 1
3084 }, 3267 },
3085 { 3268 {
3086 "id": "1a398591663e", 3269 "id": "1a398591663e",
@@ -3155,7 +3338,8 @@ @@ -3155,7 +3338,8 @@
3155 "likes": 0, 3338 "likes": 0,
3156 "createdAt": 1787588545243, 3339 "createdAt": 1787588545243,
3157 "promptEn": "ergonomic office chair 360 showcase ad", 3340 "promptEn": "ergonomic office chair 360 showcase ad",
3158 - "lastPlayedAt": 1788253031360 3341 + "lastPlayedAt": 1788256232664,
  3342 + "playCount": 1
3159 }, 3343 },
3160 { 3344 {
3161 "id": "b0d258352c3c", 3345 "id": "b0d258352c3c",
@@ -3170,7 +3354,8 @@ @@ -3170,7 +3354,8 @@
3170 "likes": 0, 3354 "likes": 0,
3171 "createdAt": 1787588544667, 3355 "createdAt": 1787588544667,
3172 "promptEn": "white studio shoot, two models wearing futuristic glasses", 3356 "promptEn": "white studio shoot, two models wearing futuristic glasses",
3173 - "lastPlayedAt": 1788248729194 3357 + "lastPlayedAt": 1788255666469,
  3358 + "playCount": 1
3174 }, 3359 },
3175 { 3360 {
3176 "id": "71a4d093aebc", 3361 "id": "71a4d093aebc",
@@ -3215,7 +3400,8 @@ @@ -3215,7 +3400,8 @@
3215 "likes": 0, 3400 "likes": 0,
3216 "createdAt": 1787588542968, 3401 "createdAt": 1787588542968,
3217 "promptEn": "mystery crime title sequence, collage split-screen credits", 3402 "promptEn": "mystery crime title sequence, collage split-screen credits",
3218 - "lastPlayedAt": 1788251444607 3403 + "lastPlayedAt": 1788255236243,
  3404 + "playCount": 1
3219 }, 3405 },
3220 { 3406 {
3221 "id": "67ababbea78f", 3407 "id": "67ababbea78f",
@@ -3230,7 +3416,8 @@ @@ -3230,7 +3416,8 @@
3230 "likes": 0, 3416 "likes": 0,
3231 "createdAt": 1787588542426, 3417 "createdAt": 1787588542426,
3232 "promptEn": "fashion guy in sunglasses and coat by a fire", 3418 "promptEn": "fashion guy in sunglasses and coat by a fire",
3233 - "lastPlayedAt": 1788250364064 3419 + "lastPlayedAt": 1788255510380,
  3420 + "playCount": 1
3234 }, 3421 },
3235 { 3422 {
3236 "id": "c1237b599bf4", 3423 "id": "c1237b599bf4",
@@ -3260,7 +3447,8 @@ @@ -3260,7 +3447,8 @@
3260 "likes": 0, 3447 "likes": 0,
3261 "createdAt": 1787588541164, 3448 "createdAt": 1787588541164,
3262 "promptEn": "tiny silhouette before a huge cosmic gate, title fades in", 3449 "promptEn": "tiny silhouette before a huge cosmic gate, title fades in",
3263 - "lastPlayedAt": 1788252110986 3450 + "lastPlayedAt": 1788255982612,
  3451 + "playCount": 1
3264 }, 3452 },
3265 { 3453 {
3266 "id": "5cc09dcdf470", 3454 "id": "5cc09dcdf470",
@@ -3275,7 +3463,8 @@ @@ -3275,7 +3463,8 @@
3275 "likes": 0, 3463 "likes": 0,
3276 "createdAt": 1787588540642, 3464 "createdAt": 1787588540642,
3277 "promptEn": "telescope view searching for a MiniMax device, fashionable passerby", 3465 "promptEn": "telescope view searching for a MiniMax device, fashionable passerby",
3278 - "lastPlayedAt": 1788250804249 3466 + "lastPlayedAt": 1788256452766,
  3467 + "playCount": 1
3279 }, 3468 },
3280 { 3469 {
3281 "id": "a59cae01ec39", 3470 "id": "a59cae01ec39",
@@ -3290,7 +3479,8 @@ @@ -3290,7 +3479,8 @@
3290 "likes": 0, 3479 "likes": 0,
3291 "createdAt": 1787588540567, 3480 "createdAt": 1787588540567,
3292 "promptEn": "telescope view searching for a MiniMax device", 3481 "promptEn": "telescope view searching for a MiniMax device",
3293 - "lastPlayedAt": 1788253197469 3482 + "lastPlayedAt": 1788254623432,
  3483 + "playCount": 1
3294 }, 3484 },
3295 { 3485 {
3296 "id": "ba8c0758e5b4", 3486 "id": "ba8c0758e5b4",
@@ -3320,7 +3510,8 @@ @@ -3320,7 +3510,8 @@
3320 "likes": 0, 3510 "likes": 0,
3321 "createdAt": 1787577878370, 3511 "createdAt": 1787577878370,
3322 "promptEn": "man barges into the old house apologizing, woman in white behind the screen", 3512 "promptEn": "man barges into the old house apologizing, woman in white behind the screen",
3323 - "lastPlayedAt": 1788253661702 3513 + "lastPlayedAt": 1788255748510,
  3514 + "playCount": 1
3324 }, 3515 },
3325 { 3516 {
3326 "id": "0e75ef71c3d0", 3517 "id": "0e75ef71c3d0",
@@ -3335,7 +3526,8 @@ @@ -3335,7 +3526,8 @@
3335 "likes": 0, 3526 "likes": 0,
3336 "createdAt": 1787577088842, 3527 "createdAt": 1787577088842,
3337 "promptEn": "man thanks the woman for taking him in, behind the screen", 3528 "promptEn": "man thanks the woman for taking him in, behind the screen",
3338 - "lastPlayedAt": 1788252705203 3529 + "lastPlayedAt": 1788256134682,
  3530 + "playCount": 1
3339 }, 3531 },
3340 { 3532 {
3341 "id": "e656777b6eef", 3533 "id": "e656777b6eef",
@@ -3350,7 +3542,8 @@ @@ -3350,7 +3542,8 @@
3350 "likes": 0, 3542 "likes": 0,
3351 "createdAt": 1787577088778, 3543 "createdAt": 1787577088778,
3352 "promptEn": "man thanks the woman for taking him in", 3544 "promptEn": "man thanks the woman for taking him in",
3353 - "lastPlayedAt": 1788253473612 3545 + "lastPlayedAt": 1788255122181,
  3546 + "playCount": 1
3354 }, 3547 },
3355 { 3548 {
3356 "id": "8d0270466c35", 3549 "id": "8d0270466c35",
@@ -3365,7 +3558,8 @@ @@ -3365,7 +3558,8 @@
3365 "likes": 0, 3558 "likes": 0,
3366 "createdAt": 1787576943673, 3559 "createdAt": 1787576943673,
3367 "promptEn": "man lowers his voice like she said, checks the door, window and lamp", 3560 "promptEn": "man lowers his voice like she said, checks the door, window and lamp",
3368 - "lastPlayedAt": 1788253482789 3561 + "lastPlayedAt": 1788255386322,
  3562 + "playCount": 1
3369 }, 3563 },
3370 { 3564 {
3371 "id": "396de15c1439", 3565 "id": "396de15c1439",
@@ -3410,7 +3604,8 @@ @@ -3410,7 +3604,8 @@
3410 "likes": 0, 3604 "likes": 0,
3411 "createdAt": 1787576651668, 3605 "createdAt": 1787576651668,
3412 "promptEn": "man silently looks at her, doesn't respond", 3606 "promptEn": "man silently looks at her, doesn't respond",
3413 - "lastPlayedAt": 1788251536684 3607 + "lastPlayedAt": 1788256326705,
  3608 + "playCount": 1
3414 }, 3609 },
3415 { 3610 {
3416 "id": "5958b86ab8f4", 3611 "id": "5958b86ab8f4",
@@ -3424,8 +3619,9 @@ @@ -3424,8 +3619,9 @@
3424 "partition": "text", 3619 "partition": "text",
3425 "likes": 0, 3620 "likes": 0,
3426 "createdAt": 1787576506447, 3621 "createdAt": 1787576506447,
3427 - "lastPlayedAt": 1788250053889,  
3428 - "promptEn": "man does as she says but stays on guard" 3622 + "lastPlayedAt": 1788256244668,
  3623 + "promptEn": "man does as she says but stays on guard",
  3624 + "playCount": 1
3429 }, 3625 },
3430 { 3626 {
3431 "id": "dd69b54fb2ce", 3627 "id": "dd69b54fb2ce",
@@ -3500,7 +3696,8 @@ @@ -3500,7 +3696,8 @@
3500 "likes": 0, 3696 "likes": 0,
3501 "createdAt": 1787575164766, 3697 "createdAt": 1787575164766,
3502 "promptEn": "man apologizes, says something outside was chasing him", 3698 "promptEn": "man apologizes, says something outside was chasing him",
3503 - "lastPlayedAt": 1788251998941 3699 + "lastPlayedAt": 1788255420339,
  3700 + "playCount": 1
3504 }, 3701 },
3505 { 3702 {
3506 "id": "fb3000701384", 3703 "id": "fb3000701384",
@@ -3515,7 +3712,8 @@ @@ -3515,7 +3712,8 @@
3515 "likes": 0, 3712 "likes": 0,
3516 "createdAt": 1787573698485, 3713 "createdAt": 1787573698485,
3517 "promptEn": "underground rap duo freestyling at the camera", 3714 "promptEn": "underground rap duo freestyling at the camera",
3518 - "lastPlayedAt": 1788254075916 3715 + "lastPlayedAt": 1788256114676,
  3716 + "playCount": 1
3519 }, 3717 },
3520 { 3718 {
3521 "id": "e5246eae814e", 3719 "id": "e5246eae814e",
@@ -3530,7 +3728,8 @@ @@ -3530,7 +3728,8 @@
3530 "likes": 0, 3728 "likes": 0,
3531 "createdAt": 1787569314178, 3729 "createdAt": 1787569314178,
3532 "promptEn": "man apologizes, says something outside was chasing him", 3730 "promptEn": "man apologizes, says something outside was chasing him",
3533 - "lastPlayedAt": 1788252793246 3731 + "lastPlayedAt": 1788255430342,
  3732 + "playCount": 1
3534 }, 3733 },
3535 { 3734 {
3536 "id": "a0d7a106b8d6", 3735 "id": "a0d7a106b8d6",
@@ -3544,8 +3743,9 @@ @@ -3544,8 +3743,9 @@
3544 "partition": "text", 3743 "partition": "text",
3545 "likes": 0, 3744 "likes": 0,
3546 "createdAt": 1787568512602, 3745 "createdAt": 1787568512602,
3547 - "lastPlayedAt": 1788254065909,  
3548 - "promptEn": "man apologizes, says something outside was chasing him" 3746 + "lastPlayedAt": 1788255488369,
  3747 + "promptEn": "man apologizes, says something outside was chasing him",
  3748 + "playCount": 1
3549 }, 3749 },
3550 { 3750 {
3551 "id": "d71c09a38248", 3751 "id": "d71c09a38248",
@@ -3559,8 +3759,9 @@ @@ -3559,8 +3759,9 @@
3559 "partition": "ref2va", 3759 "partition": "ref2va",
3560 "likes": 0, 3760 "likes": 0,
3561 "createdAt": 1787559156410, 3761 "createdAt": 1787559156410,
3562 - "lastPlayedAt": 1788251306490,  
3563 - "promptEn": "two characters sitting, game menu UI swaps in a mechanical arm" 3762 + "lastPlayedAt": 1788254804016,
  3763 + "promptEn": "two characters sitting, game menu UI swaps in a mechanical arm",
  3764 + "playCount": 1
3564 }, 3765 },
3565 { 3766 {
3566 "id": "87c065ab0f98", 3767 "id": "87c065ab0f98",
@@ -3575,7 +3776,8 @@ @@ -3575,7 +3776,8 @@
3575 "likes": 0, 3776 "likes": 0,
3576 "createdAt": 1787542770522, 3777 "createdAt": 1787542770522,
3577 "promptEn": "clip cut to match a reference video's editing rhythm", 3778 "promptEn": "clip cut to match a reference video's editing rhythm",
3578 - "lastPlayedAt": 1788251906899 3779 + "lastPlayedAt": 1788255166199,
  3780 + "playCount": 1
3579 }, 3781 },
3580 { 3782 {
3581 "id": "f9286d694bad", 3783 "id": "f9286d694bad",
@@ -3590,7 +3792,8 @@ @@ -3590,7 +3792,8 @@
3590 "likes": 0, 3792 "likes": 0,
3591 "createdAt": 1787497396594, 3793 "createdAt": 1787497396594,
3592 "promptEn": "otome game male lead showcase PV", 3794 "promptEn": "otome game male lead showcase PV",
3593 - "lastPlayedAt": 1788253932562 3795 + "lastPlayedAt": 1788255340303,
  3796 + "playCount": 1
3594 }, 3797 },
3595 { 3798 {
3596 "id": "36ac12f2f29e", 3799 "id": "36ac12f2f29e",
@@ -3605,7 +3808,8 @@ @@ -3605,7 +3808,8 @@
3605 "likes": 0, 3808 "likes": 0,
3606 "createdAt": 1787493339415, 3809 "createdAt": 1787493339415,
3607 "promptEn": "game menu UI, character swaps out a mechanical arm", 3810 "promptEn": "game menu UI, character swaps out a mechanical arm",
3608 - "lastPlayedAt": 1788252205054 3811 + "lastPlayedAt": 1788255294279,
  3812 + "playCount": 1
3609 }, 3813 },
3610 { 3814 {
3611 "id": "656c897b04fc", 3815 "id": "656c897b04fc",
@@ -3620,7 +3824,8 @@ @@ -3620,7 +3824,8 @@
3620 "likes": 0, 3824 "likes": 0,
3621 "createdAt": 1787493303602, 3825 "createdAt": 1787493303602,
3622 "promptEn": "game menu UI, character swaps out a mechanical arm", 3826 "promptEn": "game menu UI, character swaps out a mechanical arm",
3623 - "lastPlayedAt": 1788253767768 3827 + "lastPlayedAt": 1788256526857,
  3828 + "playCount": 1
3624 }, 3829 },
3625 { 3830 {
3626 "id": "e1fd99e4ab97", 3831 "id": "e1fd99e4ab97",
@@ -3650,7 +3855,8 @@ @@ -3650,7 +3855,8 @@
3650 "likes": 0, 3855 "likes": 0,
3651 "createdAt": 1787470101693, 3856 "createdAt": 1787470101693,
3652 "promptEn": "black-background product-launch style shot of a roast duck", 3857 "promptEn": "black-background product-launch style shot of a roast duck",
3653 - "lastPlayedAt": 1788251246462 3858 + "lastPlayedAt": 1788254601425,
  3859 + "playCount": 1
3654 }, 3860 },
3655 { 3861 {
3656 "id": "99e771bbb50d", 3862 "id": "99e771bbb50d",
@@ -3665,7 +3871,8 @@ @@ -3665,7 +3871,8 @@
3665 "likes": 0, 3871 "likes": 0,
3666 "createdAt": 1787470101411, 3872 "createdAt": 1787470101411,
3667 "promptEn": "vertical family-fight drama, arguing with an older woman", 3873 "promptEn": "vertical family-fight drama, arguing with an older woman",
3668 - "lastPlayedAt": 1788254011880 3874 + "lastPlayedAt": 1788256158453,
  3875 + "playCount": 1
3669 }, 3876 },
3670 { 3877 {
3671 "id": "57169e6751d0", 3878 "id": "57169e6751d0",
@@ -3695,7 +3902,8 @@ @@ -3695,7 +3902,8 @@
3695 "likes": 0, 3902 "likes": 0,
3696 "createdAt": 1787470100377, 3903 "createdAt": 1787470100377,
3697 "promptEn": "all-black background, experimental Chinese kinetic typography", 3904 "promptEn": "all-black background, experimental Chinese kinetic typography",
3698 - "lastPlayedAt": 1788250298018 3905 + "lastPlayedAt": 1788254898074,
  3906 + "playCount": 1
3699 }, 3907 },
3700 { 3908 {
3701 "id": "c24c15736daa", 3909 "id": "c24c15736daa",
@@ -3770,7 +3978,8 @@ @@ -3770,7 +3978,8 @@
3770 "likes": 0, 3978 "likes": 0,
3771 "createdAt": 1787470098914, 3979 "createdAt": 1787470098914,
3772 "promptEn": "evening kitchen footage mixed with a glowing hand-drawn creature", 3980 "promptEn": "evening kitchen footage mixed with a glowing hand-drawn creature",
3773 - "lastPlayedAt": 1788252599204 3981 + "lastPlayedAt": 1788254826035,
  3982 + "playCount": 1
3774 }, 3983 },
3775 { 3984 {
3776 "id": "6639b07acc7b", 3985 "id": "6639b07acc7b",
@@ -3785,7 +3994,8 @@ @@ -3785,7 +3994,8 @@
3785 "likes": 0, 3994 "likes": 0,
3786 "createdAt": 1787470098570, 3995 "createdAt": 1787470098570,
3787 "promptEn": "fast-cut spaceship trailer title sequence", 3996 "promptEn": "fast-cut spaceship trailer title sequence",
3788 - "lastPlayedAt": 1788252235049 3997 + "lastPlayedAt": 1788255538396,
  3998 + "playCount": 1
3789 }, 3999 },
3790 { 4000 {
3791 "id": "1e55e540df11", 4001 "id": "1e55e540df11",
@@ -3800,7 +4010,8 @@ @@ -3800,7 +4010,8 @@
3800 "likes": 0, 4010 "likes": 0,
3801 "createdAt": 1787461994394, 4011 "createdAt": 1787461994394,
3802 "promptEn": "a quiet mountain village at dawn (second attempt)", 4012 "promptEn": "a quiet mountain village at dawn (second attempt)",
3803 - "lastPlayedAt": 1788251098955 4013 + "lastPlayedAt": 1788255112176,
  4014 + "playCount": 1
3804 }, 4015 },
3805 { 4016 {
3806 "id": "8e16b6faafd9", 4017 "id": "8e16b6faafd9",
@@ -3815,7 +4026,8 @@ @@ -3815,7 +4026,8 @@
3815 "likes": 0, 4026 "likes": 0,
3816 "createdAt": 1787455895150, 4027 "createdAt": 1787455895150,
3817 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4028 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3818 - "lastPlayedAt": 1788254418063 4029 + "lastPlayedAt": 1788255794528,
  4030 + "playCount": 1
3819 }, 4031 },
3820 { 4032 {
3821 "id": "2a4e45820135", 4033 "id": "2a4e45820135",
@@ -3830,7 +4042,8 @@ @@ -3830,7 +4042,8 @@
3830 "likes": 0, 4042 "likes": 0,
3831 "createdAt": 1787453697093, 4043 "createdAt": 1787453697093,
3832 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4044 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3833 - "lastPlayedAt": 1788250986335 4045 + "lastPlayedAt": 1788255554397,
  4046 + "playCount": 1
3834 }, 4047 },
3835 { 4048 {
3836 "id": "bfe13d1cc4a2", 4049 "id": "bfe13d1cc4a2",
@@ -3890,7 +4103,8 @@ @@ -3890,7 +4103,8 @@
3890 "likes": 0, 4103 "likes": 0,
3891 "createdAt": 1787444313690, 4104 "createdAt": 1787444313690,
3892 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4105 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3893 - "lastPlayedAt": 1788253967852 4106 + "lastPlayedAt": 1788256428755,
  4107 + "playCount": 1
3894 }, 4108 },
3895 { 4109 {
3896 "id": "e56962bd770f", 4110 "id": "e56962bd770f",
@@ -3920,7 +4134,8 @@ @@ -3920,7 +4134,8 @@
3920 "likes": 0, 4134 "likes": 0,
3921 "createdAt": 1787437988124, 4135 "createdAt": 1787437988124,
3922 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4136 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3923 - "lastPlayedAt": 1788252010944 4137 + "lastPlayedAt": 1788256016633,
  4138 + "playCount": 1
3924 }, 4139 },
3925 { 4140 {
3926 "id": "e497093c79ce", 4141 "id": "e497093c79ce",
@@ -3950,7 +4165,8 @@ @@ -3950,7 +4165,8 @@
3950 "likes": 0, 4165 "likes": 0,
3951 "createdAt": 1787432295531, 4166 "createdAt": 1787432295531,
3952 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4167 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3953 - "lastPlayedAt": 1788248396902 4168 + "lastPlayedAt": 1788255262253,
  4169 + "playCount": 1
3954 }, 4170 },
3955 { 4171 {
3956 "id": "79368c9cf499", 4172 "id": "79368c9cf499",
@@ -3980,7 +4196,8 @@ @@ -3980,7 +4196,8 @@
3980 "likes": 0, 4196 "likes": 0,
3981 "createdAt": 1787426955312, 4197 "createdAt": 1787426955312,
3982 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4198 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
3983 - "lastPlayedAt": 1788253219489 4199 + "lastPlayedAt": 1788255360311,
  4200 + "playCount": 1
3984 }, 4201 },
3985 { 4202 {
3986 "id": "734d28c52670", 4203 "id": "734d28c52670",
@@ -4040,7 +4257,8 @@ @@ -4040,7 +4257,8 @@
4040 "likes": 0, 4257 "likes": 0,
4041 "createdAt": 1787413999418, 4258 "createdAt": 1787413999418,
4042 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4259 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4043 - "lastPlayedAt": 1788251954922 4260 + "lastPlayedAt": 1788255444349,
  4261 + "playCount": 1
4044 }, 4262 },
4045 { 4263 {
4046 "id": "ade0318a7a4a", 4264 "id": "ade0318a7a4a",
@@ -4055,7 +4273,8 @@ @@ -4055,7 +4273,8 @@
4055 "likes": 0, 4273 "likes": 0,
4056 "createdAt": 1787413511959, 4274 "createdAt": 1787413511959,
4057 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4275 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4058 - "lastPlayedAt": 1788254235982 4276 + "lastPlayedAt": 1788256470780,
  4277 + "playCount": 1
4059 }, 4278 },
4060 { 4279 {
4061 "id": "5d4f40bf0889", 4280 "id": "5d4f40bf0889",
@@ -4115,7 +4334,8 @@ @@ -4115,7 +4334,8 @@
4115 "likes": 0, 4334 "likes": 0,
4116 "createdAt": 1787397450973, 4335 "createdAt": 1787397450973,
4117 "promptEn": "a cat sitting on a windowsill", 4336 "promptEn": "a cat sitting on a windowsill",
4118 - "lastPlayedAt": 1788251736809 4337 + "lastPlayedAt": 1788255000124,
  4338 + "playCount": 1
4119 }, 4339 },
4120 { 4340 {
4121 "id": "580d1d722adc", 4341 "id": "580d1d722adc",
@@ -4130,7 +4350,8 @@ @@ -4130,7 +4350,8 @@
4130 "likes": 0, 4350 "likes": 0,
4131 "createdAt": 1787388090646, 4351 "createdAt": 1787388090646,
4132 "promptEn": "a cat sitting on a windowsill", 4352 "promptEn": "a cat sitting on a windowsill",
4133 - "lastPlayedAt": 1788254205967 4353 + "lastPlayedAt": 1788256442760,
  4354 + "playCount": 1
4134 }, 4355 },
4135 { 4356 {
4136 "id": "c551457bc55e", 4357 "id": "c551457bc55e",
@@ -4144,8 +4365,9 @@ @@ -4144,8 +4365,9 @@
4144 "partition": "text", 4365 "partition": "text",
4145 "likes": 0, 4366 "likes": 0,
4146 "createdAt": 1787386316175, 4367 "createdAt": 1787386316175,
4147 - "lastPlayedAt": 1788253015347,  
4148 - "promptEn": "a cat sitting on a windowsill" 4368 + "lastPlayedAt": 1788255040143,
  4369 + "promptEn": "a cat sitting on a windowsill",
  4370 + "playCount": 1
4149 }, 4371 },
4150 { 4372 {
4151 "id": "f9b68e5daaed", 4373 "id": "f9b68e5daaed",
@@ -4190,7 +4412,8 @@ @@ -4190,7 +4412,8 @@
4190 "likes": 0, 4412 "likes": 0,
4191 "createdAt": 1787383911831, 4413 "createdAt": 1787383911831,
4192 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4414 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4193 - "lastPlayedAt": 1788245394359 4415 + "lastPlayedAt": 1788255700490,
  4416 + "playCount": 1
4194 }, 4417 },
4195 { 4418 {
4196 "id": "9cba879e263d", 4419 "id": "9cba879e263d",
@@ -4205,7 +4428,8 @@ @@ -4205,7 +4428,8 @@
4205 "likes": 0, 4428 "likes": 0,
4206 "createdAt": 1787375413935, 4429 "createdAt": 1787375413935,
4207 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4430 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4208 - "lastPlayedAt": 1788252421136 4431 + "lastPlayedAt": 1788255252253,
  4432 + "playCount": 1
4209 }, 4433 },
4210 { 4434 {
4211 "id": "10112fb3c1fd", 4435 "id": "10112fb3c1fd",
@@ -4220,7 +4444,8 @@ @@ -4220,7 +4444,8 @@
4220 "likes": 0, 4444 "likes": 0,
4221 "createdAt": 1787375413623, 4445 "createdAt": 1787375413623,
4222 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4446 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4223 - "lastPlayedAt": 1788253532966 4447 + "lastPlayedAt": 1788256324704,
  4448 + "playCount": 1
4224 }, 4449 },
4225 { 4450 {
4226 "id": "78e698c924b1", 4451 "id": "78e698c924b1",
@@ -4235,7 +4460,8 @@ @@ -4235,7 +4460,8 @@
4235 "likes": 0, 4460 "likes": 0,
4236 "createdAt": 1787375413203, 4461 "createdAt": 1787375413203,
4237 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4462 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4238 - "lastPlayedAt": 1788252725215 4463 + "lastPlayedAt": 1788255090167,
  4464 + "playCount": 1
4239 }, 4465 },
4240 { 4466 {
4241 "id": "219ed88c3ea7", 4467 "id": "219ed88c3ea7",
@@ -4250,7 +4476,8 @@ @@ -4250,7 +4476,8 @@
4250 "likes": 0, 4476 "likes": 0,
4251 "createdAt": 1787375412946, 4477 "createdAt": 1787375412946,
4252 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4478 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4253 - "lastPlayedAt": 1788252407133 4479 + "lastPlayedAt": 1788255736512,
  4480 + "playCount": 1
4254 }, 4481 },
4255 { 4482 {
4256 "id": "a72236902363", 4483 "id": "a72236902363",
@@ -4280,7 +4507,8 @@ @@ -4280,7 +4507,8 @@
4280 "likes": 0, 4507 "likes": 0,
4281 "createdAt": 1787367454065, 4508 "createdAt": 1787367454065,
4282 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4509 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4283 - "lastPlayedAt": 1788253735749 4510 + "lastPlayedAt": 1788255482366,
  4511 + "playCount": 1
4284 }, 4512 },
4285 { 4513 {
4286 "id": "e6c241be377f", 4514 "id": "e6c241be377f",
@@ -4310,7 +4538,8 @@ @@ -4310,7 +4538,8 @@
4310 "likes": 0, 4538 "likes": 0,
4311 "createdAt": 1787363956909, 4539 "createdAt": 1787363956909,
4312 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4540 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4313 - "lastPlayedAt": 1788254362044 4541 + "lastPlayedAt": 1788256296687,
  4542 + "playCount": 1
4314 }, 4543 },
4315 { 4544 {
4316 "id": "5692965402f5", 4545 "id": "5692965402f5",
@@ -4325,7 +4554,8 @@ @@ -4325,7 +4554,8 @@
4325 "likes": 0, 4554 "likes": 0,
4326 "createdAt": 1787332996051, 4555 "createdAt": 1787332996051,
4327 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4556 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4328 - "lastPlayedAt": 1788253717746 4557 + "lastPlayedAt": 1788255076159,
  4558 + "playCount": 1
4329 }, 4559 },
4330 { 4560 {
4331 "id": "bf7d973d02a3", 4561 "id": "bf7d973d02a3",
@@ -4340,7 +4570,8 @@ @@ -4340,7 +4570,8 @@
4340 "likes": 0, 4570 "likes": 0,
4341 "createdAt": 1787332047061, 4571 "createdAt": 1787332047061,
4342 "promptEn": "golden portal opens, man in green jacket throws a glowing spear", 4572 "promptEn": "golden portal opens, man in green jacket throws a glowing spear",
4343 - "lastPlayedAt": 1788253407577 4573 + "lastPlayedAt": 1788255218227,
  4574 + "playCount": 1
4344 }, 4575 },
4345 { 4576 {
4346 "id": "a5688d8f5db3", 4577 "id": "a5688d8f5db3",
@@ -4355,7 +4586,8 @@ @@ -4355,7 +4586,8 @@
4355 "likes": 0, 4586 "likes": 0,
4356 "createdAt": 1787330101793, 4587 "createdAt": 1787330101793,
4357 "promptEn": "a red apple on a wooden table, cinematic lighting", 4588 "promptEn": "a red apple on a wooden table, cinematic lighting",
4358 - "lastPlayedAt": 1788253473602 4589 + "lastPlayedAt": 1788256286688,
  4590 + "playCount": 1
4359 }, 4591 },
4360 { 4592 {
4361 "id": "0024d3c2d4cb", 4593 "id": "0024d3c2d4cb",
@@ -4370,7 +4602,8 @@ @@ -4370,7 +4602,8 @@
4370 "likes": 0, 4602 "likes": 0,
4371 "createdAt": 1787326019663, 4603 "createdAt": 1787326019663,
4372 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella", 4604 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4373 - "lastPlayedAt": 1788252891295 4605 + "lastPlayedAt": 1788254717984,
  4606 + "playCount": 1
4374 }, 4607 },
4375 { 4608 {
4376 "id": "ab42a6fba515", 4609 "id": "ab42a6fba515",
@@ -4400,7 +4633,8 @@ @@ -4400,7 +4633,8 @@
4400 "likes": 0, 4633 "likes": 0,
4401 "createdAt": 1787309864037, 4634 "createdAt": 1787309864037,
4402 "promptEn": "transparent gaming mouse product film, blue and orange lighting", 4635 "promptEn": "transparent gaming mouse product film, blue and orange lighting",
4403 - "lastPlayedAt": 1788254219979 4636 + "lastPlayedAt": 1788256342714,
  4637 + "playCount": 1
4404 }, 4638 },
4405 { 4639 {
4406 "id": "073f5df6427a", 4640 "id": "073f5df6427a",
@@ -4415,7 +4649,8 @@ @@ -4415,7 +4649,8 @@
4415 "likes": 0, 4649 "likes": 0,
4416 "createdAt": 1787305544815, 4650 "createdAt": 1787305544815,
4417 "promptEn": "transparent gaming mouse product film, blue and orange lighting", 4651 "promptEn": "transparent gaming mouse product film, blue and orange lighting",
4418 - "lastPlayedAt": 1788253209480 4652 + "lastPlayedAt": 1788255494373,
  4653 + "playCount": 1
4419 }, 4654 },
4420 { 4655 {
4421 "id": "e23b04ac2c78", 4656 "id": "e23b04ac2c78",
@@ -4430,7 +4665,8 @@ @@ -4430,7 +4665,8 @@
4430 "likes": 0, 4665 "likes": 0,
4431 "createdAt": 1787304875681, 4666 "createdAt": 1787304875681,
4432 "promptEn": "protagonist leaps across rooftops fleeing pursuers", 4667 "promptEn": "protagonist leaps across rooftops fleeing pursuers",
4433 - "lastPlayedAt": 1788253051367 4668 + "lastPlayedAt": 1788254820032,
  4669 + "playCount": 1
4434 }, 4670 },
4435 { 4671 {
4436 "id": "c84bc1c7bfa0", 4672 "id": "c84bc1c7bfa0",
@@ -4445,7 +4681,8 @@ @@ -4445,7 +4681,8 @@
4445 "likes": 0, 4681 "likes": 0,
4446 "createdAt": 1787304031214, 4682 "createdAt": 1787304031214,
4447 "promptEn": "constable asks how she's sure it's not human, she says a person would make a sound", 4683 "promptEn": "constable asks how she's sure it's not human, she says a person would make a sound",
4448 - "lastPlayedAt": 1788251466626 4684 + "lastPlayedAt": 1788255188208,
  4685 + "playCount": 1
4449 }, 4686 },
4450 { 4687 {
4451 "id": "23d2fd81eb4d", 4688 "id": "23d2fd81eb4d",
@@ -4475,7 +4712,8 @@ @@ -4475,7 +4712,8 @@
4475 "likes": 0, 4712 "likes": 0,
4476 "createdAt": 1787290119529, 4713 "createdAt": 1787290119529,
4477 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella", 4714 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4478 - "lastPlayedAt": 1788253747759 4715 + "lastPlayedAt": 1788255414334,
  4716 + "playCount": 1
4479 }, 4717 },
4480 { 4718 {
4481 "id": "06bb43196c46", 4719 "id": "06bb43196c46",
@@ -4490,7 +4728,8 @@ @@ -4490,7 +4728,8 @@
4490 "likes": 0, 4728 "likes": 0,
4491 "createdAt": 1787290119114, 4729 "createdAt": 1787290119114,
4492 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella", 4730 "promptEn": "misty Jiangnan old town at dawn, woman walking with an oil-paper umbrella",
4493 - "lastPlayedAt": 1788253429580 4731 + "lastPlayedAt": 1788254852045,
  4732 + "playCount": 1
4494 }, 4733 },
4495 { 4734 {
4496 "id": "0f22388f7847", 4735 "id": "0f22388f7847",
@@ -4564,8 +4803,9 @@ @@ -4564,8 +4803,9 @@
4564 "partition": "fl2va", 4803 "partition": "fl2va",
4565 "likes": 0, 4804 "likes": 0,
4566 "createdAt": 1787224701504, 4805 "createdAt": 1787224701504,
4567 - "lastPlayedAt": 1788252757232,  
4568 - "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own" 4806 + "lastPlayedAt": 1788254966105,
  4807 + "promptEn": "constable burns the beauty portrait with the lamp, the door opens on its own",
  4808 + "playCount": 1
4569 }, 4809 },
4570 { 4810 {
4571 "id": "f78ebe4c01c8", 4811 "id": "f78ebe4c01c8",
@@ -4595,6 +4835,7 @@ @@ -4595,6 +4835,7 @@
4595 "likes": 0, 4835 "likes": 0,
4596 "createdAt": 1787220579189, 4836 "createdAt": 1787220579189,
4597 "promptEn": "gothic castle at night, vampire noble carries a princess, rose petals falling", 4837 "promptEn": "gothic castle at night, vampire noble carries a princess, rose petals falling",
4598 - "lastPlayedAt": 1788253381560 4838 + "lastPlayedAt": 1788254675967,
  4839 + "playCount": 1
4599 } 4840 }
4600 ] 4841 ]
4601 \ No newline at end of file 4842 \ No newline at end of file
server.js
@@ -129,11 +129,33 @@ function glmChat(messages) { @@ -129,11 +129,33 @@ function glmChat(messages) {
129 }); 129 });
130 } 130 }
131 131
132 -const PROMPT_OPTIMIZE_SYSTEM = `You are a prompt engineer for a text-to-video model. Expand the user's short  
133 -request (which may be in Chinese or English) into a detailed shot-by-shot generation prompt written in  
134 -English: camera angle/movement, lighting and mood, the subject's specific actions, and the setting.  
135 -Output only the expanded English prompt itself — no preamble, no quotes, no "Prompt:" prefix — under  
136 -150 words.`; 132 +// Distilled from docs/h3skill.md (MiniMax's own H3 prompt-writing methodology) down to the one
  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.
  137 +const PROMPT_OPTIMIZE_SYSTEM = `You are writing H3 text-to-video generation prompts (T2VA mode — no
  138 +reference images, pure text-to-video). Expand the user's short request (may be in Chinese or English)
  139 +into the official H3 three-field format, in this exact order, using these exact field labels:
  140 +
  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
  143 +into multiple shots or write more than [Shot 1]): the setting, the subject's specific action, and ONE
  144 +dominant camera movement using this vocabulary — Zoom In/Out, Push In/Pull Out, Pan Left/Right, Truck
  145 +Left/Right, Tilt Up/Down, Pedestal Up/Down, Arc Shot, Tracking Shot, Static Shot, Shake Slightly/
  146 +Strongly, POV, Roll Clockwise/Counterclockwise — stated as type + amplitude (small/large) + speed
  147 +(slow/fast). Describe light concretely: where it comes from, what it hits, what effect it creates.
  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.
  150 +
  151 +overall_soundscape: 1-4 English sentences describing the ambient environmental sound the scene would
  152 +naturally have.
  153 +
  154 +non_diegetic_music: 1-3 English sentences describing the score the audience (not the characters) hears,
  155 +or exactly "N/A" if none fits.
  156 +
  157 +Output only these three labeled fields in this exact order and exact labels, nothing else — no
  158 +preamble, no extra commentary, no markdown formatting.`;
137 159
138 // Best-effort — a viewer's short chat line ("一只猫跳舞") makes for a weak 160 // Best-effort — a viewer's short chat line ("一只猫跳舞") makes for a weak
139 // H3 prompt on its own. Never let a GLM outage or slow response block 161 // H3 prompt on its own. Never let a GLM outage or slow response block