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 from app.services.freepik_client import _extract_task_id logger = logging.getLogger(__name__) router = APIRouter(prefix='/api/v1/generate/video', tags=['video-generation']) @router.post('/kling', response_model=TaskResponse) async def generate_video_kling(request: KlingRequest): result = await freepik_client.generate_video_kling( first_frame=request.first_frame, last_frame=request.last_frame, prompt=request.prompt, duration=request.duration, aspect_ratio=request.aspect_ratio, ) freepik_id = _extract_task_id(result.data) if not freepik_id: raise HTTPException(status_code=502, detail='No task_id in Freepik response') internal_id = task_tracker.submit(freepik_id, result.status_path, {'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, last_frame_image=request.last_frame_image, ) freepik_id = _extract_task_id(result.data) if not freepik_id: raise HTTPException(status_code=502, detail='No task_id in Freepik response') internal_id = task_tracker.submit(freepik_id, result.status_path, {'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, ) freepik_id = _extract_task_id(result.data) if not freepik_id: raise HTTPException(status_code=502, detail='No task_id in Freepik response') internal_id = task_tracker.submit(freepik_id, result.status_path, {'model': 'seedance'}) return TaskResponse( task_id=internal_id, status=TaskStatus.pending, created_at=datetime.now(timezone.utc), )