from typing import Literal from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Application settings.""" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", env_ignore_empty=True, extra="ignore", ) # Application Configuration HOST: str = "localhost" PORT: int = 8000 RELOAD: bool = True # Production URLs (for reverse proxy deployment) FRONTEND_URL: str = "http://localhost:8001" # Frontend URL in production BACKEND_URL: str = "http://localhost:8000" # Backend base URL # CORS Configuration CORS_ORIGINS: list[str] = [ "http://localhost:8001", # Frontend development "chrome-extension://*", # Chrome extensions ] # Database Configuration DATABASE_URL: str = "sqlite+aiosqlite:///data/soundboard.db" DATABASE_ECHO: bool = False # Logging Configuration LOG_LEVEL: str = "info" LOG_FILE: str = "logs/app.log" LOG_MAX_SIZE: int = 10 * 1024 * 1024 LOG_BACKUP_COUNT: int = 5 LOG_FORMAT: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" # JWT Configuration JWT_SECRET_KEY: str = ( "your-secret-key-change-in-production" # noqa: S105 default value if none set in .env ) JWT_ALGORITHM: str = "HS256" JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 15 JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # Cookie Configuration COOKIE_SECURE: bool = True COOKIE_SAMESITE: Literal["strict", "lax", "none"] = "lax" COOKIE_DOMAIN: str | None = "localhost" # Cookie domain (None for production) # OAuth2 Configuration GOOGLE_CLIENT_ID: str = "" GOOGLE_CLIENT_SECRET: str = "" GITHUB_CLIENT_ID: str = "" GITHUB_CLIENT_SECRET: str = "" # Audio Normalization Configuration NORMALIZED_AUDIO_FORMAT: str = "mp3" NORMALIZED_AUDIO_BITRATE: str = "256k" NORMALIZED_AUDIO_PASSES: int = 2 # 1 for one-pass, 2 for two-pass # Audio Extraction Configuration EXTRACTION_AUDIO_FORMAT: str = "mp3" EXTRACTION_AUDIO_BITRATE: str = "256k" EXTRACTION_TEMP_DIR: str = "sounds/temp" EXTRACTION_THUMBNAILS_DIR: str = "sounds/originals/extracted/thumbnails" EXTRACTION_MAX_CONCURRENT: int = 2 # Maximum concurrent extractions settings = Settings()