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(); 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); } }