crowncode-backend / app /schemas.py
Rthur2003's picture
feat: change decision_source type to string in AnalysisSummary schema
80d6ccc
"""
Pydantic schemas for YouTube analysis endpoints.
"""
from __future__ import annotations
from typing import Dict, List, Literal, Optional
from pydantic import BaseModel, Field
class YouTubeAnalyzeRequest(BaseModel):
url: str = Field(..., description="YouTube video URL")
include_raw: bool = Field(
default=False,
description="Include raw service responses in output",
)
class YouTubeSource(BaseModel):
url: str
normalized_url: str
video_id: str
start_time_sec: Optional[int] = None
title: Optional[str] = None
duration_sec: Optional[float] = None
audio_format: Optional[str] = None
class AnalysisSummary(BaseModel):
"""Summary of AI detection result."""
is_ai_generated: bool
confidence: float = Field(..., ge=0.0, le=1.0)
decision_source: str
model_version: str
indicators: List[str]
class ServiceResult(BaseModel):
available: bool
response: Optional[Dict[str, object]] = None
error: Optional[str] = None
class YouTubeAnalyzeResponse(BaseModel):
request_id: str
status: Literal["ok", "partial"]
source: YouTubeSource
summary: AnalysisSummary
music_ai: ServiceResult
ses_analizi: ServiceResult
warnings: List[str]
errors: List[str]
timings: Dict[str, float]
class AudioAugmentationOptions(BaseModel):
model_config = {"populate_by_name": True}
pitch_shift: bool = Field(default=False, alias="pitchShift", description="Apply random pitch shifting")
speed_change: bool = Field(default=False, alias="speedChange", description="Apply random speed change")
bass_boost: bool = Field(default=False, alias="bassBoost", description="Apply bass boost equalization")
trim_silence: bool = Field(default=False, alias="trimSilence", description="Trim leading and trailing silence")
mix_audio: bool = Field(default=False, alias="mixAudio", description="Mix with another audio track (placeholder)")
add_noise: bool = Field(default=False, alias="addNoise", description="Add Gaussian noise")