""" Story Writer API Router Main router for story generation operations including premise, outline, content generation, and full story creation. """ import mimetypes from pathlib import Path from typing import Any, Dict, List, Optional, Union from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request from loguru import logger from middleware.auth_middleware import get_current_user, get_current_user_with_query_token from models.story_models import ( AnimateSceneRequest, AnimateSceneVoiceoverRequest, AnimateSceneResponse, ResumeSceneAnimationRequest, StoryGenerationRequest, StorySetupGenerationRequest, StorySetupGenerationResponse, StorySetupOption, StoryStartRequest, StoryPremiseResponse, StoryOutlineResponse, StoryScene, StoryContentResponse, StoryFullGenerationResponse, StoryContinueRequest, StoryContinueResponse, StoryImageGenerationRequest, StoryImageGenerationResponse, StoryImageResult, StoryAudioGenerationRequest, StoryAudioGenerationResponse, StoryAudioResult, StoryVideoGenerationRequest, StoryVideoGenerationResponse, StoryVideoResult, TaskStatus, ) from pydantic import BaseModel, Field from services.database import get_db from services.llm_providers.main_video_generation import track_video_usage from services.story_writer.story_service import StoryWriterService from services.story_writer.video_generation_service import StoryVideoGenerationService from services.subscription import PricingService from services.subscription.preflight_validator import validate_scene_animation_operation from services.wavespeed.kling_animation import animate_scene_image, resume_scene_animation from services.wavespeed.infinitetalk import animate_scene_with_voiceover from uuid import uuid4 from utils.logger_utils import get_service_logger from .cache_manager import cache_manager from .routes import cache_routes, media_generation, story_content, story_setup, story_tasks, video_generation from .task_manager import task_manager from .utils.auth import require_authenticated_user from .utils.hd_video import generate_hd_video_payload, generate_hd_video_scene_payload from .utils.media_utils import load_story_image_bytes, load_story_audio_bytes, resolve_media_file from urllib.parse import quote router = APIRouter(prefix="/api/story", tags=["Story Writer"]) # Include modular routers (order preserved roughly by workflow) router.include_router(story_setup.router) router.include_router(story_content.router) router.include_router(story_tasks.router) router.include_router(media_generation.router) router.include_router(video_generation.router) router.include_router(cache_routes.router) service = StoryWriterService() scene_logger = get_service_logger("api.story_writer.scene_animation") AI_VIDEO_SUBDIR = Path("AI_Videos") def _build_authenticated_media_url(request: Request, path: str) -> str: """Append the caller's auth token to a media URL so