import logging from datetime import datetime, timezone from fastapi import APIRouter, HTTPException from app.schemas.common import TaskResponse, TaskStatus from app.schemas.video_generation import KlingRequest, MinimaxRequest, SeedanceRequest from app.services import freepik_client, task_tracker logger = logging.getLogger(__name__) router = APIRouter(prefix='/api/v1/generate/video', tags=['video-generation']) def _extract_task_id(result: dict) -> str: data = result.get('data', result) freepik_task_id = str(data.get('task_id') or data.get('id', '')) if not freepik_task_id: raise HTTPException(status_code=502, detail='No task_id in Freepik response') return freepik_task_id @router.post('/kling', response_model=TaskResponse) async def generate_video_kling(request: KlingRequest): result = await freepik_client.generate_video_kling( image=request.image, prompt=request.prompt, duration=request.duration, aspect_ratio=request.aspect_ratio, ) freepik_id = _extract_task_id(result) internal_id = task_tracker.submit(freepik_id, {'model': 'kling'}) return TaskResponse( task_id=internal_id, status=TaskStatus.pending, created_at=datetime.now(timezone.utc), ) @router.post('/minimax', response_model=TaskResponse) async def generate_video_minimax(request: MinimaxRequest): result = await freepik_client.generate_video_minimax( prompt=request.prompt, first_frame_image=request.first_frame_image, subject_reference=request.subject_reference, ) freepik_id = _extract_task_id(result) internal_id = task_tracker.submit(freepik_id, {'model': 'minimax'}) return TaskResponse( task_id=internal_id, status=TaskStatus.pending, created_at=datetime.now(timezone.utc), ) @router.post('/seedance', response_model=TaskResponse) async def generate_video_seedance(request: SeedanceRequest): result = await freepik_client.generate_video_seedance( prompt=request.prompt, image=request.image, duration=request.duration, resolution=request.resolution, ) freepik_id = _extract_task_id(result) internal_id = task_tracker.submit(freepik_id, {'model': 'seedance'}) return TaskResponse( task_id=internal_id, status=TaskStatus.pending, created_at=datetime.now(timezone.utc), )