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