Files
story-studio/src/app/api/render/route.ts
2026-02-21 10:33:18 +01:00

66 lines
1.7 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { renderChapterVideo, RenderProgress } from '@/lib/remotion-service';
// Simple in-memory queue (in production, use Redis or DB)
const renderQueue = new Map<string, RenderProgress>();
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { projectSlug, capituloNumero, ...options } = body;
if (!projectSlug || !capituloNumero) {
return NextResponse.json(
{ error: 'Missing projectSlug or capituloNumero' },
{ status: 400 }
);
}
const jobId = `${projectSlug}-${capituloNumero}-${Date.now()}`;
// Initialize job in queue
renderQueue.set(jobId, {
phase: 'loading',
progress: 0,
message: 'Iniciando...',
});
// Start render in background (non-blocking)
renderChapterVideo(
{ projectSlug, capituloNumero, ...options },
(progress) => {
renderQueue.set(jobId, progress);
}
).catch((error) => {
renderQueue.set(jobId, {
phase: 'error',
progress: 0,
message: error.message,
});
});
return NextResponse.json({ jobId });
} catch (error: any) {
console.error('Render API error:', error);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}
export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url);
const jobId = searchParams.get('jobId');
if (!jobId) {
return NextResponse.json({ error: 'Missing jobId' }, { status: 400 });
}
const progress = renderQueue.get(jobId);
if (!progress) {
return NextResponse.json({ error: 'Job not found' }, { status: 404 });
}
return NextResponse.json(progress);
}