Skip to content

Latest commit

 

History

History
99 lines (78 loc) · 7.9 KB

File metadata and controls

99 lines (78 loc) · 7.9 KB

v0.12.4:视频会话画面要点纯图落地 + 笔记预览时间戳锚点 chip 化

状态:代码已交付(2026-08-23,两项旧改动完整性修复) 依据:用户对话 2026-08-23(①「视频会话中,画面要点应该是纯图片」——0.12.1 仍见 OCR 文字屏; ②「笔记预览中(没有进行 AI 精修之前)仍有 [⏱ 00:00]([[ts:233]])」——预览阶段原始锚点 Markdown 外露) 前置:v0.12.3(浮窗死锁修复)代码已交付;v0.12.2(笔记页信息架构重构)规划未启动,顺延为后续版本候选

一句话

两个"此前已裁决但未真正落地"的旧改动,本次补齐到全链路生效:

  • 视频会话画面要点 = 关键帧纯图(ADR-023):v0.12.0 M5 的帧侧改动只删了"全帧 OCR 兜底 + 明文路径", 但布局分析后的区域 OCR 分支(!is_subtitle 时对版面区域做 region_ocr_blocks)仍存活,导入路径 的中区域 OCR 也还在跑——0.12.1 的视频会话仍产出 OCR 文字画面。本次删除该分支 + 导入路径中区域 OCR, 关键帧一律纯图归档(存图不识别),展示层按会话类型分派(photo 保留 OCR 文本屏,video 走纯图屏)。
  • 笔记预览时间戳锚点 chip 化(v0.11.5):正式笔记(NoteMarkdown)的 [⏱ MM:SS]([[ts:ms]]) 早已渲染为 可跳转 chip,但预览阶段的两个轻量字符串渲染器(NotePreviewView.renderMarkdown、 RefineWorkbench.renderMd)直接输出转义后文本——[⏱ 00:00]([[ts:233]]) 原文外露。本次为两个渲染器 统一接入 renderTimestampAnchors,与正式笔记同款 chip(颜色/虚线底/title 跳转)。

范围

# 项目 类型 落点
1 视频画面要点残留 region OCR(直播路径) P0 修复 live_frame_process.rs——删除 !is_subtitle 布局分析 + 区域 OCR 分支,else 纯关键帧归档
2 视频画面要点残留区域 OCR(导入路径) P0 修复 import.rs/import_frame.rs——关键帧纯图归档(rgb_to_bgra),仅字幕 OCR 门控保留,删中区域 OCR
3 展示层纯图分派 P1 契约 screens.rs(build_keyframe_screens/build_view_screens)+ get_session_detail/preview_session_note/manual_capture_inner 三处接入
4 预览时间戳锚点 chip 化 P0 修复 utils/html.ts(renderTimestampAnchors)+ NotePreviewView.tsx/RefineWorkbench.tsx 接入
5 会话详情面板 kind 感知 P2 信息 SessionDetailPanel.tsx——photo「画面要点(OCR)」/ video「画面要点(关键帧纯图)」
6 退役机制标注 伴随 退役 OCR 路径按 #[allow(dead_code)] + @ai-context 保留(region_ocr/layout_cache/grid_from_bgra/save_crop),不删除
7 文档与治理 伴随 本版本文档 + CHANGELOG + 索引 + ADR-023 状态行 + 版本号 0.12.4

