24 lines
1.3 KiB
TypeScript
24 lines
1.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { z } from "zod";
|
|
import { auth } from "@/app/(auth)/auth";
|
|
import { archiveCanvasVideo } from "@/lib/video-canvas/archive-video";
|
|
|
|
export const runtime = "nodejs";
|
|
export const maxDuration = 300;
|
|
const running = new Set<string>();
|
|
const schema = z.object({ url: z.string().url().max(12000) });
|
|
export async function POST(request: Request) {
|
|
const session = await auth();
|
|
if (!session?.user?.id) return NextResponse.json({ success: false, error: "未登录" }, { status: 401 });
|
|
const parsed = schema.safeParse(await request.json().catch(() => null));
|
|
if (!parsed.success) return NextResponse.json({ success: false, error: "视频地址无效" }, { status: 400 });
|
|
if (running.has(session.user.id)) return NextResponse.json({ success: false, error: "视频正在保存,请稍候" }, { status: 429 });
|
|
running.add(session.user.id);
|
|
try {
|
|
const url = await archiveCanvasVideo(parsed.data.url);
|
|
return NextResponse.json({ success: true, data: { url, storageStatus: "archived", permanentVideoUrl: url } });
|
|
} catch {
|
|
return NextResponse.json({ success: false, error: "视频转存失败,原视频仍保留;请稍后重试保存,无需重新生成" }, { status: 502 });
|
|
} finally { running.delete(session.user.id); }
|
|
}
|