ovdashboard/api/ovdashboard_api/config.py

91 lines
1.9 KiB
Python

"""
Python representation of the "config.txt" file inside the WebDAV directory.
"""
from io import BytesIO
from typing import Any
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 .dav_common import caldav_list
from .dav_file import DavFile
class TickerConfig(BaseModel):
"""
Section "[ticker]" in "config.txt".
"""
separator: str = " +++ "
comment_marker: str = "#"
color: str = "primary"
speed: int = 30
class ImageConfig(BaseModel):
"""
Sections "[image*]" in "config.txt".
"""
mode: str = "RGB"
save_params: dict[str, Any] = {
"format": "JPEG",
"quality": 85,
}
class CalAggregateConfig(BaseModel):
"""
Sections "[[calendar.aggregate]]" in "config.txt".
"""
name: str = "All Events"
calendars: list[str]
class CalendarConfig(BaseModel):
"""
Section "[calendar]" in "config.txt".
"""
future_days: int = 365
aggregate: list[CalAggregateConfig] = []
class Config(BaseModel):
"""
Main representation of "config.txt".
"""
ticker: TickerConfig = TickerConfig()
image: ImageConfig = ImageConfig()
calendar: CalendarConfig = CalendarConfig()
@classmethod
async def get(cls) -> "Config":
"""
Load the configuration instance from the server using `TOML`.
"""
dav_file = DavFile("config.txt")
try:
return cls.parse_obj(
toml_loads(await dav_file.string)
)
except RemoteResourceNotFound:
cfg = cls()
cfg.calendar.aggregate.append(
CalAggregateConfig(calendars=await caldav_list()),
)
buffer = BytesIO()
toml_dump(cfg.dict(), buffer)
buffer.seek(0)
await dav_file.dump(buffer.read())
return cfg