Spaces:
Running
Running
File size: 3,900 Bytes
d74863e 2d86cc8 d74863e 6aee0d2 d74863e faeab5c d74863e 745c70b 6405808 147d620 6405808 faeab5c 6405808 faeab5c 6405808 d74863e 6405808 d74863e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | """
Configuration management for the YouTube Notes AI application.
Uses Pydantic Settings for type-safe environment variable loading.
"""
import os
from pathlib import Path
from typing import Literal
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Application configuration settings loaded from environment variables."""
# Whisper Model Configuration
whisper_model_size: Literal["tiny", "base", "small", "medium", "large"] = Field(
default="base",
description="Whisper model size (larger = more accurate but slower)"
)
# Processing Limits
max_video_duration: int = Field(
default=7200,
description="Maximum video duration in seconds (2 hours default)"
)
youtube_transcript_strategy: Literal["supadata_first", "youtube_first", "cookies_required"] = Field(
default="supadata_first",
description="Transcript provider strategy ordering for YouTube note generation"
)
# Output Configuration
output_format: Literal["markdown", "json"] = Field(
default="markdown",
description="Output format for generated notes"
)
output_dir: Path = Field(
default=Path("outputs"),
description="Directory for saving generated notes"
)
# Logging Configuration
log_level: str = Field(
default="INFO",
description="Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)"
)
log_file: str = Field(
default="app.log",
description="Log file path"
)
# API Configuration
api_host: str = Field(
default="0.0.0.0",
description="FastAPI host address"
)
api_port: int = Field(
default=7860,
description="FastAPI port number (Hugging Face default)"
)
# Database Configuration (PostgreSQL - Deprecated in favor of Firebase)
database_url: str = Field(
default="postgresql+asyncpg://postgres:password@localhost:5432/studynotes",
description="PostgreSQL database connection URL (Deprecated)"
)
# Firebase Configuration
firebase_project_id: str = Field(
default="aidea-90e12",
description="Firebase Project ID"
)
firebase_service_account_path: str = Field(
default="firebase-service-account.json",
description="Path to Firebase service account JSON file"
)
firebase_service_account_json: str | None = Field(
default=None,
description="Firebase service account JSON content (for hidden secrets)"
)
firebase_storage_bucket: str = Field(
default="",
description="Firebase Storage bucket name"
)
# Authentication Configuration
secret_key: str = Field(
default="your-secret-key-change-this-in-production-min-32-chars",
description="JWT secret key for token signing (MUST be changed in production)"
)
access_token_expire_minutes: int = Field(
default=60,
description="JWT token expiration time in minutes"
)
algorithm: str = Field(
default="HS256",
description="JWT signing algorithm"
)
# Temporary Files
temp_dir: Path = Field(
default=Path("temp"),
description="Directory for temporary files (audio, video)"
)
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore"
)
def __init__(self, **kwargs):
"""Initialize settings and create necessary directories."""
super().__init__(**kwargs)
# Create directories if they don't exist
self.output_dir.mkdir(parents=True, exist_ok=True)
self.temp_dir.mkdir(parents=True, exist_ok=True)
# Global settings instance
settings = Settings()
|