diff --git a/client/src/lib/changelog.ts b/client/src/lib/changelog.ts index 8201ebb..f056447 100644 --- a/client/src/lib/changelog.ts +++ b/client/src/lib/changelog.ts @@ -8,6 +8,27 @@ export type ChangeLogEntry = { }; export const CHANGE_LOG_ENTRIES: ChangeLogEntry[] = [ + { + version: "2026.03.17-live-camera-media-asset-url", + releaseDate: "2026-03-17", + repoVersion: "902bd78+media-asset-url-fix", + summary: + "修复同步观看预览地址被重复拼接 `/media` 导致的 404,观看端可以继续打开 relay 缓存视频。", + features: [ + "共享的 `getMediaAssetUrl()` 现在会保留已带 `/media/` 前缀的应用内路径,不再把 `/media/assets/...` 再次拼成 `/media/media/assets/...`", + "当服务端直接返回完整 `https://...` 外链时,前端会原样使用该地址,避免对外部媒体地址做错误拼接", + "其他仍是普通相对路径的媒体资源会继续自动补齐 `/media` 前缀,因此旧调用方无需改动", + "同步观看点击“同步观看”后,请求的 preview 地址恢复为 `/media/assets/sessions/.../preview.webm`,不再因 `404 page not found` 导致无视频可播", + "线上 smoke 已确认 `https://te.hao.work/` 已切换到包含本次修复的新构建,而不是继续提供部署前的旧资源 revision", + ], + tests: [ + "pnpm vitest run client/src/lib/media.test.ts", + "pnpm check", + "pnpm build", + "playwright-skill 线上 smoke: 登录 `H1` 后访问 `https://te.hao.work/live-camera`,确认 viewer 实际请求 `https://te.hao.work/media/assets/sessions/.../preview.webm?...` 并返回 `200`,同时不存在 `/media/media/...` 双前缀请求", + "线上 smoke: 已确认部署前公开站点还是旧 revision;部署后 `https://te.hao.work/` 已切换到包含本次修复的新构建", + ], + }, { version: "2026.03.17-live-camera-pose-buffer-window", releaseDate: "2026-03-17", diff --git a/client/src/lib/media.test.ts b/client/src/lib/media.test.ts index 9fafa4c..8782098 100644 --- a/client/src/lib/media.test.ts +++ b/client/src/lib/media.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { formatRecordingTime, pickBitrate } from "./media"; +import { formatRecordingTime, getMediaAssetUrl, pickBitrate } from "./media"; describe("media utilities", () => { it("formats recording time with minute and second padding", () => { @@ -14,4 +14,16 @@ describe("media utilities", () => { expect(pickBitrate("balanced", true)).toBe(1_400_000); expect(pickBitrate("balanced", false)).toBe(1_900_000); }); + + it("keeps already-prefixed media asset paths stable", () => { + expect(getMediaAssetUrl("/media/assets/sessions/demo/preview.webm")).toBe( + "/media/assets/sessions/demo/preview.webm" + ); + expect(getMediaAssetUrl("https://cdn.example.com/demo.webm")).toBe( + "https://cdn.example.com/demo.webm" + ); + expect(getMediaAssetUrl("/assets/sessions/demo/preview.webm")).toBe( + "/media/assets/sessions/demo/preview.webm" + ); + }); }); diff --git a/client/src/lib/media.ts b/client/src/lib/media.ts index 764c3ec..281e591 100644 --- a/client/src/lib/media.ts +++ b/client/src/lib/media.ts @@ -212,6 +212,12 @@ export async function getMediaSession(sessionId: string) { } export function getMediaAssetUrl(path: string) { + if (/^https?:\/\//i.test(path)) { + return path; + } + if (path.startsWith(`${MEDIA_BASE}/`)) { + return path; + } return `${MEDIA_BASE}${path.startsWith("/") ? path : `/${path}`}`; } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d6d8376..2724668 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,35 @@ # Tennis Training Hub - 变更日志 +## 2026.03.17-live-camera-media-asset-url (2026-03-17) + +### 功能更新 + +- 修复同步观看预览地址重复拼接 `/media` 的问题;当前端收到 `/media/assets/...` 这类已完整的应用内媒体路径时,会直接使用原值,不再错误请求 `/media/media/assets/...` +- 当前端收到完整的 `https://...` 外部媒体地址时,也会保持原样,避免把外链错误改写成站内 media 路径 +- 其他仍是普通相对路径的媒体资源会继续自动补齐 `/media` 前缀,因此原有依赖相对路径的调用链不需要调整 +- `/live-camera` 点击“同步观看”后,请求的缓存视频地址恢复为 `/media/assets/sessions/.../preview.webm`,不再因 `404 page not found` 导致无视频可播 + +### 测试 + +- `pnpm vitest run client/src/lib/media.test.ts` +- `pnpm check` +- `pnpm build` +- `playwright-skill` 线上 smoke:登录 `H1` 后访问 `https://te.hao.work/live-camera`,确认 viewer 实际请求 `https://te.hao.work/media/assets/sessions/.../preview.webm?...` 并返回 `200`,同时不存在 `/media/media/...` 双前缀请求 +- `curl -I https://te.hao.work/` +- `curl -I https://te.hao.work/assets/index-*.js` +- `curl -I https://te.hao.work/assets/index-*.css` + +### 线上 smoke + +- 部署前确认公开站点仍在旧资源 revision,尚未提供本次修复 +- 部署完成后,`https://te.hao.work/` 已切到本次新构建,而不是继续提供部署前的旧资源 revision +- `/live-camera` 的同步观看请求地址已恢复为 `/media/assets/sessions/.../preview.webm`,Playwright 真实浏览器验证拿到的 preview 请求状态为 `200` +- 已确认不存在 `/media/media/assets/...` 双重前缀请求 + +### 仓库版本 + +- `902bd78+media-asset-url-fix` + ## 2026.03.17-live-camera-pose-buffer-window (2026-03-17) ### 功能更新