From 7804fd13f8824d3c3d8763f09bb3695d9ae897ee Mon Sep 17 00:00:00 2001 From: kang Date: Thu, 14 May 2026 00:54:42 +0800 Subject: [PATCH] auto-save 2026-05-14 00:54 (+4, ~2) --- .memory/worklog.json | 13 + .../page-2026-05-13T16-50-40-160Z.yml | 46 ++ .../page-2026-05-13T16-50-42-256Z.yml | 449 ++++++++++++++++++ .../page-2026-05-13T16-53-25-437Z.yml | 31 ++ .../page-2026-05-13T16-53-27-783Z.yml | 449 ++++++++++++++++++ web/app/page.tsx | 61 +++ 6 files changed, 1049 insertions(+) create mode 100644 .playwright-mcp/page-2026-05-13T16-50-40-160Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T16-50-42-256Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T16-53-25-437Z.yml create mode 100644 .playwright-mcp/page-2026-05-13T16-53-27-783Z.yml diff --git a/.memory/worklog.json b/.memory/worklog.json index 5de379c..33dfa5a 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -2698,6 +2698,19 @@ "message": "auto-save 2026-05-14 00:42 (+4, ~3)", "hash": "042efdc", "files_changed": 7 + }, + { + "ts": "2026-05-14T00:48:59+08:00", + "type": "commit", + "message": "auto-save 2026-05-14 00:48 (+4, ~3)", + "hash": "e8a653e", + "files_changed": 7 + }, + { + "ts": "2026-05-13T16:53:10Z", + "type": "session-heartbeat", + "message": "Claude 会话活跃 · 最近命令:claude · 2 项未提交变更 · 最近提交:auto-save 2026-05-14 00:48 (+4, ~3)", + "files_changed": 2 } ] } diff --git a/.playwright-mcp/page-2026-05-13T16-50-40-160Z.yml b/.playwright-mcp/page-2026-05-13T16-50-40-160Z.yml new file mode 100644 index 0000000..5b7a481 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T16-50-40-160Z.yml @@ -0,0 +1,46 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e13]: + - button "Open issues overlay" [ref=e14]: + - generic [ref=e15]: + - generic [ref=e16]: "0" + - generic [ref=e17]: "1" + - generic [ref=e18]: Issue + - button "Collapse issues badge" [ref=e19]: + - img [ref=e20] + - main [ref=e23]: + - button "自动整理 · 所有节点回默认位置 / 宽度(保留钉子状态)" [ref=e25]: + - img [ref=e26] + - button "切到明亮主题" [ref=e32]: + - img [ref=e33] + - application [ref=e41]: + - group [ref=e44] [cursor=pointer]: + - generic [ref=e46]: + - generic [ref=e47]: + - img [ref=e49] + - generic [ref=e52]: 输入 · Input + - button "已钉住 · 点击取消(恢复可拖、可缩放)" [ref=e55]: + - img [ref=e56] + - generic [ref=e58]: + - generic [ref=e59]: STEP 1 · 待运行 + - textbox "粘贴 TikTok 链接" [ref=e60] + - generic [ref=e61]: + - button "提交链接" [disabled] [ref=e62] + - button "上传" [ref=e63]: + - img [ref=e64] + - text: 上传 + - img + - generic "Control Panel" [ref=e68]: + - button "Zoom In" [ref=e69] [cursor=pointer]: + - img [ref=e70] + - button "Zoom Out" [ref=e72] [cursor=pointer]: + - img [ref=e73] + - button "Fit View" [ref=e75] [cursor=pointer]: + - img [ref=e76] + - button "Toggle Interactivity" [ref=e78] [cursor=pointer]: + - img [ref=e79] + - img "Mini Map" [ref=e82] + - region "Notifications alt+T" + - alert [ref=e85] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T16-50-42-256Z.yml b/.playwright-mcp/page-2026-05-13T16-50-42-256Z.yml new file mode 100644 index 0000000..fe9b071 --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T16-50-42-256Z.yml @@ -0,0 +1,449 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e13]: + - button "Open issues overlay" [ref=e14]: + - generic [ref=e15]: + - generic [ref=e16]: "0" + - generic [ref=e17]: "1" + - generic [ref=e18]: Issue + - button "Collapse issues badge" [ref=e19]: + - img [ref=e20] + - main [ref=e23]: + - button "自动整理 · 所有节点回默认位置 / 宽度(保留钉子状态)" [ref=e25]: + - img [ref=e26] + - button "切到明亮主题" [ref=e32]: + - img [ref=e33] + - generic [ref=e39]: + - generic [ref=e88]: + - generic [ref=e89]: + - img [ref=e90] + - generic [ref=e95]: 分镜头编排 + - generic [ref=e96]: 0 分镜 · 0 元素 + - generic [ref=e97]: · 组织分镜画面 → 为生成视频做准备 + - button "展开编排" [disabled] [ref=e99]: + - img [ref=e100] + - text: 展开编排 + - application [ref=e41]: + - generic [ref=e43]: + - generic: + - generic: + - img: + - group "Edge from input to keyframe" [ref=e102] [cursor=pointer] + - img: + - group "Edge from input to asr" [ref=e105] [cursor=pointer] + - img: + - group "Edge from asr to translate" + - img: + - group "Edge from translate to rewrite" [ref=e108] [cursor=pointer] + - img: + - group "Edge from keyframe to storyboard" [ref=e111] [cursor=pointer] + - img: + - group "Edge from rewrite to storyboard" [ref=e114] [cursor=pointer] + - img: + - group "Edge from storyboard to videogen" [ref=e117] [cursor=pointer] + - img: + - group "Edge from videogen to compose" [ref=e120] [cursor=pointer] + - img: + - group "Edge from rewrite to compose" [ref=e123] [cursor=pointer] + - generic: + - group [ref=e44] [cursor=pointer]: + - generic [ref=e45]: + - generic [ref=e126]: + - button "再上传一个视频" [ref=e127]: + - img [ref=e128] + - generic [ref=e129]: + - button "64.5s" [ref=e130]: + - generic [ref=e132]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e133]: + - button "72.4s" [ref=e134]: + - generic [ref=e136]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e137]: + - button "64.5s" [ref=e138]: + - generic [ref=e140]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e141]: + - button "71.4s" [ref=e142]: + - generic [ref=e144]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e145]: + - button "72.4s" [ref=e146]: + - generic [ref=e148]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e149]: + - button "71.4s" [ref=e150]: + - generic [ref=e152]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e153]: + - button "71.4s" [ref=e154]: + - generic [ref=e156]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e157]: + - button "71.4s" [ref=e158]: + - generic [ref=e160]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e161]: + - button "71.4s" [ref=e162]: + - generic [ref=e164]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e165]: + - button "71.4s" [ref=e166]: + - generic [ref=e168]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e169]: + - button "8.0s" [ref=e170]: + - generic [ref=e172]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e173]: + - button "8.0s" [ref=e174]: + - generic [ref=e176]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e177]: + - button "8.0s" [ref=e178]: + - generic [ref=e180]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e181]: + - button "8.0s" [ref=e182]: + - generic [ref=e184]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - button "…" [ref=e186]: + - img [ref=e188] + - generic [ref=e190]: … + - button "…" [ref=e192]: + - img [ref=e194] + - generic [ref=e196]: … + - button "…" [ref=e198]: + - img [ref=e200] + - generic [ref=e202]: … + - generic [ref=e46]: + - generic [ref=e47]: + - img [ref=e49] + - generic [ref=e52]: 输入 · Input + - generic [ref=e53]: + - img [ref=e203] + - button "已钉住 · 点击取消(恢复可拖、可缩放)" [ref=e55]: + - img [ref=e56] + - generic [ref=e58]: + - generic [ref=e59]: STEP 1 · 视频就绪 · 完成 + - textbox "再加一个 TK 链接" [ref=e206] + - generic [ref=e61]: + - button "+ 加链接" [disabled] [ref=e207] + - button "再传一个" [ref=e208]: + - img [ref=e64] + - text: 再传一个 + - generic [ref=e209]: + - generic [ref=e210]: 1080×1920 · 64.5s + - generic [ref=e211]: 🔗 链接 + - button "重新解析" [ref=e212] + - group [ref=e213]: + - generic [ref=e214]: + - generic [ref=e215]: + - generic [ref=e216]: + - button "frame 9 1.7s" [ref=e217]: + - img "frame 9" [ref=e218] + - generic [ref=e219]: 1.7s + - button "📋" [ref=e220] + - button "删除该关键帧" [ref=e221]: + - img [ref=e222] + - generic: + - generic: + - generic: + - generic: 分镜 10 + - generic: 1.66s + - generic [ref=e225]: + - button "frame 0 ✨ 24.7s" [ref=e226]: + - img "frame 0" [ref=e227] + - generic "已清洗" [ref=e229]: ✨ + - generic [ref=e230]: 24.7s + - button "📋" [ref=e231] + - button "删除该关键帧" [ref=e232]: + - img [ref=e233] + - generic: + - generic: + - generic: + - generic: 分镜 1 + - generic: 24.73s + - generic [ref=e236]: + - button "frame 1 33.6s" [ref=e237]: + - img "frame 1" [ref=e238] + - generic [ref=e239]: 33.6s + - button "📋" [ref=e240] + - button "删除该关键帧" [ref=e241]: + - img [ref=e242] + - generic: + - generic: + - generic: + - generic: 分镜 2 + - generic: 33.61s + - generic [ref=e245]: + - button "frame 2 37.7s" [ref=e246]: + - img "frame 2" [ref=e247] + - generic [ref=e248]: 37.7s + - button "📋" [ref=e249] + - button "删除该关键帧" [ref=e250]: + - img [ref=e251] + - generic: + - generic: + - generic: + - generic: 分镜 3 + - generic: 37.70s + - generic [ref=e254]: + - button "frame 3 39.4s" [ref=e255]: + - img "frame 3" [ref=e256] + - generic [ref=e257]: 39.4s + - button "📋" [ref=e258] + - button "删除该关键帧" [ref=e259]: + - img [ref=e260] + - generic: + - generic: + - generic: + - generic: 分镜 4 + - generic: 39.42s + - generic [ref=e263]: + - button "frame 4 1 43.1s" [ref=e264]: + - img "frame 4" [ref=e265] + - generic "1 个元素已抠图" [ref=e267]: "1" + - generic [ref=e268]: 43.1s + - button "📋" [ref=e269] + - button "删除该关键帧" [ref=e270]: + - img [ref=e271] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e274]: + - button "frame 5 45.0s" [ref=e275]: + - img "frame 5" [ref=e276] + - generic [ref=e277]: 45.0s + - button "📋" [ref=e278] + - button "删除该关键帧" [ref=e279]: + - img [ref=e280] + - generic: + - generic: + - generic: + - generic: 分镜 6 + - generic: 45.05s + - generic [ref=e283]: + - button "frame 6 53.6s" [ref=e284]: + - img "frame 6" [ref=e285] + - generic [ref=e286]: 53.6s + - button "📋" [ref=e287] + - button "删除该关键帧" [ref=e288]: + - img [ref=e289] + - generic: + - generic: + - generic: + - generic: 分镜 7 + - generic: 53.60s + - generic [ref=e292]: + - button "frame 7 56.0s" [ref=e293]: + - img "frame 7" [ref=e294] + - generic [ref=e295]: 56.0s + - button "📋" [ref=e296] + - button "删除该关键帧" [ref=e297]: + - img [ref=e298] + - generic: + - generic: + - generic: + - generic: 分镜 8 + - generic: 55.96s + - generic [ref=e301]: + - button "frame 8 58.4s" [ref=e302]: + - img "frame 8" [ref=e303] + - generic [ref=e304]: 58.4s + - button "📋" [ref=e305] + - button "删除该关键帧" [ref=e306]: + - img [ref=e307] + - generic: + - generic: + - generic: + - generic: 分镜 9 + - generic: 58.39s + - generic [ref=e310]: + - generic [ref=e312]: + - img [ref=e314] + - generic [ref=e318]: 镜头拆解 · 元素提取 + - generic [ref=e319]: + - img [ref=e320] + - button "钉住 · 锁定位置与尺寸" [ref=e324]: + - img [ref=e325] + - generic [ref=e328]: + - generic [ref=e329]: STEP 2 · 0/10 入编排 · 完成 + - generic [ref=e330]: + - text: 自动 10 张 · + - generic [ref=e331]: 1 已清洗 + - text: · + - generic [ref=e332]: 1/2 已抠图 + - text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材 + - generic "拖动调整宽度" [ref=e334] + - generic "拖动调整大小(宽 × 高)" [ref=e335] + - group [ref=e336]: + - generic [ref=e337]: + - generic [ref=e339]: + - img [ref=e341] + - generic [ref=e344]: 声音文案 · ASR + - button "钉住 · 锁定位置与尺寸" [ref=e347]: + - img [ref=e348] + - generic [ref=e351]: + - generic [ref=e352]: STEP 3 · 可选文案轨 · 待运行 + - generic [ref=e353]: Gemini 2.5 · 英文带时间戳分段 + - generic "拖动调整宽度" [ref=e355] + - generic "拖动调整大小(宽 × 高)" [ref=e356] + - group [ref=e357]: + - generic [ref=e358]: + - generic [ref=e360]: + - img [ref=e362] + - generic [ref=e366]: 翻译理解 · Translate + - button "钉住 · 锁定位置与尺寸" [ref=e369]: + - img [ref=e370] + - generic [ref=e373]: + - generic [ref=e374]: STEP 4 · EN → ZH · 待运行 + - generic [ref=e375]: 中文翻译 · 段落级 · 实时输出 + - generic "拖动调整宽度" [ref=e377] + - generic "拖动调整大小(宽 × 高)" [ref=e378] + - group [ref=e379]: + - generic [ref=e380]: + - generic [ref=e382]: + - button "透明骷髅" [ref=e383]: + - img "透明骷髅" [ref=e384] + - button "📋" [ref=e385] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e386]: + - generic [ref=e388]: + - img [ref=e390] + - generic [ref=e395]: 元素改造 · Storyboard + - generic [ref=e396]: + - img [ref=e397] + - button "钉住 · 锁定位置与尺寸" [ref=e401]: + - img [ref=e402] + - generic [ref=e405]: + - generic [ref=e406]: STEP 6 · 参考元素 → SKG 画面 · 完成 + - generic [ref=e407]: + - text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。 + - generic [ref=e408]: 已有 1 个提取元素 · 0 个分镜进入编排 + - button "进入分镜编排" [disabled] [ref=e409] + - generic "拖动调整宽度" [ref=e411] + - generic "拖动调整大小(宽 × 高)" [ref=e412] + - group [ref=e413]: + - generic [ref=e414]: + - generic [ref=e416]: + - img [ref=e418] + - generic [ref=e422]: 产品文案 · Rewrite + - button "钉住 · 锁定位置与尺寸" [ref=e425]: + - img [ref=e426] + - generic [ref=e429]: + - generic [ref=e430]: STEP 5 · 接 SKG 卖点 · 待运行 + - textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e431] + - generic [ref=e432]: 下一冲刺接入 + - generic "拖动调整宽度" [ref=e434] + - generic "拖动调整大小(宽 × 高)" [ref=e435] + - group [ref=e436]: + - generic [ref=e438]: + - generic [ref=e440]: + - img [ref=e442] + - generic [ref=e444]: 生成视频 · Video Gen + - button "钉住 · 锁定位置与尺寸" [ref=e447]: + - img [ref=e448] + - generic [ref=e451]: + - generic [ref=e452]: STEP 7 · 首帧 + 动作 prompt · 待运行 + - generic [ref=e453]: + - generic [ref=e454]: Seedance + - generic [ref=e455]: Kling + - generic [ref=e456]: Veo 3 + - generic "拖动调整宽度" [ref=e458] + - generic "拖动调整大小(宽 × 高)" [ref=e459] + - group [ref=e460]: + - generic [ref=e461]: + - generic [ref=e463]: + - img [ref=e465] + - generic [ref=e469]: 合成成品 · Compose + - button "钉住 · 锁定位置与尺寸" [ref=e472]: + - img [ref=e473] + - generic [ref=e476]: + - generic [ref=e477]: STEP 8 · ffmpeg + 字幕 · 待运行 + - generic [ref=e478]: + - text: 视频片段 + 字幕 / TTS + - text: → 最终 mp4 输出 + - generic "拖动调整宽度" [ref=e479] + - generic "拖动调整大小(宽 × 高)" [ref=e480] + - img + - generic "Control Panel" [ref=e68]: + - button "Zoom In" [ref=e69] [cursor=pointer]: + - img [ref=e70] + - button "Zoom Out" [ref=e72] [cursor=pointer]: + - img [ref=e73] + - button "Fit View" [ref=e75] [cursor=pointer]: + - img [ref=e76] + - button "Toggle Interactivity" [ref=e78] [cursor=pointer]: + - img [ref=e79] + - img "Mini Map" [ref=e82] + - region "Notifications alt+T": + - list: + - listitem [ref=e488]: + - img [ref=e490] + - generic [ref=e493]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮 + - alert [ref=e85] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T16-53-25-437Z.yml b/.playwright-mcp/page-2026-05-13T16-53-25-437Z.yml new file mode 100644 index 0000000..d11cbde --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T16-53-25-437Z.yml @@ -0,0 +1,31 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e13]: + - button "Open issues overlay" [ref=e14]: + - generic [ref=e15]: + - generic [ref=e16]: "0" + - generic [ref=e17]: "1" + - generic [ref=e18]: Issue + - button "Collapse issues badge" [ref=e19]: + - img [ref=e20] + - main [ref=e23]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e25]: + - img [ref=e26] + - button "切到明亮主题" [ref=e32]: + - img [ref=e33] + - application [ref=e41]: + - img + - generic "Control Panel" [ref=e44]: + - button "Zoom In" [ref=e45] [cursor=pointer]: + - img [ref=e46] + - button "Zoom Out" [ref=e48] [cursor=pointer]: + - img [ref=e49] + - button "Fit View" [ref=e51] [cursor=pointer]: + - img [ref=e52] + - button "Toggle Interactivity" [ref=e54] [cursor=pointer]: + - img [ref=e55] + - img "Mini Map" [ref=e58] + - region "Notifications alt+T" + - alert [ref=e60] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-13T16-53-27-783Z.yml b/.playwright-mcp/page-2026-05-13T16-53-27-783Z.yml new file mode 100644 index 0000000..c9e753c --- /dev/null +++ b/.playwright-mcp/page-2026-05-13T16-53-27-783Z.yml @@ -0,0 +1,449 @@ +- generic [active] [ref=e1]: + - generic [ref=e6] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e7]: + - img [ref=e8] + - generic [ref=e13]: + - button "Open issues overlay" [ref=e14]: + - generic [ref=e15]: + - generic [ref=e16]: "0" + - generic [ref=e17]: "1" + - generic [ref=e18]: Issue + - button "Collapse issues badge" [ref=e19]: + - img [ref=e20] + - main [ref=e23]: + - button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e25]: + - img [ref=e26] + - button "切到明亮主题" [ref=e32]: + - img [ref=e33] + - generic [ref=e39]: + - generic [ref=e63]: + - generic [ref=e64]: + - img [ref=e65] + - generic [ref=e70]: 分镜头编排 + - generic [ref=e71]: 0 分镜 · 0 元素 + - generic [ref=e72]: · 组织分镜画面 → 为生成视频做准备 + - button "展开编排" [disabled] [ref=e74]: + - img [ref=e75] + - text: 展开编排 + - application [ref=e41]: + - generic [ref=e43]: + - generic: + - generic: + - img: + - group "Edge from input to keyframe" [ref=e77] [cursor=pointer] + - img: + - group "Edge from input to asr" [ref=e80] [cursor=pointer] + - img: + - group "Edge from asr to translate" + - img: + - group "Edge from translate to rewrite" [ref=e83] [cursor=pointer] + - img: + - group "Edge from keyframe to storyboard" [ref=e86] [cursor=pointer] + - img: + - group "Edge from rewrite to storyboard" [ref=e89] [cursor=pointer] + - img: + - group "Edge from storyboard to videogen" [ref=e92] [cursor=pointer] + - img: + - group "Edge from videogen to compose" [ref=e95] [cursor=pointer] + - img: + - group "Edge from rewrite to compose" [ref=e98] [cursor=pointer] + - generic: + - group [ref=e101] [cursor=pointer]: + - generic [ref=e102]: + - generic [ref=e103]: + - button "再上传一个视频" [ref=e104]: + - img [ref=e105] + - generic [ref=e106]: + - button "64.5s" [ref=e107]: + - generic [ref=e109]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e110]: + - button "72.4s" [ref=e111]: + - generic [ref=e113]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e114]: + - button "64.5s" [ref=e115]: + - generic [ref=e117]: 64.5s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 64.5s + - generic [ref=e118]: + - button "71.4s" [ref=e119]: + - generic [ref=e121]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e122]: + - button "72.4s" [ref=e123]: + - generic [ref=e125]: 72.4s + - generic: + - generic: + - generic: + - generic: 576×1024 + - generic: 72.4s + - generic [ref=e126]: + - button "71.4s" [ref=e127]: + - generic [ref=e129]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - generic [ref=e130]: + - button "71.4s" [ref=e131]: + - generic [ref=e133]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.4s + - 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 "71.4s" [ref=e139]: + - generic [ref=e141]: 71.4s + - generic: + - generic: + - generic: + - generic: 1080×1920 + - generic: 71.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 "8.0s" [ref=e147]: + - generic [ref=e149]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e150]: + - button "8.0s" [ref=e151]: + - generic [ref=e153]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e154]: + - button "8.0s" [ref=e155]: + - generic [ref=e157]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - generic [ref=e158]: + - button "8.0s" [ref=e159]: + - generic [ref=e161]: 8.0s + - generic: + - generic: + - generic: + - generic: 640×360 + - generic: 8.0s + - button "…" [ref=e163]: + - img [ref=e165] + - generic [ref=e167]: … + - button "…" [ref=e169]: + - img [ref=e171] + - generic [ref=e173]: … + - button "…" [ref=e175]: + - img [ref=e177] + - generic [ref=e179]: … + - generic [ref=e180]: + - generic [ref=e181]: + - img [ref=e183] + - generic [ref=e186]: 输入 · Input + - generic [ref=e187]: + - img [ref=e188] + - button "已钉住 · 点击取消(恢复可拖、可缩放)" [ref=e192]: + - img [ref=e193] + - generic [ref=e195]: + - generic [ref=e196]: STEP 1 · 视频就绪 · 完成 + - textbox "再加一个 TK 链接" [ref=e197] + - generic [ref=e198]: + - button "+ 加链接" [disabled] [ref=e199] + - button "再传一个" [ref=e200]: + - img [ref=e201] + - text: 再传一个 + - generic [ref=e204]: + - generic [ref=e205]: 1080×1920 · 64.5s + - generic [ref=e206]: 🔗 链接 + - button "重新解析" [ref=e207] + - group [ref=e209]: + - generic [ref=e210]: + - generic [ref=e211]: + - generic [ref=e212]: + - button "frame 9 1.7s" [ref=e213]: + - img "frame 9" [ref=e214] + - generic [ref=e215]: 1.7s + - button "📋" [ref=e216] + - button "删除该关键帧" [ref=e217]: + - img [ref=e218] + - generic: + - generic: + - generic: + - generic: 分镜 10 + - generic: 1.66s + - generic [ref=e221]: + - button "frame 0 ✨ 24.7s" [ref=e222]: + - img "frame 0" [ref=e223] + - generic "已清洗" [ref=e225]: ✨ + - generic [ref=e226]: 24.7s + - button "📋" [ref=e227] + - button "删除该关键帧" [ref=e228]: + - img [ref=e229] + - generic: + - generic: + - generic: + - generic: 分镜 1 + - generic: 24.73s + - generic [ref=e232]: + - button "frame 1 33.6s" [ref=e233]: + - img "frame 1" [ref=e234] + - generic [ref=e235]: 33.6s + - button "📋" [ref=e236] + - button "删除该关键帧" [ref=e237]: + - img [ref=e238] + - generic: + - generic: + - generic: + - generic: 分镜 2 + - generic: 33.61s + - generic [ref=e241]: + - button "frame 2 37.7s" [ref=e242]: + - img "frame 2" [ref=e243] + - generic [ref=e244]: 37.7s + - button "📋" [ref=e245] + - button "删除该关键帧" [ref=e246]: + - img [ref=e247] + - generic: + - generic: + - generic: + - generic: 分镜 3 + - generic: 37.70s + - generic [ref=e250]: + - button "frame 3 39.4s" [ref=e251]: + - img "frame 3" [ref=e252] + - generic [ref=e253]: 39.4s + - button "📋" [ref=e254] + - button "删除该关键帧" [ref=e255]: + - img [ref=e256] + - generic: + - generic: + - generic: + - generic: 分镜 4 + - generic: 39.42s + - generic [ref=e259]: + - button "frame 4 1 43.1s" [ref=e260]: + - img "frame 4" [ref=e261] + - generic "1 个元素已抠图" [ref=e263]: "1" + - generic [ref=e264]: 43.1s + - button "📋" [ref=e265] + - button "删除该关键帧" [ref=e266]: + - img [ref=e267] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e270]: + - button "frame 5 45.0s" [ref=e271]: + - img "frame 5" [ref=e272] + - generic [ref=e273]: 45.0s + - button "📋" [ref=e274] + - button "删除该关键帧" [ref=e275]: + - img [ref=e276] + - generic: + - generic: + - generic: + - generic: 分镜 6 + - generic: 45.05s + - generic [ref=e279]: + - button "frame 6 53.6s" [ref=e280]: + - img "frame 6" [ref=e281] + - generic [ref=e282]: 53.6s + - button "📋" [ref=e283] + - button "删除该关键帧" [ref=e284]: + - img [ref=e285] + - generic: + - generic: + - generic: + - generic: 分镜 7 + - generic: 53.60s + - generic [ref=e288]: + - button "frame 7 56.0s" [ref=e289]: + - img "frame 7" [ref=e290] + - generic [ref=e291]: 56.0s + - button "📋" [ref=e292] + - button "删除该关键帧" [ref=e293]: + - img [ref=e294] + - generic: + - generic: + - generic: + - generic: 分镜 8 + - generic: 55.96s + - generic [ref=e297]: + - button "frame 8 58.4s" [ref=e298]: + - img "frame 8" [ref=e299] + - generic [ref=e300]: 58.4s + - button "📋" [ref=e301] + - button "删除该关键帧" [ref=e302]: + - img [ref=e303] + - generic: + - generic: + - generic: + - generic: 分镜 9 + - generic: 58.39s + - generic [ref=e306]: + - generic [ref=e308]: + - img [ref=e310] + - generic [ref=e314]: 镜头拆解 · 元素提取 + - generic [ref=e315]: + - img [ref=e316] + - button "钉住 · 锁定位置与尺寸" [ref=e320]: + - img [ref=e321] + - generic [ref=e324]: + - generic [ref=e325]: STEP 2 · 0/10 入编排 · 完成 + - generic [ref=e326]: + - text: 自动 10 张 · + - generic [ref=e327]: 1 已清洗 + - text: · + - generic [ref=e328]: 1/2 已抠图 + - text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材 + - generic "拖动调整宽度" [ref=e330] + - generic "拖动调整大小(宽 × 高)" [ref=e331] + - group [ref=e332]: + - generic [ref=e333]: + - generic [ref=e335]: + - img [ref=e337] + - generic [ref=e340]: 声音文案 · ASR + - button "钉住 · 锁定位置与尺寸" [ref=e343]: + - img [ref=e344] + - generic [ref=e347]: + - generic [ref=e348]: STEP 3 · 可选文案轨 · 待运行 + - generic [ref=e349]: Gemini 2.5 · 英文带时间戳分段 + - generic "拖动调整宽度" [ref=e351] + - generic "拖动调整大小(宽 × 高)" [ref=e352] + - group [ref=e353]: + - generic [ref=e354]: + - generic [ref=e356]: + - img [ref=e358] + - generic [ref=e362]: 翻译理解 · Translate + - button "钉住 · 锁定位置与尺寸" [ref=e365]: + - img [ref=e366] + - generic [ref=e369]: + - generic [ref=e370]: STEP 4 · EN → ZH · 待运行 + - generic [ref=e371]: 中文翻译 · 段落级 · 实时输出 + - generic "拖动调整宽度" [ref=e373] + - generic "拖动调整大小(宽 × 高)" [ref=e374] + - group [ref=e375]: + - generic [ref=e376]: + - generic [ref=e378]: + - button "透明骷髅" [ref=e379]: + - img "透明骷髅" [ref=e380] + - button "📋" [ref=e381] + - generic: + - generic: + - generic: + - generic: 分镜 5 + - generic: 43.13s + - generic [ref=e382]: + - generic [ref=e384]: + - img [ref=e386] + - generic [ref=e391]: 元素改造 · Storyboard + - generic [ref=e392]: + - img [ref=e393] + - button "钉住 · 锁定位置与尺寸" [ref=e397]: + - img [ref=e398] + - generic [ref=e401]: + - generic [ref=e402]: STEP 6 · 参考元素 → SKG 画面 · 完成 + - generic [ref=e403]: + - text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。 + - generic [ref=e404]: 已有 1 个提取元素 · 0 个分镜进入编排 + - button "进入分镜编排" [disabled] [ref=e405] + - generic "拖动调整宽度" [ref=e407] + - generic "拖动调整大小(宽 × 高)" [ref=e408] + - group [ref=e409]: + - generic [ref=e410]: + - generic [ref=e412]: + - img [ref=e414] + - generic [ref=e418]: 产品文案 · Rewrite + - button "钉住 · 锁定位置与尺寸" [ref=e421]: + - img [ref=e422] + - generic [ref=e425]: + - generic [ref=e426]: STEP 5 · 接 SKG 卖点 · 待运行 + - textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e427] + - generic [ref=e428]: 下一冲刺接入 + - generic "拖动调整宽度" [ref=e430] + - generic "拖动调整大小(宽 × 高)" [ref=e431] + - group [ref=e432]: + - generic [ref=e434]: + - generic [ref=e436]: + - img [ref=e438] + - generic [ref=e440]: 生成视频 · Video Gen + - button "钉住 · 锁定位置与尺寸" [ref=e443]: + - img [ref=e444] + - generic [ref=e447]: + - generic [ref=e448]: STEP 7 · 首帧 + 动作 prompt · 待运行 + - generic [ref=e449]: + - generic [ref=e450]: Seedance + - generic [ref=e451]: Kling + - generic [ref=e452]: Veo 3 + - generic "拖动调整宽度" [ref=e454] + - generic "拖动调整大小(宽 × 高)" [ref=e455] + - group [ref=e456]: + - generic [ref=e457]: + - generic [ref=e459]: + - img [ref=e461] + - generic [ref=e465]: 合成成品 · Compose + - button "钉住 · 锁定位置与尺寸" [ref=e468]: + - img [ref=e469] + - generic [ref=e472]: + - generic [ref=e473]: STEP 8 · ffmpeg + 字幕 · 待运行 + - generic [ref=e474]: + - text: 视频片段 + 字幕 / TTS + - text: → 最终 mp4 输出 + - generic "拖动调整宽度" [ref=e475] + - generic "拖动调整大小(宽 × 高)" [ref=e476] + - img + - generic "Control Panel" [ref=e44]: + - button "Zoom In" [ref=e45] [cursor=pointer]: + - img [ref=e46] + - button "Zoom Out" [ref=e48] [cursor=pointer]: + - img [ref=e49] + - button "Fit View" [ref=e51] [cursor=pointer]: + - img [ref=e52] + - button "Toggle Interactivity" [ref=e54] [cursor=pointer]: + - img [ref=e55] + - img "Mini Map" [ref=e58] + - region "Notifications alt+T": + - list: + - listitem [ref=e485]: + - img [ref=e487] + - generic [ref=e490]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮 + - alert [ref=e60] \ No newline at end of file diff --git a/web/app/page.tsx b/web/app/page.tsx index b6e9f13..ede954a 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -7,6 +7,7 @@ import { type Node, type Edge, } from "@xyflow/react" import { Toaster, toast } from "sonner" +import { LayoutGrid } from "lucide-react" import { InputNode, KeyframeNode, ASRNode, TranslateNode, RewriteNode, StoryboardNode, VideoGenNode, ComposeNode, KeyframePanelNode, @@ -498,6 +499,54 @@ export default function Home() { )) }, [pinnedNodes, setNodes]) + // 自动排版:保留每个节点的当前宽高(用户为方便看而调过的尺寸),只重新计算 position + // 让卡片按管线列分组、列间和列内留出统一间距,不重叠。 + const handleResetLayout = useCallback(() => { + const zoom = flowRef.current?.getZoom?.() ?? 1 + const measure = (id: string): { w: number; h: number } => { + const el = document.querySelector(`.react-flow__node[data-id="${id}"]`) as HTMLElement | null + if (!el) return { w: 320, h: 220 } + const r = el.getBoundingClientRect() + return { w: r.width / zoom, h: r.height / zoom } + } + + // 按管线列分组(顶 → 底):图层 1 输入 → 5 合成 + const COLUMNS: string[][] = [ + ["input"], + ["keyframe", "asr"], + ["storyboard", "translate"], + ["videogen", "rewrite"], + ["compose"], + ] + const GAP_X = 80 + const GAP_Y = 56 + const START_X = 40 + const START_Y = 60 + + const positions: Record = {} + let cursorX = START_X + for (const col of COLUMNS) { + let cursorY = START_Y + let colMaxW = 0 + for (const id of col) { + const { w, h } = measure(id) + positions[id] = { x: cursorX, y: cursorY } + cursorY += h + GAP_Y + if (w > colMaxW) colMaxW = w + } + cursorX += colMaxW + GAP_X + } + + setNodes((prev) => prev.map((n) => { + if (n.id === KEYFRAME_PANEL_ID) return n + const p = positions[n.id] + if (!p) return n + return { ...n, position: { x: p.x, y: p.y } } + })) + setTimeout(() => flowRef.current?.fitView?.({ padding: 0.12, duration: 400 }), 30) + toast.success("已自动排版 · 保留每个节点的尺寸") + }, [setNodes]) + // 持久化每个节点宽 / 高到 localStorage(KeyframePanelNode 自己管尺寸,不写回) useEffect(() => { const sizes: Record = {} @@ -591,6 +640,18 @@ export default function Home() { <>
+ {/* 自动整理布局 — 主题切换上方,一键恢复默认位置和宽度 */} +
+ +
{/* 主题切换 — 左下角 Controls 上方(错开) */}