Files
freepik-api/app/routers/video_generation.py

70 lines
2.5 KiB
Python
Raw Permalink Normal View History

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),
)