""" Scene Animation Routes Handles scene animation endpoints using WaveSpeed Kling and InfiniteTalk. """ import mimetypes from pathlib import Path from typing import Any, Dict, Optional from urllib.parse import quote from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request from loguru import logger from sqlalchemy.orm import Session from middleware.auth_middleware import get_current_user from models.story_models import ( AnimateSceneRequest, AnimateSceneResponse, AnimateSceneVoiceoverRequest, ResumeSceneAnimationRequest, ) from services.database import get_db from services.llm_providers.main_video_generation import track_video_usage 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.infinitetalk import animate_scene_with_voiceover from services.wavespeed.kling_animation import animate_scene_image, resume_scene_animation from utils.asset_tracker import save_asset_to_library from utils.logger_utils import get_service_logger from ..task_manager import task_manager from ..utils.auth import require_authenticated_user from ..utils.media_utils import load_story_audio_bytes, load_story_image_bytes router = APIRouter() 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