Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 32 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,31 @@

本文件记录 OpenTake 的重要改动。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。

## [未发布] — 2026-06-23 第三轮(自动 PR 审核:全局素材库 + 文本工具 + 字幕/视频导出 + list_models)

本轮为**自动 PR 审核流程**:逐 PR 专家审核 + 对抗验证 + 对照开发文档,审核通过且 CI 双绿的纯新增项合并,其余 @作者 rebase/修改。

### 新增(Added)

- **全局可复用素材库后端**(#37):
- **#37-A / #54**(PR #104)后端存储层 `crates/opentake-media/src/library.rs`:copy-on-favorite + SHA-256 内容寻址去重 + JSON manifest 原子写(`.tmp` rename)+ Mutex 并发安全。9 个单测。
- **#37-B / #55**(PR #106)Tauri 命令层 `src-tauri/src/library.rs`:7 个命令 `library_list` / `favorite` / `unfavorite` / `categorize` / `rename` / `delete` / `import_to_project`。
- 上游 palmier-pro 无此模块,#37 为 OpenTake 新增子系统,不要求 1:1。前端(#37-C / #56)尚未实现,收藏暂仍走前端 localStorage。
- **文本工具 MVP**(#96,PR #107):Toolbar `T` 按钮接线 `addTextClip()`、新增 `TextTab.tsx` 文字内容编辑、Inspector 路由 text tab。字体/字号/颜色等 `textStyle` 留后续(依赖后端 ClipProperties 扩展)。
- **SRT/VTT 字幕导出纯逻辑**(#29 D 层切片,PR #110):`crates/opentake-domain/src/subtitle_export.rs` 把按 `caption_group_id` 分组的字幕 clip 序列化为 SubRip/WebVTT 字符串(零 IO、零新依赖、16 单测)。导出层/agent 工具/前端对话框留后续切片。
- **整条时间线视频导出编排**(Phase 5 spine,PR #112):`src-tauri/src/export.rs` + `export_video` 命令,逐帧 `Compositor::render_to_rgba` → `VideoEncoder::push_frame` → `finish`,全分辨率 H.264/.mp4(H.265/ProRes/音频/进度取消留后续)。含 ffmpeg/GPU 门控集成测试。自包含复制 preview 路径,未碰 `composite_frame`。
- **`list_models` 工具接线**(#9/#10 切片,PR #111):`opentake-agent` 从存根接 `opentake-gen` 内置静态 catalog,`?type=` 过滤 + `{ models, loaded }` JSON,纯本地无网络/BYOK。

### 审核处置(本轮)

| PR | 处置 | 说明 |
|---|---|---|
| #104 #106 #107 #110 #111 #112 | **已合并** | CI 双绿 + 审核通过 + 对抗验证 CONFIRM 的纯新增项 |
| #76 | **已关闭** | bundle id 改名冗余(main 已是 `com.opentake.desktop`,#74 已合) |
| #77 #78 #79 #105 #108 | **请修改(@作者)** | 详见下「待审 PR」 |

---

## [未发布] — 2026-06-23 第二轮(剪映式 UI + 时间线剪辑修复 + 导出)

合并自 PR #102(基于已合并的 #81)。多 Agent 协作:主控修 Bug + 编排 workflow 做功能。
Expand Down Expand Up @@ -58,11 +83,12 @@ web `tsc` 干净 + `vitest` 43;Rust `fmt`/`clippy` 干净 + `opentake-project`
3. **基础剪辑手感**:#93 右键菜单 + #94 复制粘贴 → #96 文本 T → #95 关键帧 → #97 Inspector 三段式(后端 ClipProperties 需扩 crop/fade)。
4. **打磨**:#98 落点路由/Option 复制 · #99 吸附迟滞/offset 角标/音量线 · #101 后端命令。

## 待审 PR(建议队友处理
## 待审 PR(经第三轮审核:请修改 / @作者

以下为更早会话遗留、**无 CI 校验、mergeable 未知、且与本轮 #102 改动(媒体文件)或 #91 重写计划重叠**,本轮未合并,需 rebase 到新 main 后审查:
以下 PR 经第三轮自动审核**未合并**,均已在 PR 上 @作者 给出具体阻塞项与修改要求(CHANGES_REQUESTED):

- **#77** folder browsing in media panel — 与 #91 素材重写重叠,建议并入 #91 一并设计。
- **#79** extract audio track — 与 #101 相关,可作参考。
- **#78** settings 7-pane + MCP Instructions — 与本轮 i18n/lib.rs 可能冲突,需 rebase。
- **#76** bundle id rename — bundle id 已为 `com.opentake.desktop`,疑似冗余,需确认。
- **#108** 片段右键菜单(#93)— **CONFLICTING**,需 rebase;菜单 `position:fixed` 缺 `top/left`(永远渲染在 0,0,功能不可用);渲染期直接调 `onClose()` 违反 React 规则;缺 Swap/Save/Extract Audio 菜单项(即使 disabled)。
- **#105** 复制/剪切/粘贴 ⌘C/⌘X/⌘V(#94)— **CONFLICTING**,落后 main 39 commit,`editActions.ts` import 段冲突需 rebase;粘贴视频丢链接音轨(`addLinkedAudio:false`)、空剪贴板无提示待补。
- **#79** 提取音频到本地(#39)— **CONFLICTING**,基于旧版 patch 上下文不匹配(命令注册不上);「提取音频」星标与 main 已有收藏星标在同坐标叠层;缺验收测试;out_path 无路径校验;触碰 #91 范围。
- **#78** 设置 7-pane + MCP + 主页(#40)— 验收仅约 50%(缺 Models/Privacy/Shortcuts/Account pane、主页 Sign in/File missing/SampleProjects/Update 徽标);`SettingsView.tsx` 合并后超 800 行规约,需按上游每 pane 拆文件。
- **#77** 文件夹浏览前端(#58)— **CONFLICTING**,Rust diff 基于旧版 media.rs(字段重复)、`FolderTile` 未导入 `Folder` 图标(tsc 报错)、`createFolder` 签名与 main 重复;缺上游选中/重命名/右键/文件夹互拖;与 **#91 素材重写重叠,建议并入 #91**。
14 changes: 12 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@

> ⚠️ computer-use 点击本机被 Dock 遮挡全局拦截(报"会落在程序坞")。改用 `preview_start` dev server(浏览器 fallback `web/src/lib/fallback.ts` 有 demo 时间线)+ `preview_eval` 注入测量验证布局,绕开真机点击。详见 `memory/opentake-editing-parity.md`。

## ✅ 2026-06-23 第三轮已合并(自动 PR 审核,均 CI 双绿 + 对抗验证 CONFIRM)

逐 PR 专家审核 + 对抗验证 + 对照文档后合并的纯新增项(详见 CHANGELOG「第三轮」):
- **#104/#106 全局素材库后端 + 命令层**(#37-A/B):`opentake-media/src/library.rs`(内容寻址去重 + JSON manifest 原子写)+ `src-tauri/src/library.rs`(7 命令)。前端 #37-C/#56 待做。
- **#107 文本工具 MVP**(#96):Toolbar `T` → `addTextClip()` + `TextTab.tsx`;textStyle 字段留后续(依赖后端 ClipProperties 扩展)。
- **#110 SRT/VTT 字幕导出纯逻辑**(#29 切片):`opentake-domain/src/subtitle_export.rs`(16 单测);导出层/agent 工具/前端对话框待接。
- **#111 `list_models` 接 opentake-gen catalog**(#9/#10 切片);`generate_*`/upscale 仍待 async+BYOK。
- **#112 整条时间线视频导出编排**(Phase 5 spine):`src-tauri/src/export.rs` + `export_video`(逐帧 composite→ffmpeg,H.264/.mp4 全分辨率,含集成测试);自包含复制 preview、未碰 `composite_frame`。H.265/ProRes/音频/进度取消留后续。
- **关闭** #76(bundle id 改名冗余);**请修改 @作者** #77/#78/#79/#105/#108(冲突/验收未达标,详见 CHANGELOG「待审 PR」)。

## ✅ 2026-06-23 第二轮已完成(分支 `feat/jianying-ui-and-timeline-fixes`,基于 PR#81)

多 Agent 模式:本人修 Bug + 小改;编排 workflow 做大功能。**全部本地验证通过、已提交、尚未推送/未真机目视确认(Dock 拦截)。**
Expand All @@ -17,7 +27,7 @@
- **F3 剪映式顶栏**(`b89fc56`):8 主标签(素材/音频可用,文本/贴纸/特效/转场/字幕/智能包裹置灰);素材/音频→导入/我的;星标收藏 localStorage(`favorites.ts`);保留 missing/relink。`MediaTabBar.tsx`+`favorites.ts`。
- **F4 时间线导出**(`b89fc56`):`crates/opentake-project/src/fcpxml.rs` 导出 **XMEML 4(FCP7 XML)**——1:1 端口上游 `Export/XMLExporter.swift`(Premiere 不读 FCPXML,故选 XMEML);`export_fcpxml` 命令+api+TitleBar 导出按钮(saveDialog .xml);`Clip::keyframe_frames`(带测试)。13 fcpxml 测试。

**遗留/后续:** ① 推送 + 真机目视确认(B1暂停/B2波形需原生构建,Dock 拦截 computer-use)。② `fcpxml.rs` 1489 行 > 800 规约,建议拆分。③ `export_fcpxml` 名实不符(产物是 XMEML),可考虑改名 `export_xml`。④ Q/W(现=修剪入出点,Premiere习惯)与 ⌘K 分割 跟剪映(Q/W=删左右、⌘B/B切割)不同,待用户定夺。⑤ 星标"我的"现为 localStorage,跨项目全局库=#37 待做。⑥ 剪映 draft(`com.lveditor.draft`)导出未做(格式易碎,留后续)。
**遗留/后续:** ① 推送 + 真机目视确认(B1暂停/B2波形需原生构建,Dock 拦截 computer-use)。② `fcpxml.rs` 1489 行 > 800 规约,建议拆分。③ `export_fcpxml` 名实不符(产物是 XMEML),可考虑改名 `export_xml`。④ Q/W(现=修剪入出点,Premiere习惯)与 ⌘K 分割 跟剪映(Q/W=删左右、⌘B/B切割)不同,待用户定夺。⑤ 星标"我的"前端仍为 localStorage(`favorites.ts`);全局库**后端已并入 main**(#37-A 存储层 #104 + #37-B 命令层 #106),**前端 #37-C/#56 未做**——收藏尚未迁到后端 `library_favorite`/`library_list`。⑥ 剪映 draft(`com.lveditor.draft`)导出未做(格式易碎,留后续)。

## 历史(第一轮,分支 `feat/realtime-timeline-playback`/PR #81,CI 绿)
真实播放、波形端口、trim/move 正确性、fade smoothstep、razor 吸附、轨道编号、⇧⌫ ripple、预览左下角根因修复、split 无选区、链接 co-trim。**PR #81 已超"播放"范围,合并时改标题/拆分。**
Expand Down Expand Up @@ -61,7 +71,7 @@
- **#48 片段编辑收尾**:Delete/切割/片段右键菜单/Inspector 三段式/Toolbar 接线。
- **剩余 MCP 工具 stub**:媒体读取(inspect_media/get_transcript/search_media)+ import_media 需**拓宽 CoreHandle 接 MediaEngine**(注意:CoreHandle 现仅持 AppCore,MediaEngine 在 MediaState,需架构扩展);`generate_*`/upscale 需异步 GenClient + BYOK;add_captions 需端上 whisper。
- **#49 项目内文件夹导入 + 嵌套文件夹浏览(剪映式)**:文件夹图标/双击进入/面包屑/拖出;DTO 加 folderId+folders;import_folder 镜像目录树。用户很想要。
- **#37 全局可复用素材库 + 收藏**(跨项目/分类/音效库/全库可见)。
- **#37 全局可复用素材库 + 收藏**(跨项目/分类/音效库/全库可见):**后端已并入 main** —— 存储层 `crates/opentake-media/src/library.rs`(#37-A/#54,PR #104,copy-on-favorite + SHA-256 内容寻址去重 + JSON manifest 原子写)+ Tauri 命令层 `src-tauri/src/library.rs`(#37-B/#55,PR #106,7 命令 list/favorite/unfavorite/categorize/rename/delete/import_to_project)。**剩前端 #37-C/#56**(库视图 UI + 收藏从 localStorage 迁到后端 `library_favorite`/`library_list`)尚无 PR。follow-up:`library.rs:322` remove() 静默吞 remove_file 错误,建议补 `tracing::warn!`;`library_delete` 与 `library_unfavorite` 现为纯别名,建议语义区分
- **#39 提取音频星标 · #40 设置多分页+主页 1:1 · #34 motion dispatch · #27–30 进阶 B/C/D/E · #22–25 #12 follow-up · #35 bundle id 改名**。
- 冲突注意:我(#47/#48)动 opentake-render/opentake-media(decode/FrameProvider)/src-tauri(composite_frame、autosave)/web Preview+timeline;#36 动 agent+src-tauri(server 段);#37/#49 动 opentake-media(library/folders)+web media。**src-tauri/lib.rs、opentake-media 是多方交汇点,合并按 issue 顺序、各自小段、勤 rebase。**

Expand Down
4 changes: 3 additions & 1 deletion docs/PORT-1TO1-GAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,4 +194,6 @@

7. **账号/订阅/积分、Sample 后端、WelcomeOverlay/Tutorial、Models 目录** 属账号与引导体系,非窗口/保存/剪辑核心,全部后置(P2 或占位隐藏)。

8. **新建落盘与自动保存必须配套设计。** `project_dir=None` 时 `save_project(None)` 报 NoProjectOpen,所以 P0-1(新建即落盘)是 P1-1(自动保存)的硬前置,二者同期落地。
8. **新建落盘与自动保存必须配套设计。** `project_dir=None` 时 `save_project(None)` 报 NoProjectOpen,所以 P0-1(新建即落盘)是 P1-1(自动保存)的硬前置,二者同期落地。

9. **全局可复用素材库(#37)是 OpenTake 新增子系统,不在本 1:1 差距清单约束内。** 上游 palmier-pro 无对应模块(grep 确认无全局收藏库)。采用 copy-on-favorite + SHA-256 内容寻址去重 + JSON manifest 原子写;后端存储层(#37-A / #104)+ Tauri 命令层(#37-B / #106)**已并入 main**,前端(#37-C / #56)待做。注意区分范畴:**#37 = 跨项目全局库;#49/#91 = 每项目媒体与文件夹浏览**,两者不同。
5 changes: 5 additions & 0 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
- **做**:`.opentake` 目录包读写(serde + `#[serde(default)]` 容错,与上游 schema 对齐);媒体导入(本地/URL/bytes,扩展名白名单);ffmpeg 抽缩略图 + sprite 网格缓存(逻辑照搬 `MediaVisualCache`);Symphonia 出波形(归一化 0..1 缓存)。
- **验证**:能打开上游导出的工程文件并还原 timeline;导入媒体后缩略图/波形/时长/分辨率正确;`.opentake` 往返序列化无损。

> 注:**跨项目全局素材库(#37,独立于「每项目媒体」)后端已并入 main** —— 存储层 `crates/opentake-media/src/library.rs`(copy-on-favorite + SHA-256 内容寻址去重 + JSON manifest 原子写,#104)+ Tauri 命令层 `src-tauri/src/library.rs`(7 命令,#106)。前端(#37-C / #56)未做。该子系统上游 palmier-pro 无对应,不要求 1:1。注意区分:**#37 = 跨项目全局库;#49/#91 = 每项目媒体与文件夹浏览**。

## Phase 3 — 🔴 wgpu 帧合成器 PoC(项目命门,尽早验证)
对应 `opentake-render`。**这一步成败决定整条 Rust core 路线。**
- **做**:
Expand All @@ -43,6 +45,7 @@
## Phase 5 — 导出
- **做**:wgpu 逐帧合成 → ffmpeg 编码;复刻预设(H.264/H.265/ProRes × 三档分辨率),逐项对齐码率/profile/色彩逼近上游;`renderSize` 取偶数。
- **验证**:导出 mp4 可播放;与上游导出对比画质/时长/音画同步一致。
- **进度**:整条时间线逐帧导出 spine 已落地(#112,`src-tauri/src/export.rs` + `export_video` 命令,H.264/.mp4 全分辨率,逐帧 `Compositor::render_to_rgba` → `VideoEncoder` 编码,含 ffmpeg/GPU 门控集成测试)。剩 H.265/ProRes 预设 + 音频混流 + 进度/取消。

## Phase 6 — React 前端
对应 ui-rebuild 模块(Timeline/MediaPanel/Inspector/Settings/Toolbar/Help/UI)。
Expand All @@ -57,10 +60,12 @@
3. 应用内 chat(reqwest→Anthropic SSE,BYOK;prompt caching)。
4. **OpenTake 增强**:分层可组合系统提示词 + 模型策略配置化;高阶工具 `remove_filler_words`/`tighten_silences`;写工具返回结构化 JSON;新增 `get_capabilities`。
- **验证**:`claude mcp add` 能连;每个工具走通;应用内 chat 能完成多步链式编辑;助手专属 undo 正确。
- **进度**:`list_models` 工具已从存根接到 `opentake-gen` 内置静态 catalog(#111,`?type=` 过滤 + `{ models, loaded }`,纯本地无网络/BYOK);`generate_*`/`upscale_media` 仍待 async + ProviderRegistry + BYOK。

## Phase 8 — 文字/字幕渲染 + 转写 + 语义搜索
- **做**:cosmic-text + tiny-skia/Vello 文字渲染(阴影/描边/背景/对齐/换行,逐帧 opacity)接入合成器;whisper-rs 转写(word/segment 时间戳,`TranscriptionResult` 模型复用);candle/ort 跑 SigLIP2 + tokenizers 做视觉/口语搜索。
- **验证**:字幕静态渲染像素对齐上游;转写时间码映射正确;`search_media` 视觉/口语命中合理。
- **进度**:SRT/VTT 字幕**导出纯逻辑**已落地(#110,`crates/opentake-domain/src/subtitle_export.rs`,按 `caption_group_id` 分组序列化,16 单测);剩接导出层 + `export_captions` agent 工具 + 前端导出对话框。
- **进阶扩展(ADVANCED-FEATURES B/C/D 层)**:
- AI 推理特性(统一 ort worker):超分(Real-ESRGAN/SeedVR)、AI 抠像(RVM/BiRefNet)、运动追踪(CoTracker)、防抖(FFmpeg vidstab 起步)、光流补帧(RIFE/FILM,p3)、消除瑕疵(p3)。
- 音频工程(FFmpeg):响度统一(loudnorm/EBU R128)、降噪(afftdn/arnndn→DeepFilterNet)、人声分离(Demucs via ort)。
Expand Down
Loading