from io import BytesIO from typing import Any, Optional from pydantic import BaseModel from tomli import loads as toml_loads from tomli_w import dump as toml_dump from webdav3.exceptions import RemoteResourceNotFound from .async_helpers import run_in_executor from .dav_common import webdav_resource from .dav_file import DavFile class ImageConfig(BaseModel): mode: str = "RGB" save_params: dict[str, Any] = { "format": "JPEG", "quality": 85, } class Config(BaseModel): ticker_separator: str = " +++ " cache_seconds: int = 30 image: ImageConfig = ImageConfig() __instance: Optional["Config"] = None @classmethod async def get(cls) -> "Config": if cls.__instance is not None: return cls.__instance try: dav_file = DavFile("config.txt") cls.__instance = cls.parse_obj( toml_loads(await dav_file.string) ) except RemoteResourceNotFound: cls.__instance = cls() @run_in_executor def create_conf() -> None: buffer = BytesIO() toml_dump( cls.__instance.dict(), buffer, multiline_strings=True, ) buffer.seek(0) webdav_resource("config.txt").read_from(buffer) await create_conf() return cls.__instance