Files
AI-Video/api/routers/content.py
2025-11-07 16:59:12 +08:00

135 lines
3.8 KiB
Python

"""
Content generation endpoints
Endpoints for generating narrations, image prompts, and titles.
"""
from fastapi import APIRouter, HTTPException
from loguru import logger
from api.dependencies import PixelleVideoDep
from api.schemas.content import (
NarrationGenerateRequest,
NarrationGenerateResponse,
ImagePromptGenerateRequest,
ImagePromptGenerateResponse,
TitleGenerateRequest,
TitleGenerateResponse,
)
from pixelle_video.utils.content_generators import (
generate_narrations_from_topic,
generate_image_prompts,
generate_title,
)
router = APIRouter(prefix="/content", tags=["Content Generation"])
@router.post("/narration", response_model=NarrationGenerateResponse)
async def generate_narration(
request: NarrationGenerateRequest,
pixelle_video: PixelleVideoDep
):
"""
Generate narrations from text
Uses LLM to break down text into multiple narration segments.
- **text**: Source text
- **n_scenes**: Number of narrations to generate
- **min_words**: Minimum words per narration
- **max_words**: Maximum words per narration
Returns list of narration strings.
"""
try:
logger.info(f"Generating {request.n_scenes} narrations from text")
# Call narration generator utility function
narrations = await generate_narrations_from_topic(
llm_service=pixelle_video.llm,
topic=request.text,
n_scenes=request.n_scenes,
min_words=request.min_words,
max_words=request.max_words
)
return NarrationGenerateResponse(
narrations=narrations
)
except Exception as e:
logger.error(f"Narration generation error: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/image-prompt", response_model=ImagePromptGenerateResponse)
async def generate_image_prompt(
request: ImagePromptGenerateRequest,
pixelle_video: PixelleVideoDep
):
"""
Generate image prompts from narrations
Uses LLM to create detailed image generation prompts.
- **narrations**: List of narration texts
- **min_words**: Minimum words per prompt
- **max_words**: Maximum words per prompt
Returns list of image prompts.
"""
try:
logger.info(f"Generating image prompts for {len(request.narrations)} narrations")
# Call image prompt generator utility function
image_prompts = await generate_image_prompts(
llm_service=pixelle_video.llm,
narrations=request.narrations,
min_words=request.min_words,
max_words=request.max_words
)
return ImagePromptGenerateResponse(
image_prompts=image_prompts
)
except Exception as e:
logger.error(f"Image prompt generation error: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/title", response_model=TitleGenerateResponse)
async def generate_title_endpoint(
request: TitleGenerateRequest,
pixelle_video: PixelleVideoDep
):
"""
Generate video title from text
Uses LLM to create an engaging title.
- **text**: Source text
- **style**: Optional title style hint
Returns generated title.
"""
try:
logger.info("Generating title from text")
# Call title generator utility function
title = await generate_title(
llm_service=pixelle_video.llm,
content=request.text,
strategy="llm"
)
return TitleGenerateResponse(
title=title
)
except Exception as e:
logger.error(f"Title generation error: {e}")
raise HTTPException(status_code=500, detail=str(e))