根因(Bug ①:画面要点残留)

  • 帧侧:live_frame_process.rs 的旧五段分支 is_subtitle → 布局分析 → layout_regions.is_empty()判断 后**仍调用region_ocr_blocks→handle_full_frame**——布局分析识别出的"正文区域"被当作 OCR 区域 全文识别入库(region=full`),视频会话画面要点在 0.12.1 仍是 OCR 文字屏。
  • 导入侧:import.rs 的 ocr_keyframes 只按"有字幕才识别"做判断,无 OCR 的关键帧不归档图片; import_frame.rs 的中区域(MIDDLE_TOP/BOTTOM)OCR 对视频画面做区域识别——同样产出 OCR 文字。
  • 展示侧:get_session_detail/preview_session_note 对视频会话仍无条件走 build_screens (OCR 文字屏构建),未按会话类型分派。

根因(Bug ②:预览锚点外露)

  • 笔记真实渲染(注意 NoteMarkdown 组件)用 react-markdown 的 a 组件把 ( [[ts:ms]] ) 渲染为 chip;
  • 但预览阶段(未精修)走 NotePreviewView.renderMarkdown / RefineWorkbench.renderMd 两个轻量 字符串渲染器——escapeHtml 后直接原文输出,[⏱ 00:00]([[ts:233]]) 作为字面文本保留。
  • v0.11.5 只改了正式渲染组件,遗漏了两个字符串渲染器 → 预览仍见原始锚点。

修复方案

① 关键帧纯图(ADR-023 全链路)

  • live_frame_process.rs:else(非字幕帧)→ 纯关键帧归档(handle_full_frame(&frame, &[], ...), layout_changed=None),零 OCR 调用;删除 layout_cache 参数(仅退役的布局分析使用)。
  • import.rs:ocr_keyframes 对每个关键帧无条件归档纯图(SessionImageStore + rgb_to_bgra), 字幕 OCR 独立门控(ocr_enabled);进度消息「关键帧归档 i/N · 已识别字幕 N 块」。
  • import_frame.rs:删 MIDDLE_TOP/BOTTOM 常量与中区域 OCR,只保留底部字幕带。
  • screens.rs:新增 build_keyframe_screens(每个归档图一屏:first_seen=last_seen=ts、image_ref, 无 title/body/labels/structure)+ build_view_screens(kind, ...) 分派器 (photo→build_screens 保持 ADR-021 OCR 文本屏;video/None→纯图屏)。
  • 命令层接入:get_session_detail、preview_session_note(photo→attach_images)、 manual_capture_inner(经 kind 分派)。
  • 保留边界:filter_note 的转写路径统计/ocr_screens 未动;photo 会话 OCR 屏行为与 v0.12.1 完全一致; AI 精修 vision 提取(vision_refine_enabled)仍按 ADR-023 走屏卡图——本改动只消灭"视频画面要点出 本地 OCR 文字"这一条路径。

② 预览锚点 chip

  • utils/html.ts 新增纯函数 renderTimestampAnchors(escaped):在已转义文本上先替换章头包裹形态 ## 标题 [[⏱ MM:SS]([[ts:ms]])],再替换段落形态 [⏱ MM:SS]([[ts:ms]])(顺序契约:章头含段落子串, 先章头防误吃);输出 <span> chip(teal 色、虚线底边、圆角、title+点击跳转语义),与 NoteMarkdown 一致。
  • NotePreviewView.renderMarkdown / RefineWorkbench.renderMd 全部渲染分支(# /## /> /- /段落) 接入;img 分支不动。

测试

  • Rust(cargo test --test app_lib_tests,新增 3 项):keyframe_screens_one_per_archived_image、 keyframe_screens_empty_without_images、view_screens_dispatches_by_kind(photo 保留 OCR 屏 / video 纯图屏 / 无图空屏不落回)。
  • 前端 vitest(html.test.ts 新增 5 项):段落 chip、章头 chip、无锚点穿透、转义-替换次序注入安全、 非数字分钟不误匹配。
  • 全量:Rust 1547 通过(3 失败为预存基线问题——ai_client 默认 Provider 断言 SiliconFlow 而 v0.12.0 M4 已默认 DeepSeek;note_filter 两条黄金用例,均在未含本次改动的 HEAD 上复现); tsc --noEmit 零错误;vitest 全绿;vite 构建通过;clippy 零新增警告(既有警告均位于未改动文件)。

验证(真机待执行)

  • 视频会话采集会话详情:画面要点清单为图(缩略图卡),无 OCR 文字条目;点开为关键帧原图。
  • 导入视频(无字幕):关键帧已归档(session-images//full/*.webp),画面要点纯图。
  • 笔记预览(未精修):[⏱ 00:00]([[ts:233]]) 不再原文显示,渲染为可点击 chip;精修后不变。
  • 图文(photo)会话:画面要点仍为 OCR 文本屏(回归不变)。

已知行为变更(2026-08-23 代码审查确认,非缺陷)

  • 视频会话大纲检测恒空:detect_outline 只消费 region=="full" OCR 块,AD-023 下线后 视频会话不再产生 full 块 → 侧边大纲导航为空。设计内行为(视频会话大纲在转写章节 检测侧,不依赖画面 OCR);AI 精修任务的 vision 图片经 load_session_vision_images 独立读归档目录(与屏卡无关),不受影响。真机验收若发现大纲为空符合预期,无需上报。