- Add Python FastAPI backend with Pydantic validation - Port WhiskClient and MetaAIClient to Python - Create API routers for all endpoints - Add Swagger/ReDoc documentation at /docs - Update Dockerfile for multi-service container - Add lib/api.ts frontend client - Update README for V3
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
"""
|
|
Video Router - Whisk video generation
|
|
"""
|
|
from fastapi import APIRouter, HTTPException
|
|
from models.requests import VideoGenerateRequest
|
|
from models.responses import VideoResponse, ErrorResponse
|
|
from services.whisk_client import WhiskClient
|
|
|
|
router = APIRouter(tags=["Video"])
|
|
|
|
|
|
@router.post(
|
|
"/video/generate",
|
|
response_model=VideoResponse,
|
|
responses={
|
|
400: {"model": ErrorResponse},
|
|
401: {"model": ErrorResponse},
|
|
500: {"model": ErrorResponse}
|
|
}
|
|
)
|
|
async def generate_video(request: VideoGenerateRequest):
|
|
"""
|
|
Generate video from an image using Whisk Animate (Veo).
|
|
|
|
- **prompt**: Motion description for the video
|
|
- **imageBase64**: Base64 encoded source image (optional if imageGenerationId provided)
|
|
- **imageGenerationId**: Existing Whisk image ID (optional if imageBase64 provided)
|
|
- **cookies**: Whisk authentication cookies
|
|
"""
|
|
if not request.cookies:
|
|
raise HTTPException(status_code=401, detail="Whisk cookies not found. Please configure settings.")
|
|
|
|
try:
|
|
client = WhiskClient(request.cookies)
|
|
|
|
print(f"[Video API] Generating video for prompt: \"{request.prompt[:50]}...\"")
|
|
|
|
result = await client.generate_video(
|
|
request.imageGenerationId or "",
|
|
request.prompt,
|
|
request.imageBase64
|
|
)
|
|
|
|
return VideoResponse(
|
|
success=True,
|
|
id=result.id,
|
|
url=result.url,
|
|
status=result.status
|
|
)
|
|
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
except Exception as e:
|
|
print(f"Video Generation API failed: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|