From 31308f25c12c410d3080a98ec9890026a3d2831c Mon Sep 17 00:00:00 2001 From: kang Date: Thu, 14 May 2026 01:17:35 +0800 Subject: [PATCH] auto-save 2026-05-14 01:17 (+6, ~3) --- .memory/worklog.json | 13 + .../page-2026-05-13T17-12-17-381Z.yml | 36 ++ .../page-2026-05-13T17-12-20-916Z.yml | 454 +++++++++++++++++ .../page-2026-05-13T17-12-51-011Z.yml | 19 + .../page-2026-05-13T17-12-54-118Z.yml | 454 +++++++++++++++++ .../page-2026-05-13T17-17-23-233Z.yml | 36 ++ .../page-2026-05-13T17-17-26-396Z.yml | 456 ++++++++++++++++++ web/app/page.tsx | 16 +- web/components/nodes/index.tsx | 88 ++-- 9 files changed, 1535 insertions(+), 37 deletions(-) create mode 100644 .playwright-mcp/page-2026-05-13T17-12-17-381Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T17-12-20-916Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T17-12-51-011Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T17-12-54-118Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T17-17-23-233Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T17-17-26-396Z.yml diff --git a/.memory/worklog.json b/.memory/worklog.json index 7597320..a45d1d6 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -2738,6 +2738,19 @@ "message": "auto-save 2026-05-14 01:05 (+4, ~3)", "hash": "3684917", "files_changed": 7 + }, + { + "ts": "2026-05-14T01:11:53+08:00", + "type": "commit", + "message": "auto-save 2026-05-14 01:11 (+4, ~4)", + "hash": "4610ef8", + "files_changed": 8 + }, + { + "ts": "2026-05-13T17:13:10Z", + "type": "session-heartbeat", + "message": "Claude 会话活跃 · 最近命令:claude · 2 项未提交变更 · 最近提交:auto-save 2026-05-14 01:11 (+4, ~4)", + "files_changed": 2 } ] } diff --git a/.playwright-mcp/page-2026-05-13T17-12-17-381Z.yml b/.playwright-mcp/page-2026-05-13T17-12-17-381Z.yml new file mode 100644 index 0000000..151684a --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-12-17-381Z.yml @@ -0,0 +1,36 @@ +- generic [active] [ref=e1]: + - button "Open Next.js Dev Tools" [ref=e7] [cursor=pointer]: + - img [ref=e8] + - main [ref=e14]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]: + - img [ref=e17] + - application [ref=e24]: + - group [ref=e27]: + - generic [ref=e29]: + - generic [ref=e30]: + - img [ref=e32] + - generic [ref=e35]: 输入 · Input + - button "钉住 · 锁定位置与尺寸" [ref=e38]: + - img [ref=e39] + - generic [ref=e42]: + - generic [ref=e43]: STEP 1 · 待运行 + - textbox "粘贴 TikTok 链接" [ref=e44] + - generic [ref=e45]: + - button "提交链接" [disabled] [ref=e46] + - button "上传" [ref=e47]: + - img [ref=e48] + - text: 上传 + - generic "拖动调整宽度" [ref=e52] + - generic "拖动调整大小(宽 × 高)" [ref=e53] + - img + - generic "Control Panel" [ref=e54]: + - button "Zoom In" [ref=e55] [cursor=pointer]: + - img [ref=e56] + - button "Zoom Out" [ref=e58] [cursor=pointer]: + - img [ref=e59] + - button "Fit View" [ref=e61] [cursor=pointer]: + - img [ref=e62] + - button "Toggle Interactivity" [ref=e64] [cursor=pointer]: + - img [ref=e65] + - img "Mini Map" [ref=e68] + - region "Notifications alt+T" \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T17-12-20-916Z.yml b/.playwright-mcp/page-2026-05-13T17-12-20-916Z.yml new file mode 100644 index 0000000..227e366 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-12-20-916Z.yml @@ -0,0 +1,454 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e71]: + - button "Open issues overlay" [ref=e72]: + - generic [ref=e73]: + - generic [ref=e74]: "0" + - generic [ref=e75]: "1" + - generic [ref=e76]: Issue + - button "Collapse issues badge" [ref=e77]: + - img [ref=e78] + - main [ref=e14]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]: + - img [ref=e17] + - button "切到明亮主题" [ref=e81]: + - img [ref=e82] + - generic [ref=e22]: + - generic [ref=e90]: + - generic [ref=e91]: + - img [ref=e92] + - generic [ref=e97]: 分镜头编排 + - generic [ref=e98]: 0 分镜 · 0 元素 + - generic [ref=e99]: · 组织分镜画面 → 为生成视频做准备 + - button "展开编排" [disabled] [ref=e101]: + - img [ref=e102] + - text: 展开编排 + - application [ref=e24]: + - generic [ref=e26]: + - generic: + - generic: + - img: + - group "Edge from input to keyframe" [ref=e104] [cursor=pointer] + - img: + - group "Edge from input to asr" [ref=e107] [cursor=pointer] + - img: + - group "Edge from asr to translate" [ref=e110] [cursor=pointer] + - img: + - group "Edge from translate to rewrite" [ref=e113] [cursor=pointer] + - img: + - group "Edge from keyframe to storyboard" [ref=e116] [cursor=pointer] + - img: + - group "Edge from rewrite to storyboard" [ref=e119] [cursor=pointer] + - img: + - group "Edge from storyboard to videogen" [ref=e122] [cursor=pointer] + - img: + - group "Edge from videogen to compose" [ref=e125] [cursor=pointer] + - img: + - group "Edge from rewrite to compose" [ref=e128] [cursor=pointer] + - generic: + - group [ref=e27]: + - generic [ref=e28]: + - generic [ref=e131]: + - button "再上传一个视频" [ref=e132]: + - img [ref=e133] + - generic [ref=e134]: + - button "64.5s" [ref=e135]: + - generic [ref=e137]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e138]: + - button "72.4s" [ref=e139]: + - generic [ref=e141]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e142]: + - button "64.5s" [ref=e143]: + - generic [ref=e145]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e146]: + - button "71.4s" [ref=e147]: + - generic [ref=e149]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e150]: + - button "72.4s" [ref=e151]: + - generic [ref=e153]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e154]: + - button "71.4s" [ref=e155]: + - generic [ref=e157]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e158]: + - button "71.4s" [ref=e159]: + - generic [ref=e161]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e162]: + - button "71.4s" [ref=e163]: + - generic [ref=e165]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e166]: + - button "71.4s" [ref=e167]: + - generic [ref=e169]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e170]: + - button "71.4s" [ref=e171]: + - generic [ref=e173]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e174]: + - button "8.0s" [ref=e175]: + - generic [ref=e177]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e178]: + - button "8.0s" [ref=e179]: + - generic [ref=e181]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e182]: + - button "8.0s" [ref=e183]: + - generic [ref=e185]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e186]: + - button "8.0s" [ref=e187]: + - generic [ref=e189]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - button "…" [ref=e191]: + - img [ref=e193] + - generic [ref=e195]: … + - button "…" [ref=e197]: + - img [ref=e199] + - generic [ref=e201]: … + - button "…" [ref=e203]: + - img [ref=e205] + - generic [ref=e207]: … + - generic [ref=e29]: + - generic [ref=e30]: + - img [ref=e32] + - generic [ref=e35]: 输入 · Input + - generic [ref=e36]: + - img [ref=e208] + - button "钉住 · 锁定位置与尺寸" [ref=e38]: + - img [ref=e39] + - generic [ref=e42]: + - generic [ref=e43]: STEP 1 · 视频就绪 · 完成 + - textbox "再加一个 TK 链接" [ref=e211] + - generic [ref=e45]: + - button "+ 加链接" [disabled] [ref=e212] + - button "再传一个" [ref=e213]: + - img [ref=e48] + - text: 再传一个 + - generic [ref=e214]: + - generic [ref=e215]: 1080×1920 · 64.5s + - generic [ref=e216]: 🔗 链接 + - button "重新解析" [ref=e217] + - generic "拖动调整宽度" [ref=e52] + - generic "拖动调整大小(宽 × 高)" [ref=e53] + - group [ref=e218]: + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - button "frame 9 1.7s" [ref=e222]: + - img "frame 9" [ref=e223] + - generic [ref=e224]: 1.7s + - button "📋" [ref=e225] + - button "删除该关键帧" [ref=e226]: + - img [ref=e227] + - generic: + - generic: + - generic: + - generic: 分镜 10 + - generic: 1.66s + - generic [ref=e230]: + - button "frame 0 ✨ 24.7s" [ref=e231]: + - img "frame 0" [ref=e232] + - generic "已清洗" [ref=e234]: ✨ + - generic [ref=e235]: 24.7s + - button "📋" [ref=e236] + - button "删除该关键帧" [ref=e237]: + - img [ref=e238] + - generic: + - generic: + - generic: + - generic: 分镜 1 + - generic: 24.73s + - generic [ref=e241]: + - button "frame 1 33.6s" [ref=e242]: + - img "frame 1" [ref=e243] + - generic [ref=e244]: 33.6s + - button "📋" [ref=e245] + - button "删除该关键帧" [ref=e246]: + - img [ref=e247] + - generic: + - generic: + - generic: + - generic: 分镜 2 + - generic: 33.61s + - generic [ref=e250]: + - button "frame 2 37.7s" [ref=e251]: + - img "frame 2" [ref=e252] + - generic [ref=e253]: 37.7s + - button "📋" [ref=e254] + - button "删除该关键帧" [ref=e255]: + - img [ref=e256] + - generic: + - generic: + - generic: + - generic: 分镜 3 + - generic: 37.70s + - generic [ref=e259]: + - button "frame 3 39.4s" [ref=e260]: + - img "frame 3" [ref=e261] + - generic [ref=e262]: 39.4s + - button "📋" [ref=e263] + - button "删除该关键帧" [ref=e264]: + - img [ref=e265] + - generic: + - generic: + - generic: + - generic: 分镜 4 + - generic: 39.42s + - generic [ref=e268]: + - button "frame 4 1 43.1s" [ref=e269]: + - img "frame 4" [ref=e270] + - generic "1 个元素已抠图" [ref=e272]: "1" + - generic [ref=e273]: 43.1s + - button "📋" [ref=e274] + - button "删除该关键帧" [ref=e275]: + - img [ref=e276] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e279]: + - button "frame 5 45.0s" [ref=e280]: + - img "frame 5" [ref=e281] + - generic [ref=e282]: 45.0s + - button "📋" [ref=e283] + - button "删除该关键帧" [ref=e284]: + - img [ref=e285] + - generic: + - generic: + - generic: + - generic: 分镜 6 + - generic: 45.05s + - generic [ref=e288]: + - button "frame 6 53.6s" [ref=e289]: + - img "frame 6" [ref=e290] + - generic [ref=e291]: 53.6s + - button "📋" [ref=e292] + - button "删除该关键帧" [ref=e293]: + - img [ref=e294] + - generic: + - generic: + - generic: + - generic: 分镜 7 + - generic: 53.60s + - generic [ref=e297]: + - button "frame 7 56.0s" [ref=e298]: + - img "frame 7" [ref=e299] + - generic [ref=e300]: 56.0s + - button "📋" [ref=e301] + - button "删除该关键帧" [ref=e302]: + - img [ref=e303] + - generic: + - generic: + - generic: + - generic: 分镜 8 + - generic: 55.96s + - generic [ref=e306]: + - button "frame 8 58.4s" [ref=e307]: + - img "frame 8" [ref=e308] + - generic [ref=e309]: 58.4s + - button "📋" [ref=e310] + - button "删除该关键帧" [ref=e311]: + - img [ref=e312] + - generic: + - generic: + - generic: + - generic: 分镜 9 + - generic: 58.39s + - generic [ref=e315]: + - generic [ref=e317]: + - img [ref=e319] + - generic [ref=e323]: 镜头拆解 · 元素提取 + - generic [ref=e324]: + - img [ref=e325] + - button "钉住 · 锁定位置与尺寸" [ref=e329]: + - img [ref=e330] + - generic [ref=e333]: + - generic [ref=e334]: STEP 2 · 0/10 入编排 · 完成 + - generic [ref=e335]: + - text: 自动 10 张 · + - generic [ref=e336]: 1 已清洗 + - text: · + - generic [ref=e337]: 1/2 已抠图 + - text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材 + - generic "拖动调整宽度" [ref=e339] + - generic "拖动调整大小(宽 × 高)" [ref=e340] + - group [ref=e341]: + - generic [ref=e342]: + - generic [ref=e344]: + - img [ref=e346] + - generic [ref=e349]: 声音文案 · ASR + - button "钉住 · 锁定位置与尺寸" [ref=e352]: + - img [ref=e353] + - generic [ref=e356]: + - generic [ref=e357]: STEP 3 · 可选文案轨 · 待运行 + - generic [ref=e358]: Gemini 2.5 · 英文带时间戳分段 + - generic "拖动调整宽度" [ref=e360] + - generic "拖动调整大小(宽 × 高)" [ref=e361] + - group [ref=e362]: + - generic [ref=e363]: + - generic [ref=e365]: + - img [ref=e367] + - generic [ref=e371]: 翻译理解 · Translate + - button "钉住 · 锁定位置与尺寸" [ref=e374]: + - img [ref=e375] + - generic [ref=e378]: + - generic [ref=e379]: STEP 4 · EN → ZH · 待运行 + - generic [ref=e380]: 中文翻译 · 段落级 · 实时输出 + - generic "拖动调整宽度" [ref=e382] + - generic "拖动调整大小(宽 × 高)" [ref=e383] + - group [ref=e384]: + - generic [ref=e385]: + - generic [ref=e387]: + - button "透明骷髅" [ref=e388]: + - img "透明骷髅" [ref=e389] + - button "📋" [ref=e390] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e391]: + - generic [ref=e393]: + - img [ref=e395] + - generic [ref=e400]: 元素改造 · Storyboard + - generic [ref=e401]: + - img [ref=e402] + - button "钉住 · 锁定位置与尺寸" [ref=e406]: + - img [ref=e407] + - generic [ref=e410]: + - generic [ref=e411]: STEP 6 · 参考元素 → SKG 画面 · 完成 + - generic [ref=e412]: + - text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。 + - generic [ref=e413]: 已有 1 个提取元素 · 0 个分镜进入编排 + - button "进入分镜编排" [disabled] [ref=e414] + - generic "拖动调整宽度" [ref=e416] + - generic "拖动调整大小(宽 × 高)" [ref=e417] + - group [ref=e418]: + - generic [ref=e419]: + - generic [ref=e421]: + - img [ref=e423] + - generic [ref=e427]: 产品文案 · Rewrite + - button "钉住 · 锁定位置与尺寸" [ref=e430]: + - img [ref=e431] + - generic [ref=e434]: + - generic [ref=e435]: STEP 5 · 接 SKG 卖点 · 待运行 + - textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e436] + - generic [ref=e437]: 下一冲刺接入 + - generic "拖动调整宽度" [ref=e439] + - generic "拖动调整大小(宽 × 高)" [ref=e440] + - group [ref=e441]: + - generic [ref=e443]: + - generic [ref=e445]: + - img [ref=e447] + - generic [ref=e449]: 生成视频 · Video Gen + - button "钉住 · 锁定位置与尺寸" [ref=e452]: + - img [ref=e453] + - generic [ref=e456]: + - generic [ref=e457]: STEP 7 · 首帧 + 动作 prompt · 待运行 + - generic [ref=e458]: + - generic [ref=e459]: Seedance + - generic [ref=e460]: Kling + - generic [ref=e461]: Veo 3 + - generic "拖动调整宽度" [ref=e463] + - generic "拖动调整大小(宽 × 高)" [ref=e464] + - group [ref=e465]: + - generic [ref=e466]: + - generic [ref=e468]: + - img [ref=e470] + - generic [ref=e474]: 合成成品 · Compose + - button "钉住 · 锁定位置与尺寸" [ref=e477]: + - img [ref=e478] + - generic [ref=e481]: + - generic [ref=e482]: STEP 8 · ffmpeg + 字幕 · 待运行 + - generic [ref=e483]: + - text: 视频片段 + 字幕 / TTS + - text: → 最终 mp4 输出 + - generic "拖动调整宽度" [ref=e484] + - generic "拖动调整大小(宽 × 高)" [ref=e485] + - img + - generic "Control Panel" [ref=e54]: + - button "Zoom In" [ref=e55] [cursor=pointer]: + - img [ref=e56] + - button "Zoom Out" [ref=e58] [cursor=pointer]: + - img [ref=e59] + - button "Fit View" [ref=e61] [cursor=pointer]: + - img [ref=e62] + - button "Toggle Interactivity" [ref=e64] [cursor=pointer]: + - img [ref=e65] + - img "Mini Map" [ref=e68] + - region "Notifications alt+T": + - list: + - listitem [ref=e493]: + - img [ref=e495] + - generic [ref=e498]: 已自动排版 · 保留每个节点的尺寸 + - listitem [ref=e499]: + - img [ref=e501] + - generic [ref=e504]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮 + - alert [ref=e505] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T17-12-51-011Z.yml b/.playwright-mcp/page-2026-05-13T17-12-51-011Z.yml new file mode 100644 index 0000000..c746b75 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-12-51-011Z.yml @@ -0,0 +1,19 @@ +- generic [active] [ref=e1]: + - main [ref=e3]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e5]: + - img [ref=e6] + - application [ref=e13]: + - img + - generic "Control Panel" [ref=e16]: + - button "Zoom In" [ref=e17] [cursor=pointer]: + - img [ref=e18] + - button "Zoom Out" [ref=e20] [cursor=pointer]: + - img [ref=e21] + - button "Fit View" [ref=e23] [cursor=pointer]: + - img [ref=e24] + - button "Toggle Interactivity" [ref=e26] [cursor=pointer]: + - img [ref=e27] + - img "Mini Map" [ref=e30] + - region "Notifications alt+T" + - button "Open Next.js Dev Tools" [ref=e37] [cursor=pointer]: + - img [ref=e38] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T17-12-54-118Z.yml b/.playwright-mcp/page-2026-05-13T17-12-54-118Z.yml new file mode 100644 index 0000000..502dd6f --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-12-54-118Z.yml @@ -0,0 +1,454 @@ +- generic [active] [ref=e1]: + - generic [ref=e36] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e37]: + - img [ref=e38] + - generic [ref=e43]: + - button "Open issues overlay" [ref=e44]: + - generic [ref=e45]: + - generic [ref=e46]: "0" + - generic [ref=e47]: "1" + - generic [ref=e48]: Issue + - button "Collapse issues badge" [ref=e49]: + - img [ref=e50] + - main [ref=e53]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e55]: + - img [ref=e56] + - button "切到明亮主题" [ref=e62]: + - img [ref=e63] + - generic [ref=e69]: + - generic [ref=e72]: + - generic [ref=e73]: + - img [ref=e74] + - generic [ref=e79]: 分镜头编排 + - generic [ref=e80]: 0 分镜 · 0 元素 + - generic [ref=e81]: · 组织分镜画面 → 为生成视频做准备 + - button "展开编排" [disabled] [ref=e83]: + - img [ref=e84] + - text: 展开编排 + - application [ref=e87]: + - generic [ref=e89]: + - generic: + - generic: + - img: + - group "Edge from input to keyframe" [ref=e90] [cursor=pointer] + - img: + - group "Edge from input to asr" [ref=e93] [cursor=pointer] + - img: + - group "Edge from asr to translate" [ref=e96] [cursor=pointer] + - img: + - group "Edge from translate to rewrite" [ref=e99] [cursor=pointer] + - img: + - group "Edge from keyframe to storyboard" [ref=e102] [cursor=pointer] + - img: + - group "Edge from rewrite to storyboard" [ref=e105] [cursor=pointer] + - img: + - group "Edge from storyboard to videogen" [ref=e108] [cursor=pointer] + - img: + - group "Edge from videogen to compose" [ref=e111] [cursor=pointer] + - img: + - group "Edge from rewrite to compose" [ref=e114] [cursor=pointer] + - generic: + - group [ref=e117]: + - generic [ref=e118]: + - generic [ref=e119]: + - button "再上传一个视频" [ref=e120]: + - img [ref=e121] + - generic [ref=e122]: + - button "64.5s" [ref=e123]: + - generic [ref=e125]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e126]: + - button "72.4s" [ref=e127]: + - generic [ref=e129]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e130]: + - button "64.5s" [ref=e131]: + - generic [ref=e133]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e134]: + - button "71.4s" [ref=e135]: + - generic [ref=e137]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e138]: + - button "72.4s" [ref=e139]: + - generic [ref=e141]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e142]: + - button "71.4s" [ref=e143]: + - generic [ref=e145]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e146]: + - button "71.4s" [ref=e147]: + - generic [ref=e149]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e150]: + - button "71.4s" [ref=e151]: + - generic [ref=e153]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e154]: + - button "71.4s" [ref=e155]: + - generic [ref=e157]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e158]: + - button "71.4s" [ref=e159]: + - generic [ref=e161]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e162]: + - button "8.0s" [ref=e163]: + - generic [ref=e165]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e166]: + - button "8.0s" [ref=e167]: + - generic [ref=e169]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e170]: + - button "8.0s" [ref=e171]: + - generic [ref=e173]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e174]: + - button "8.0s" [ref=e175]: + - generic [ref=e177]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - button "…" [ref=e179]: + - img [ref=e181] + - generic [ref=e183]: … + - button "…" [ref=e185]: + - img [ref=e187] + - generic [ref=e189]: … + - button "…" [ref=e191]: + - img [ref=e193] + - generic [ref=e195]: … + - generic [ref=e196]: + - generic [ref=e197]: + - img [ref=e199] + - generic [ref=e202]: 输入 · Input + - generic [ref=e203]: + - img [ref=e204] + - button "钉住 · 锁定位置与尺寸" [ref=e208]: + - img [ref=e209] + - generic [ref=e212]: + - generic [ref=e213]: STEP 1 · 视频就绪 · 完成 + - textbox "再加一个 TK 链接" [ref=e214] + - generic [ref=e215]: + - button "+ 加链接" [disabled] [ref=e216] + - button "再传一个" [ref=e217]: + - img [ref=e218] + - text: 再传一个 + - generic [ref=e221]: + - generic [ref=e222]: 1080×1920 · 64.5s + - generic [ref=e223]: 🔗 链接 + - button "重新解析" [ref=e224] + - generic "拖动调整宽度" [ref=e226] + - generic "拖动调整大小(宽 × 高)" [ref=e227] + - group [ref=e228]: + - generic [ref=e229]: + - generic [ref=e230]: + - generic [ref=e231]: + - button "frame 9 1.7s" [ref=e232]: + - img "frame 9" [ref=e233] + - generic [ref=e234]: 1.7s + - button "📋" [ref=e235] + - button "删除该关键帧" [ref=e236]: + - img [ref=e237] + - generic: + - generic: + - generic: + - generic: 分镜 10 + - generic: 1.66s + - generic [ref=e240]: + - button "frame 0 ✨ 24.7s" [ref=e241]: + - img "frame 0" [ref=e242] + - generic "已清洗" [ref=e244]: ✨ + - generic [ref=e245]: 24.7s + - button "📋" [ref=e246] + - button "删除该关键帧" [ref=e247]: + - img [ref=e248] + - generic: + - generic: + - generic: + - generic: 分镜 1 + - generic: 24.73s + - generic [ref=e251]: + - button "frame 1 33.6s" [ref=e252]: + - img "frame 1" [ref=e253] + - generic [ref=e254]: 33.6s + - button "📋" [ref=e255] + - button "删除该关键帧" [ref=e256]: + - img [ref=e257] + - generic: + - generic: + - generic: + - generic: 分镜 2 + - generic: 33.61s + - generic [ref=e260]: + - button "frame 2 37.7s" [ref=e261]: + - img "frame 2" [ref=e262] + - generic [ref=e263]: 37.7s + - button "📋" [ref=e264] + - button "删除该关键帧" [ref=e265]: + - img [ref=e266] + - generic: + - generic: + - generic: + - generic: 分镜 3 + - generic: 37.70s + - generic [ref=e269]: + - button "frame 3 39.4s" [ref=e270]: + - img "frame 3" [ref=e271] + - generic [ref=e272]: 39.4s + - button "📋" [ref=e273] + - button "删除该关键帧" [ref=e274]: + - img [ref=e275] + - generic: + - generic: + - generic: + - generic: 分镜 4 + - generic: 39.42s + - generic [ref=e278]: + - button "frame 4 1 43.1s" [ref=e279]: + - img "frame 4" [ref=e280] + - generic "1 个元素已抠图" [ref=e282]: "1" + - generic [ref=e283]: 43.1s + - button "📋" [ref=e284] + - button "删除该关键帧" [ref=e285]: + - img [ref=e286] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e289]: + - button "frame 5 45.0s" [ref=e290]: + - img "frame 5" [ref=e291] + - generic [ref=e292]: 45.0s + - button "📋" [ref=e293] + - button "删除该关键帧" [ref=e294]: + - img [ref=e295] + - generic: + - generic: + - generic: + - generic: 分镜 6 + - generic: 45.05s + - generic [ref=e298]: + - button "frame 6 53.6s" [ref=e299]: + - img "frame 6" [ref=e300] + - generic [ref=e301]: 53.6s + - button "📋" [ref=e302] + - button "删除该关键帧" [ref=e303]: + - img [ref=e304] + - generic: + - generic: + - generic: + - generic: 分镜 7 + - generic: 53.60s + - generic [ref=e307]: + - button "frame 7 56.0s" [ref=e308]: + - img "frame 7" [ref=e309] + - generic [ref=e310]: 56.0s + - button "📋" [ref=e311] + - button "删除该关键帧" [ref=e312]: + - img [ref=e313] + - generic: + - generic: + - generic: + - generic: 分镜 8 + - generic: 55.96s + - generic [ref=e316]: + - button "frame 8 58.4s" [ref=e317]: + - img "frame 8" [ref=e318] + - generic [ref=e319]: 58.4s + - button "📋" [ref=e320] + - button "删除该关键帧" [ref=e321]: + - img [ref=e322] + - generic: + - generic: + - generic: + - generic: 分镜 9 + - generic: 58.39s + - generic [ref=e325]: + - generic [ref=e327]: + - img [ref=e329] + - generic [ref=e333]: 镜头拆解 · 元素提取 + - generic [ref=e334]: + - img [ref=e335] + - button "钉住 · 锁定位置与尺寸" [ref=e339]: + - img [ref=e340] + - generic [ref=e343]: + - generic [ref=e344]: STEP 2 · 0/10 入编排 · 完成 + - generic [ref=e345]: + - text: 自动 10 张 · + - generic [ref=e346]: 1 已清洗 + - text: · + - generic [ref=e347]: 1/2 已抠图 + - text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材 + - generic "拖动调整宽度" [ref=e349] + - generic "拖动调整大小(宽 × 高)" [ref=e350] + - group [ref=e351]: + - generic [ref=e352]: + - generic [ref=e354]: + - img [ref=e356] + - generic [ref=e359]: 声音文案 · ASR + - button "钉住 · 锁定位置与尺寸" [ref=e362]: + - img [ref=e363] + - generic [ref=e366]: + - generic [ref=e367]: STEP 3 · 可选文案轨 · 待运行 + - generic [ref=e368]: Gemini 2.5 · 英文带时间戳分段 + - generic "拖动调整宽度" [ref=e370] + - generic "拖动调整大小(宽 × 高)" [ref=e371] + - group [ref=e372]: + - generic [ref=e373]: + - generic [ref=e375]: + - img [ref=e377] + - generic [ref=e381]: 翻译理解 · Translate + - button "钉住 · 锁定位置与尺寸" [ref=e384]: + - img [ref=e385] + - generic [ref=e388]: + - generic [ref=e389]: STEP 4 · EN → ZH · 待运行 + - generic [ref=e390]: 中文翻译 · 段落级 · 实时输出 + - generic "拖动调整宽度" [ref=e392] + - generic "拖动调整大小(宽 × 高)" [ref=e393] + - group [ref=e394]: + - generic [ref=e395]: + - generic [ref=e397]: + - button "透明骷髅" [ref=e398]: + - img "透明骷髅" [ref=e399] + - button "📋" [ref=e400] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e401]: + - generic [ref=e403]: + - img [ref=e405] + - generic [ref=e410]: 元素改造 · Storyboard + - generic [ref=e411]: + - img [ref=e412] + - button "钉住 · 锁定位置与尺寸" [ref=e416]: + - img [ref=e417] + - generic [ref=e420]: + - generic [ref=e421]: STEP 6 · 参考元素 → SKG 画面 · 完成 + - generic [ref=e422]: + - text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。 + - generic [ref=e423]: 已有 1 个提取元素 · 0 个分镜进入编排 + - button "进入分镜编排" [disabled] [ref=e424] + - generic "拖动调整宽度" [ref=e426] + - generic "拖动调整大小(宽 × 高)" [ref=e427] + - group [ref=e428]: + - generic [ref=e429]: + - generic [ref=e431]: + - img [ref=e433] + - generic [ref=e437]: 产品文案 · Rewrite + - button "钉住 · 锁定位置与尺寸" [ref=e440]: + - img [ref=e441] + - generic [ref=e444]: + - generic [ref=e445]: STEP 5 · 接 SKG 卖点 · 待运行 + - textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e446] + - generic [ref=e447]: 下一冲刺接入 + - generic "拖动调整宽度" [ref=e449] + - generic "拖动调整大小(宽 × 高)" [ref=e450] + - group [ref=e451]: + - generic [ref=e453]: + - generic [ref=e455]: + - img [ref=e457] + - generic [ref=e459]: 生成视频 · Video Gen + - button "钉住 · 锁定位置与尺寸" [ref=e462]: + - img [ref=e463] + - generic [ref=e466]: + - generic [ref=e467]: STEP 7 · 首帧 + 动作 prompt · 待运行 + - generic [ref=e468]: + - generic [ref=e469]: Seedance + - generic [ref=e470]: Kling + - generic [ref=e471]: Veo 3 + - generic "拖动调整宽度" [ref=e473] + - generic "拖动调整大小(宽 × 高)" [ref=e474] + - group [ref=e475]: + - generic [ref=e476]: + - generic [ref=e478]: + - img [ref=e480] + - generic [ref=e484]: 合成成品 · Compose + - button "钉住 · 锁定位置与尺寸" [ref=e487]: + - img [ref=e488] + - generic [ref=e491]: + - generic [ref=e492]: STEP 8 · ffmpeg + 字幕 · 待运行 + - generic [ref=e493]: + - text: 视频片段 + 字幕 / TTS + - text: → 最终 mp4 输出 + - generic "拖动调整宽度" [ref=e494] + - generic "拖动调整大小(宽 × 高)" [ref=e495] + - img + - generic "Control Panel" [ref=e496]: + - button "Zoom In" [ref=e497] [cursor=pointer]: + - img [ref=e498] + - button "Zoom Out" [ref=e500] [cursor=pointer]: + - img [ref=e501] + - button "Fit View" [ref=e503] [cursor=pointer]: + - img [ref=e504] + - button "Toggle Interactivity" [ref=e506] [cursor=pointer]: + - img [ref=e507] + - img "Mini Map" [ref=e510] + - region "Notifications alt+T": + - list: + - listitem [ref=e520]: + - img [ref=e522] + - generic [ref=e525]: 已自动排版 · 保留每个节点的尺寸 + - listitem [ref=e526]: + - img [ref=e528] + - generic [ref=e531]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮 + - alert [ref=e532] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T17-17-23-233Z.yml b/.playwright-mcp/page-2026-05-13T17-17-23-233Z.yml new file mode 100644 index 0000000..151684a --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-17-23-233Z.yml @@ -0,0 +1,36 @@ +- generic [active] [ref=e1]: + - button "Open Next.js Dev Tools" [ref=e7] [cursor=pointer]: + - img [ref=e8] + - main [ref=e14]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]: + - img [ref=e17] + - application [ref=e24]: + - group [ref=e27]: + - generic [ref=e29]: + - generic [ref=e30]: + - img [ref=e32] + - generic [ref=e35]: 输入 · Input + - button "钉住 · 锁定位置与尺寸" [ref=e38]: + - img [ref=e39] + - generic [ref=e42]: + - generic [ref=e43]: STEP 1 · 待运行 + - textbox "粘贴 TikTok 链接" [ref=e44] + - generic [ref=e45]: + - button "提交链接" [disabled] [ref=e46] + - button "上传" [ref=e47]: + - img [ref=e48] + - text: 上传 + - generic "拖动调整宽度" [ref=e52] + - generic "拖动调整大小(宽 × 高)" [ref=e53] + - img + - generic "Control Panel" [ref=e54]: + - button "Zoom In" [ref=e55] [cursor=pointer]: + - img [ref=e56] + - button "Zoom Out" [ref=e58] [cursor=pointer]: + - img [ref=e59] + - button "Fit View" [ref=e61] [cursor=pointer]: + - img [ref=e62] + - button "Toggle Interactivity" [ref=e64] [cursor=pointer]: + - img [ref=e65] + - img "Mini Map" [ref=e68] + - region "Notifications alt+T" \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T17-17-26-396Z.yml b/.playwright-mcp/page-2026-05-13T17-17-26-396Z.yml new file mode 100644 index 0000000..30b5327 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T17-17-26-396Z.yml @@ -0,0 +1,456 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e71]: + - button "Open issues overlay" [ref=e72]: + - generic [ref=e73]: + - generic [ref=e74]: "0" + - generic [ref=e75]: "1" + - generic [ref=e76]: Issue + - button "Collapse issues badge" [ref=e77]: + - img [ref=e78] + - main [ref=e14]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e16]: + - img [ref=e17] + - button "切到明亮主题" [ref=e81]: + - img [ref=e82] + - generic [ref=e22]: + - generic [ref=e90]: + - generic [ref=e91]: + - img [ref=e92] + - generic [ref=e97]: 分镜头编排 + - generic [ref=e98]: 0 分镜 · 0 元素 + - generic [ref=e99]: · 组织分镜画面 → 为生成视频做准备 + - button "展开编排" [disabled] [ref=e101]: + - img [ref=e102] + - text: 展开编排 + - application [ref=e24]: + - generic [ref=e26]: + - generic: + - generic: + - img: + - group "Edge from input to keyframe" [ref=e104] [cursor=pointer] + - img: + - group "Edge from input to asr" [ref=e107] [cursor=pointer] + - img: + - group "Edge from asr to translate" [ref=e110] [cursor=pointer] + - img: + - group "Edge from translate to rewrite" [ref=e113] [cursor=pointer] + - img: + - group "Edge from keyframe to storyboard" [ref=e116] [cursor=pointer] + - img: + - group "Edge from rewrite to storyboard" [ref=e119] [cursor=pointer] + - img: + - group "Edge from storyboard to videogen" [ref=e122] [cursor=pointer] + - img: + - group "Edge from videogen to compose" [ref=e125] [cursor=pointer] + - img: + - group "Edge from rewrite to compose" [ref=e128] [cursor=pointer] + - generic: + - group [ref=e27]: + - generic [ref=e28]: + - generic [ref=e131]: + - button "再上传一个视频" [ref=e132]: + - img [ref=e133] + - generic [ref=e134]: + - button "64.5s" [ref=e135]: + - generic [ref=e137]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e138]: + - button "72.4s" [ref=e139]: + - generic [ref=e141]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e142]: + - button "64.5s" [ref=e143]: + - generic [ref=e145]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e146]: + - button "71.4s" [ref=e147]: + - generic [ref=e149]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e150]: + - button "72.4s" [ref=e151]: + - generic [ref=e153]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e154]: + - button "71.4s" [ref=e155]: + - generic [ref=e157]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e158]: + - button "71.4s" [ref=e159]: + - generic [ref=e161]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e162]: + - button "71.4s" [ref=e163]: + - generic [ref=e165]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e166]: + - button "71.4s" [ref=e167]: + - generic [ref=e169]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e170]: + - button "71.4s" [ref=e171]: + - generic [ref=e173]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e174]: + - button "8.0s" [ref=e175]: + - generic [ref=e177]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e178]: + - button "8.0s" [ref=e179]: + - generic [ref=e181]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e182]: + - button "8.0s" [ref=e183]: + - generic [ref=e185]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e186]: + - button "8.0s" [ref=e187]: + - generic [ref=e189]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - button "…" [ref=e191]: + - img [ref=e193] + - generic [ref=e195]: … + - button "…" [ref=e197]: + - img [ref=e199] + - generic [ref=e201]: … + - button "…" [ref=e203]: + - img [ref=e205] + - generic [ref=e207]: … + - generic [ref=e29]: + - generic [ref=e30]: + - img [ref=e32] + - generic [ref=e35]: 输入 · Input + - generic [ref=e36]: + - img [ref=e208] + - button "钉住 · 锁定位置与尺寸" [ref=e38]: + - img [ref=e39] + - generic [ref=e42]: + - generic [ref=e43]: STEP 1 · 视频就绪 · 完成 + - textbox "再加一个 TK 链接" [ref=e211] + - generic [ref=e45]: + - button "+ 加链接" [disabled] [ref=e212] + - button "再传一个" [ref=e213]: + - img [ref=e48] + - text: 再传一个 + - generic [ref=e214]: + - generic [ref=e215]: 1080×1920 · 64.5s + - generic [ref=e216]: 🔗 链接 + - button "重新解析" [ref=e217] + - generic "拖动调整宽度" [ref=e52] + - generic "拖动调整大小(宽 × 高)" [ref=e53] + - group [ref=e218]: + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - button "frame 9 1.7s" [ref=e222]: + - img "frame 9" [ref=e223] + - generic [ref=e224]: 1.7s + - button "📋" [ref=e225] + - button "删除该关键帧" [ref=e226]: + - img [ref=e227] + - generic: + - generic: + - generic: + - generic: 分镜 10 + - generic: 1.66s + - generic [ref=e230]: + - button "frame 0 ✨ 24.7s" [ref=e231]: + - img "frame 0" [ref=e232] + - generic "已清洗" [ref=e234]: ✨ + - generic [ref=e235]: 24.7s + - button "📋" [ref=e236] + - button "删除该关键帧" [ref=e237]: + - img [ref=e238] + - generic: + - generic: + - generic: + - generic: 分镜 1 + - generic: 24.73s + - generic [ref=e241]: + - button "frame 1 33.6s" [ref=e242]: + - img "frame 1" [ref=e243] + - generic [ref=e244]: 33.6s + - button "📋" [ref=e245] + - button "删除该关键帧" [ref=e246]: + - img [ref=e247] + - generic: + - generic: + - generic: + - generic: 分镜 2 + - generic: 33.61s + - generic [ref=e250]: + - button "frame 2 37.7s" [ref=e251]: + - img "frame 2" [ref=e252] + - generic [ref=e253]: 37.7s + - button "📋" [ref=e254] + - button "删除该关键帧" [ref=e255]: + - img [ref=e256] + - generic: + - generic: + - generic: + - generic: 分镜 3 + - generic: 37.70s + - generic [ref=e259]: + - button "frame 3 39.4s" [ref=e260]: + - img "frame 3" [ref=e261] + - generic [ref=e262]: 39.4s + - button "📋" [ref=e263] + - button "删除该关键帧" [ref=e264]: + - img [ref=e265] + - generic: + - generic: + - generic: + - generic: 分镜 4 + - generic: 39.42s + - generic [ref=e268]: + - button "frame 4 1 43.1s" [ref=e269]: + - img "frame 4" [ref=e270] + - generic "1 个元素已抠图" [ref=e272]: "1" + - generic [ref=e273]: 43.1s + - button "📋" [ref=e274] + - button "删除该关键帧" [ref=e275]: + - img [ref=e276] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e279]: + - button "frame 5 45.0s" [ref=e280]: + - img "frame 5" [ref=e281] + - generic [ref=e282]: 45.0s + - button "📋" [ref=e283] + - button "删除该关键帧" [ref=e284]: + - img [ref=e285] + - generic: + - generic: + - generic: + - generic: 分镜 6 + - generic: 45.05s + - generic [ref=e288]: + - button "frame 6 53.6s" [ref=e289]: + - img "frame 6" [ref=e290] + - generic [ref=e291]: 53.6s + - button "📋" [ref=e292] + - button "删除该关键帧" [ref=e293]: + - img [ref=e294] + - generic: + - generic: + - generic: + - generic: 分镜 7 + - generic: 53.60s + - generic [ref=e297]: + - button "frame 7 56.0s" [ref=e298]: + - img "frame 7" [ref=e299] + - generic [ref=e300]: 56.0s + - button "📋" [ref=e301] + - button "删除该关键帧" [ref=e302]: + - img [ref=e303] + - generic: + - generic: + - generic: + - generic: 分镜 8 + - generic: 55.96s + - generic [ref=e306]: + - button "frame 8 58.4s" [ref=e307]: + - img "frame 8" [ref=e308] + - generic [ref=e309]: 58.4s + - button "📋" [ref=e310] + - button "删除该关键帧" [ref=e311]: + - img [ref=e312] + - generic: + - generic: + - generic: + - generic: 分镜 9 + - generic: 58.39s + - generic [ref=e315]: + - generic [ref=e317]: + - img [ref=e319] + - generic [ref=e323]: 镜头拆解 · 元素提取 + - generic [ref=e324]: + - img [ref=e325] + - button "钉住 · 锁定位置与尺寸" [ref=e329]: + - img [ref=e330] + - generic [ref=e333]: + - generic [ref=e334]: STEP 2 · 0/10 入编排 · 完成 + - generic [ref=e335]: + - text: 自动 10 张 · + - generic [ref=e336]: 1 已清洗 + - text: · + - generic [ref=e337]: 1/2 已抠图 + - text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材 + - generic "拖动调整宽度" [ref=e339] + - generic "拖动调整大小(宽 × 高)" [ref=e340] + - group [ref=e341]: + - generic [ref=e342]: + - generic [ref=e344]: + - img [ref=e346] + - generic [ref=e349]: 声音文案 · ASR + - button "钉住 · 锁定位置与尺寸" [ref=e352]: + - img [ref=e353] + - generic [ref=e356]: + - generic [ref=e357]: STEP 3 · 可选文案轨 · 待运行 + - generic [ref=e358]: Gemini 2.5 · 英文带时间戳分段 + - generic "拖动调整宽度" [ref=e360] + - generic "拖动调整大小(宽 × 高)" [ref=e361] + - group [ref=e362]: + - generic [ref=e363]: + - generic [ref=e365]: + - img [ref=e367] + - generic [ref=e371]: 翻译理解 · Translate + - button "钉住 · 锁定位置与尺寸" [ref=e374]: + - img [ref=e375] + - generic [ref=e378]: + - generic [ref=e379]: STEP 4 · EN → ZH · 待运行 + - generic [ref=e380]: 中文翻译 · 段落级 · 实时输出 + - generic "拖动调整宽度" [ref=e382] + - generic "拖动调整大小(宽 × 高)" [ref=e383] + - group [ref=e384]: + - generic [ref=e385]: + - generic [ref=e387]: + - button "透明骷髅" [ref=e388]: + - img "透明骷髅" [ref=e389] + - button "📋" [ref=e390] + - button "删除该提取图" [ref=e391]: + - img [ref=e392] + - generic: + - generic: + - generic: + - generic: 分镜 5 · 透明骷髅 + - generic: 43.13s + - generic [ref=e395]: + - generic [ref=e397]: + - img [ref=e399] + - generic [ref=e404]: 元素改造 · Storyboard + - generic [ref=e405]: + - img [ref=e406] + - button "钉住 · 锁定位置与尺寸" [ref=e410]: + - img [ref=e411] + - generic [ref=e414]: + - generic [ref=e415]: STEP 6 · 参考元素 → SKG 画面 · 完成 + - generic [ref=e416]: + - text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。 + - generic [ref=e417]: 已有 1 个提取元素 · 0 个分镜进入编排 + - button "进入分镜编排" [disabled] [ref=e418] + - generic "拖动调整宽度" [ref=e420] + - generic "拖动调整大小(宽 × 高)" [ref=e421] + - group [ref=e422]: + - generic [ref=e423]: + - generic [ref=e425]: + - img [ref=e427] + - generic [ref=e431]: 产品文案 · Rewrite + - button "钉住 · 锁定位置与尺寸" [ref=e434]: + - img [ref=e435] + - generic [ref=e438]: + - generic [ref=e439]: STEP 5 · 接 SKG 卖点 · 待运行 + - textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e440] + - generic [ref=e441]: 下一冲刺接入 + - generic "拖动调整宽度" [ref=e443] + - generic "拖动调整大小(宽 × 高)" [ref=e444] + - group [ref=e445]: + - generic [ref=e447]: + - generic [ref=e449]: + - img [ref=e451] + - generic [ref=e453]: 生成视频 · Video Gen + - button "钉住 · 锁定位置与尺寸" [ref=e456]: + - img [ref=e457] + - generic [ref=e460]: + - generic [ref=e461]: STEP 7 · 首帧 + 动作 prompt · 待运行 + - generic [ref=e462]: + - generic [ref=e463]: Seedance + - generic [ref=e464]: Kling + - generic [ref=e465]: Veo 3 + - generic "拖动调整宽度" [ref=e467] + - generic "拖动调整大小(宽 × 高)" [ref=e468] + - group [ref=e469]: + - generic [ref=e470]: + - generic [ref=e472]: + - img [ref=e474] + - generic [ref=e478]: 合成成品 · Compose + - button "钉住 · 锁定位置与尺寸" [ref=e481]: + - img [ref=e482] + - generic [ref=e485]: + - generic [ref=e486]: STEP 8 · ffmpeg + 字幕 · 待运行 + - generic [ref=e487]: + - text: 视频片段 + 字幕 / TTS + - text: → 最终 mp4 输出 + - generic "拖动调整宽度" [ref=e488] + - generic "拖动调整大小(宽 × 高)" [ref=e489] + - img + - generic "Control Panel" [ref=e54]: + - button "Zoom In" [ref=e55] [cursor=pointer]: + - img [ref=e56] + - button "Zoom Out" [ref=e58] [cursor=pointer]: + - img [ref=e59] + - button "Fit View" [ref=e61] [cursor=pointer]: + - img [ref=e62] + - button "Toggle Interactivity" [ref=e64] [cursor=pointer]: + - img [ref=e65] + - img "Mini Map" [ref=e68] + - region "Notifications alt+T": + - list: + - listitem [ref=e497]: + - img [ref=e499] + - generic [ref=e502]: 已自动排版 · 保留每个节点的尺寸 + - listitem [ref=e503]: + - img [ref=e505] + - generic [ref=e508]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮 + - alert [ref=e509] \ No newline at end of file diff --git a/web/app/page.tsx b/web/app/page.tsx index fbad0eb..162021b 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -18,7 +18,7 @@ import { StoryboardBar } from "@/components/storyboard-bar" import { StoryboardWorkbench } from "@/components/storyboard-workbench" import { addManualFrame, analyzeJob, createJob, getJob, listJobs, uploadJob, deleteFrame, deleteGeneratedImage, - deleteGeneratedVideo, generateStoryboardVideo, + deleteGeneratedVideo, deleteCutout, generateStoryboardVideo, type Job, type ImageRef, type StoryboardScene, } from "@/lib/api" import { VideoLightbox } from "@/components/video-lightbox" @@ -248,6 +248,17 @@ export default function Home() { } }, [activeJobId, setJob]) + const handleDeleteCutout = useCallback(async (frameIdx: number, elementId: string, cutoutId: string) => { + if (!activeJobId) return + try { + const updated = await deleteCutout(activeJobId, frameIdx, elementId, cutoutId) + setJob(updated) + toast.success("元素提取图已删除") + } catch (e) { + toast.error("删除失败:" + (e instanceof Error ? e.message : String(e))) + } + }, [activeJobId, setJob]) + const handleCopyImage = useCallback((ref: ImageRef) => { setClipboard(ref) toast.success(`已复制:${ref.label || (ref.kind === "keyframe" ? "关键帧" : "元素")} · 到分镜头编排工作台粘贴`) @@ -461,6 +472,7 @@ export default function Home() { onDeleteFrame: handleDeleteFrame, onDeleteGenerated: handleDeleteGenerated, onDeleteVideo: handleDeleteVideo, + onDeleteCutout: handleDeleteCutout, onOpenStoryboard: (idx: number) => setStoryboardFrame(idx), onOpenWorkbench: (idx?: number) => { if (typeof idx === "number") setStoryboardFrame(idx) @@ -469,7 +481,7 @@ export default function Home() { onCopyImage: handleCopyImage, pinnedNodes, onToggleNodePin: handleToggleNodePin, - }), [job, jobs, activeJobId, submitting, analyzing, selectedFrames, expandedFrame, framePanelScale, framePanelPinned, handleSubmit, handleUpload, handleAnalyze, handleToggleFrame, handleOpenFramePanel, handleFramePanelScaleChange, handleAddManualFrame, handleSwitchJob, setJob, handleDeleteFrame, handleDeleteGenerated, handleDeleteVideo, handleCopyImage, pinnedNodes, handleToggleNodePin]) + }), [job, jobs, activeJobId, submitting, analyzing, selectedFrames, expandedFrame, framePanelScale, framePanelPinned, handleSubmit, handleUpload, handleAnalyze, handleToggleFrame, handleOpenFramePanel, handleFramePanelScaleChange, handleAddManualFrame, handleSwitchJob, setJob, handleDeleteFrame, handleDeleteGenerated, handleDeleteVideo, handleDeleteCutout, handleCopyImage, pinnedNodes, handleToggleNodePin]) // 用 useNodesState 让 ReactFlow 自己管位置(避免轮询时重置 drag) const savedSizes = useMemo(() => loadNodeSizes(), []) diff --git a/web/components/nodes/index.tsx b/web/components/nodes/index.tsx index a6792e7..cce460a 100644 --- a/web/components/nodes/index.tsx +++ b/web/components/nodes/index.tsx @@ -43,6 +43,7 @@ export interface NodeData { onDeleteFrame?: (idx: number) => void // 删整张关键帧 onDeleteGenerated?: (frameIdx: number, genId: string) => void // 删单张生成图 onDeleteVideo?: (videoId: string) => void // 删 Video Gen 任务 + onDeleteCutout?: (frameIdx: number, elementId: string, cutoutId: string) => void // 删元素提取图 onOpenStoryboard?: (frameIdx: number) => void // 打开分镜头编排专属面板 onOpenWorkbench?: (frameIdx?: number) => void // 展开顶部分镜编排内嵌面板 onCopyImage?: (ref: ImageRef) => void // 复制图片到全局剪贴板(粘贴到分镜头编排插槽) @@ -98,7 +99,7 @@ export function InputNode({ data, selected }: NodeProps<{ data: NodeData }> | an const videoRef = useRef(null) const job = d.job - // 点击 input 节点外的任何位置 → 取消 pin + // 点击 input 节点外的任何位置 → 取消 pin(capture 阶段,避免 ReactFlow pane 拦截) useEffect(() => { if (pinnedPreviewJob === null) return const handler = (e: MouseEvent) => { @@ -106,8 +107,8 @@ export function InputNode({ data, selected }: NodeProps<{ data: NodeData }> | an if (t.closest('.react-flow__node[data-id="input"]')) return setPinnedPreviewJob(null) } - document.addEventListener("mousedown", handler) - return () => document.removeEventListener("mousedown", handler) + document.addEventListener("mousedown", handler, true) + return () => document.removeEventListener("mousedown", handler, true) }, [pinnedPreviewJob]) // 是否已下载 → 显示视频 + 解析按钮 @@ -400,7 +401,7 @@ export function KeyframeNode({ data, selected }: any) { const aspectStr = d.job && d.job.height > 0 ? `${d.job.width}/${d.job.height}` : "9/16" const [pinnedPreviewFrame, setPinnedPreviewFrame] = useState(null) - // 点击 keyframe 节点外的任何位置 → 取消 pin + // 点击 keyframe 节点外的任何位置 → 取消 pin(capture 阶段,避免 ReactFlow pane 拦截) useEffect(() => { if (pinnedPreviewFrame === null) return const handler = (e: MouseEvent) => { @@ -408,8 +409,8 @@ export function KeyframeNode({ data, selected }: any) { if (t.closest('.react-flow__node[data-id="keyframe"]')) return setPinnedPreviewFrame(null) } - document.addEventListener("mousedown", handler) - return () => document.removeEventListener("mousedown", handler) + document.addEventListener("mousedown", handler, true) + return () => document.removeEventListener("mousedown", handler, true) }, [pinnedPreviewFrame]) return ( @@ -849,6 +850,19 @@ const IMAGEGEN_WIDTH = 360 export function StoryboardNode({ data, selected }: any) { const d: NodeData = data const job = d?.job + const [pinnedPreviewCutout, setPinnedPreviewCutout] = useState(null) + + // 点击 storyboard 节点外 → 取消 pin + useEffect(() => { + if (pinnedPreviewCutout === null) return + const handler = (e: MouseEvent) => { + const t = e.target as HTMLElement + if (t.closest('.react-flow__node[data-id="storyboard"]')) return + setPinnedPreviewCutout(null) + } + document.addEventListener("mousedown", handler, true) + return () => document.removeEventListener("mousedown", handler, true) + }, [pinnedPreviewCutout]) // 上方浮条 = 所有 frame 的 elements 已提取图("分镜头编排"的输入素材) type ElPreview = { frameIdx: number; elementId: string; name: string; src: string; cid: string; frameSrc: string; timestamp: number } @@ -882,30 +896,30 @@ export function StoryboardNode({ data, selected }: any) { return (
- {/* 节点上方:所有元素 crop 图(编排输入素材)· 跟 keyframe 节点样式一致 */} + {/* 节点上方:所有元素 crop 图(编排输入素材)— 视觉类节点统一样板:单行横滚 + 左上复制 + 右上删除 + hover/click pin 大预览 */} {elementCrops.length > 0 && job && (
{elementCrops.map((p) => { const key = `${p.frameIdx}_${p.elementId}` + const isPinned = pinnedPreviewCutout === key return (
- {/* 复制按钮:常驻可见 — 复制元素提取图到剪贴板 */} + {/* 左上:复制 */} {d.onCopyImage && ( )} - {/* hover 预览 — 和关键帧节点保持一致:只看来源原帧,不额外展示元素面板 */} -
-
-
- -
-
- 分镜 {p.frameIdx + 1} - {p.timestamp.toFixed(2)}s -
-
-
+ {/* 右上:删除(hover 浮出) */} + {d.onDeleteCutout && ( + + )} + setPinnedPreviewCutout(null)} + />
) })}