126 lines
3.5 KiB
Python
126 lines
3.5 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,
|
|
)
|
|
|
|
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 service
|
|
narrations = await pixelle_video.narration_generator(
|
|
text=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 service
|
|
image_prompts = await pixelle_video.image_prompt_generator(
|
|
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(
|
|
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 service
|
|
title = await pixelle_video.title_generator(
|
|
text=request.text
|
|
)
|
|
|
|
return TitleGenerateResponse(
|
|
title=title
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Title generation error: {e}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|