文件
tennis-training-hub/server/mediaService.ts
2026-03-15 00:52:11 +08:00

53 行
1.4 KiB
TypeScript

import { ENV } from "./_core/env";
export type RemoteMediaSession = {
id: string;
userId: string;
title: string;
archiveStatus: "idle" | "queued" | "processing" | "completed" | "failed";
playback: {
webmUrl?: string;
mp4Url?: string;
webmSize?: number;
mp4Size?: number;
ready: boolean;
previewUrl?: string;
};
lastError?: string;
};
function getMediaBaseUrl() {
if (!ENV.mediaServiceUrl) {
throw new Error("MEDIA_SERVICE_URL is not configured");
}
return ENV.mediaServiceUrl.replace(/\/+$/, "");
}
function getMediaCandidateUrls(path: string) {
const baseUrl = getMediaBaseUrl();
if (baseUrl.endsWith("/media")) {
return [`${baseUrl}${path}`];
}
return [`${baseUrl}${path}`, `${baseUrl}/media${path}`];
}
export async function getRemoteMediaSession(sessionId: string) {
let lastError: Error | null = null;
for (const url of getMediaCandidateUrls(`/sessions/${encodeURIComponent(sessionId)}`)) {
const response = await fetch(url);
if (response.ok) {
const payload = await response.json() as { session: RemoteMediaSession };
return payload.session;
}
const message = await response.text().catch(() => response.statusText);
lastError = new Error(`Media service request failed (${response.status}): ${message}`);
if (response.status !== 404) {
break;
}
}
throw lastError ?? new Error("Media service request failed");
}