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()