ovdashboard/api/ovdashboard_api/routers/ticker.py

91 lines
2 KiB
Python

"""
Router "ticker" provides:
- getting the ticker's raw content
- getting the ticker's HTML content (using Markdown)
- getting the ticker's UI config
"""
from logging import getLogger
from typing import Iterator
from fastapi import APIRouter, Depends
from markdown import markdown
from ..config import Config, TickerUIConfig
from ..dav_common import webdav_ensure_path
from ..dav_file import DavFile
from .text import text_lister, text_unique
_logger = getLogger(__name__)
router = APIRouter(prefix="/ticker", tags=["text"])
@router.on_event("startup")
async def start_router() -> None:
_logger.debug(f"{router.prefix} router starting.")
webdav_ensure_path(await text_lister.remote_path)
async def get_ticker_lines() -> Iterator[str]:
cfg = await Config.get()
file_name = await text_unique(cfg.ticker.file_name)
ticker = await DavFile(
f"{await text_lister.remote_path}/{file_name}",
).as_string
return (
line.strip()
for line in ticker.split("\n")
if line.strip()
)
async def get_ticker_content_lines(
ticker_lines: Iterator[str] = Depends(get_ticker_lines),
) -> Iterator[str]:
cfg = await Config.get()
return (
line
for line in ticker_lines
if not line.startswith(cfg.ticker.comment_marker)
)
async def get_ticker_content(
ticker_content_lines: Iterator[str] = Depends(get_ticker_content_lines),
) -> str:
cfg = await Config.get()
ticker_content = cfg.ticker.separator.join(
["", *ticker_content_lines, ""],
)
return ticker_content.strip()
@ router.get("/html")
async def get_ticker(
ticker_content: str = Depends(get_ticker_content),
) -> str:
return markdown(ticker_content)
@ router.get("/raw")
async def get_raw_ticker(
ticker_content: str = Depends(get_ticker_content),
) -> str:
return ticker_content
@ router.get(
"/config",
response_model=TickerUIConfig,
)
async def get_ui_config(
cfg: Config = Depends(Config.get),
) -> TickerUIConfig:
return cfg.ticker