Fix live camera media asset URLs

这个提交包含在:
cryptocommuniums-afk
2026-03-17 14:44:18 +08:00
父节点 902bd783c9
当前提交 0af88b3a15
修改 4 个文件,包含 70 行新增1 行删除

查看文件

@@ -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",

查看文件

@@ -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"
);
});
});

查看文件

@@ -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}`}`;
}

查看文件

@@ -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)
### 功能更新