# Tennis Training Hub - 变更日志 ## 2026.03.17-live-camera-preview-recovery (2026-03-17) ### 功能更新 - `/live-camera` 的 runtime 标题恢复逻辑新增更严格的乱码筛除与二次 UTF-8 解码兜底,`服...` 这类异常标题会优先恢复为正常中文;无法恢复时会自动回退到稳定默认标题,避免继续显示脏字符串 - 同步观看退出时会完整重置 viewer 轮询、连接标记和帧版本,不再把旧的 viewer 状态带回 owner 或空闲态,修复退出同步后仍黑屏、仍显示“等待同步画面”的问题 - 本地摄像头预览增加独立重绑流程和多次 watchdog 重试,即使浏览器首帧没有及时绑定 `srcObject` 或 `play()` 被短暂中断,也会继续自动恢复本地预览 - 视频区域是否显示画面改为按当前 runtime 角色分别判断,避免 viewer 旧连接状态误导 owner 模式,导致本地没有预览时仍错误隐藏占位提示 ### 测试 - `pnpm check` - `pnpm vitest run client/src/lib/liveCamera.test.ts` - `pnpm exec playwright test tests/e2e/app.spec.ts --grep "live camera"` - `pnpm build` - 线上 smoke:`curl -I https://te.hao.work/` - 线上 smoke:`curl -I https://te.hao.work/assets/index-BJ7rV3xe.js` - 线上 smoke:`curl -I https://te.hao.work/assets/index-tNGuStgv.css` - 线上 smoke:`curl -I https://te.hao.work/assets/pose-CZKsH31a.js` ### 线上 smoke - `https://te.hao.work/` 已切换到本次新构建 - 当前公开站点前端资源 revision:`assets/index-BJ7rV3xe.js`、`assets/index-tNGuStgv.css`、`assets/pose-CZKsH31a.js` - 已确认 `index`、`css` 与 `pose` 模块均返回 `200`,且 MIME 分别为 `application/javascript`、`text/css`、`application/javascript`,不再出现此前的模块脚本和样式被当成 `text/html` 返回的问题 ### 仓库版本 - `06b9701` ## 2026.03.16-live-camera-runtime-refresh (2026-03-16) ### 功能更新 - `/live-camera` 在打开拍摄引导、启用摄像头、开始分析前,都会先向服务端强制刷新 runtime 状态,避免旧的同步观看锁残留导致本机明明已释放却仍无法启动 - 新增 runtime 标题乱码恢复逻辑,可自动把 UTF-8 被误按 Latin-1 显示的标题恢复成正常中文,避免出现 `服...` 一类异常标题 - 摄像头启动链路改为以 `getUserMedia` 成功为准;即使本地预览 `