from datetime import UTC, datetime from functools import lru_cache from pathlib import Path import aiofiles from pydantic import Field, MongoDsn from pydantic_settings import BaseSettings, SettingsConfigDict ENV_FILE = Path(__file__).parent / ".env" def _get_okru_token() -> str: with Path(ENV_FILE.parent / ".okru-token").open() as file: token = file.read() return token.strip() class Settings(BaseSettings): APP_NAME: str = "telegram-video-encoder" API_ID: int API_HASH: str BOT_TOKEN: str STARTUP_DATETIME: datetime = datetime.now(UTC) MAX_DOWNLOAD_TASKS: int = 2 MAX_PROCESSING_TASKS: int = 2 LOG_CHANNEL_ID: int model_config = SettingsConfigDict(env_file=ENV_FILE, extra="ignore") class DatabaseConfig(BaseSettings): URL: MongoDsn = Field(alias="DATABASE_URL") NAME: str = "video-encoder" model_config = SettingsConfigDict(env_file=ENV_FILE, extra="ignore") class OkRuConfig(BaseSettings): TOKEN: str = Field(default_factory=_get_okru_token) EMAIL: str = Field(alias="OKRU_EMAIL") PASSWORD: str = Field(alias="OKRU_PASSWORD") model_config = SettingsConfigDict(env_file=ENV_FILE, extra="ignore") @lru_cache(maxsize=1) def get_settings() -> Settings: return Settings() @lru_cache(maxsize=1) def get_database_settings() -> DatabaseConfig: return DatabaseConfig() @lru_cache(maxsize=1) def get_okru_config() -> OkRuConfig: return OkRuConfig() async def update_okru_token(token: str) -> None: async with aiofiles.open(ENV_FILE.parent / ".okru-token") as file: await file.write(token)