你装的是个"从一堆素材里挑几十段拼一条 vlog"的工具, 不是个图库浏览器。但今天的 UI 把 90% 力气花在"看", 选片没有写接口、导出剪映没有按钮、 聚类好的 Stories 完全只读。下面这份方案讲清楚:现状哪儿不行、 4 个方向各自取舍、为什么推 D 而不是看起来更帅的 C, 以及不管选哪个都得先做的 3 件事。
走 D 主体,从 C 偷一小撮键盘流,
从 A 偷"Story = 出片单位"语义。
明确不做 B 的 Today 面板。
D 是唯一能在 1–2 周内把"选片 → 导出剪映草稿"这条核心闭环跑通、 且不掀掉 1,016 行单文件基本盘的方案。C 方向更性感(三栏 + 键盘流) 但要值 8 分,必须把 server 写接口 + 剪映触发链路 + 移动端策略 当成一坨工作做完,否则只是个更好看的只读浏览器。
(4 个独立 agent 评估打分:C 8 · D 7 · A 5 · B 4。 推 D 不是因为分高,是因为 D 的回报兑现路径最短。)
server.py 9 条路由全是 GET,0 个 POST。
build_jianying_draft.py 是 CLI,
硬编码 BGM 路径 + glob output/cuts/*。
整个工具的"出片"动作必须开终端。
font-black tracking-[0.2em] 满天飞,没有统一 token。
shadcn 装了 8 个组件几乎没用。
4 个独立 agent 各自评估一个方向 · 不互看 · 最后合成排名
不动信息架构。模态右栏填上 Pick/Reject/Rating + scrubber + "加入草稿"按钮; 顶栏加"剪映草稿"小入口;grid 9→6 列;Stories 卡 hover 进选片模式; App.tsx 拆 5 个组件 + design token 收敛。
学 Lightroom / Photo Mechanic:左 filter + filmstrip / 中大预览 + scrubber / 右 metadata + actions + 剪映队列。J/K 翻、P/X 选弃、1-9 评分、Space 播。 Stories 降为左侧 collection。
首页就是 193 条 Stories 时间线。点开进入 Story Editor, 排序 / 选片 / 导出剪映都在里面。Library 降为"全量索引"。
首页 Today dashboard 决定进哪步:今天新到的 / 等审的 / 已选可导出的。 Things 3 风格。
D 是底盘(不掀架构),
C 的键盘流是发动机(扫片提速),
A 的"Story 出片"按钮是排气(剪映闭环最短路径)。
B 一个像素都不抄。
POST /api/clip-status · 改 clip_status 字段,atomic write(临时文件 + rename),文件锁防 pipeline 撞POST /api/rating · 用户评分(独立字段,不污染 ai_score)POST /api/favorites · 替换 localStorage 凑合方案POST /api/export-draft · 接收 {filenames: [...]} 或 {story_id},触发 ffmpeg 切片 + 调 build_jianying_draft.py,返回 job_idGET /api/jobs/<id> · 进度轮询(草稿生成是 1–3 分钟长任务)Header.tsx / Sidebar.tsx / Filters.tsx / Grid.tsx / Modal.tsx / StoriesView.tsx / hooks/*@theme CSS vartext-[10px] / text-[9px] 满天飞)video.currentTime/api/export-draft with {story_id}模态从"看图"升级成"工作台"——右栏常驻 + scrubber + 队列 + 键盘提示。 grid 不消失,仍是默认入口,但点开后是这样:
↑ 上图是 sketch,最终配色字体跟 Phase 5 走。
POST /api/clip-status + POST /api/rating。
results.json 1.5 MB 单文件,pipeline.py 可能并发追加,
必须 write tmp → os.replace() + fcntl.flock,约 50 行。
没有这一步,任何 UI Pick/Reject 按钮都是 localStorage 套壳。
从纯 CLI 升级为接 JSON spec 的函数(不再 glob output/cuts/*)。
硬编码的 BGM 路径 / 剪映目录在 server 端做 precheck,把"BGM 丢了"抛回 UI 不静默失败。
POST /api/export-draft 返回 job_id,前端轮询 GET /api/jobs/<id>。
没有这一步,所有方向画的"导出按钮"都是假动作。
坚持 prop drilling 或最多 1 个 Zustand store(不要碰 React Context——
作者刻意单文件说明不喜欢那种结构)。12 色 tag + 4 档 scoreBg + 橙 gradient
收敛到 Tailwind v4 @theme CSS var。这是隐性修改成本放大器,
一年后还要改的话省下来的时间会复利。
推荐"桌面=工作台 · 移动=只读浏览"。 剪映只在 Mac,移动端选片回桌面也要重选一次,没意义。 这样移动端代码可以大幅简化。否就维护两套。
推荐砍掉 localStorage favorites,所有"我要"统一走 clip_status='selected' 写入 results.json。
favorites 当前是凑合方案,留着只会让两种语义打架。
推荐暂时不可编辑,明确"重跑 stories.py 才能改"。 引入 stories_overrides.json 合并层是大坑,单用户工具不值得。 真要编辑就上 A 方向,是另一个量级的工作。
推荐保留 Geist 作为 body sans,但给标题/重点数字换 serif(Instrument Serif / PP Editorial)。 Pro tool 视觉一般偏冷峻,加点 editorial 调性区分度更高。不变也行,但视觉雷同 Lightroom 是事实。