66 lines
1.7 KiB
TypeScript
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);
|
|
}
|