Compare commits

...

4 commits

Author SHA1 Message Date
564bac8ea4 documentation 2022-09-09 02:23:48 +00:00
a8c5180027 misc router 2022-09-09 02:21:52 +00:00
1f2b5a9607 get ticker ui config 2022-09-09 00:04:13 +00:00
ccbac0a455 split TickerConfig 2022-09-08 23:59:17 +00:00
6 changed files with 92 additions and 20 deletions

View file

@ -18,18 +18,35 @@ from .settings import SETTINGS
_logger = getLogger(__name__)
class TickerConfig(BaseModel):
class TickerAPIConfig(BaseModel):
"""
Section "[ticker]" in "config.txt".
Section "[ticker.api]" in "config.txt".
"""
file_name: str = "ticker"
separator: str = " +++ "
comment_marker: str = "#"
class TickerUIConfig(BaseModel):
"""
Section "[ticker.ui]" in "config.txt".
"""
display: bool = True
color: str = "primary"
speed: int = 30
class TickerConfig(BaseModel):
"""
Section "[ticker]" in "config.txt".
"""
api: TickerAPIConfig = TickerAPIConfig()
ui: TickerUIConfig = TickerUIConfig()
class ImageConfig(BaseModel):
"""
Sections "[image*]" in "config.txt".
@ -72,7 +89,7 @@ class Config(BaseModel):
dav_file = DavFile(SETTINGS.config_path)
try:
return cls.parse_obj(
cfg = cls.parse_obj(
toml_loads(await dav_file.as_string)
)

View file

@ -7,7 +7,7 @@ This file: Main API router definition.
from fastapi import APIRouter
from ..settings import SETTINGS
from . import aggregate, calendar, image, text, ticker
from . import aggregate, calendar, image, misc, text, ticker
main_router = APIRouter(prefix=f"/{SETTINGS.api_v1_prefix}")
main_router.include_router(text.router)
@ -15,6 +15,7 @@ main_router.include_router(ticker.router)
main_router.include_router(image.router)
main_router.include_router(calendar.router)
main_router.include_router(aggregate.router)
main_router.include_router(misc.router)
__all__ = [
"main_router",

View file

@ -0,0 +1,45 @@
"""
Router "misc" provides:
- getting the project version
- getting the device IP
"""
from importlib.metadata import version
from logging import getLogger
from socket import AF_INET, SOCK_DGRAM, socket
from fastapi import APIRouter
from ..settings import SETTINGS
_logger = getLogger(__name__)
router = APIRouter(prefix="/misc", tags=["misc"])
@router.on_event("startup")
async def start_router() -> None:
_logger.debug(f"{router.prefix} router starting.")
@router.get("/lanip")
async def get_ip() -> str:
with socket(
family=AF_INET,
type=SOCK_DGRAM,
) as s:
s.settimeout(0)
try:
s.connect((SETTINGS.ping_address, SETTINGS.ping_port))
IP = s.getsockname()[0]
except Exception:
IP = "127.0.0.1"
return IP
@router.get("/version")
async def get_version() -> str:
return version("ovdashboard-api")

View file

@ -5,8 +5,6 @@ Router "text" provides:
- finding text files by name prefix
- getting text file raw content by name prefix
- getting text file HTML content by name prefix (using Markdown)
- getting the "ticker" raw content
- getting the "ticker" HTML content (using Markdown)
"""
import re

View file

@ -1,12 +1,9 @@
"""
Router "text" provides:
Router "ticker" provides:
- listing text files
- finding text files by name prefix
- getting text file raw content by name prefix
- getting text file HTML content by name prefix (using Markdown)
- getting the "ticker" raw content
- getting the "ticker" HTML content (using Markdown)
- getting the ticker's raw content
- getting the ticker's HTML content (using Markdown)
- getting the ticker's UI config
"""
from logging import getLogger
@ -15,7 +12,7 @@ from typing import Iterator
from fastapi import APIRouter, Depends
from markdown import markdown
from ..config import Config
from ..config import Config, TickerUIConfig
from ..dav_common import webdav_ensure_path
from ..dav_file import DavFile
from .text import text_lister, text_unique
@ -34,7 +31,7 @@ async def start_router() -> None:
async def get_ticker_lines() -> Iterator[str]:
cfg = await Config.get()
file_name = await text_unique(cfg.ticker.file_name)
file_name = await text_unique(cfg.ticker.api.file_name)
ticker = await DavFile(
f"{await text_lister.remote_path}/{file_name}",
@ -55,7 +52,7 @@ async def get_ticker_content_lines(
return (
line
for line in ticker_lines
if not line.startswith(cfg.ticker.comment_marker)
if not line.startswith(cfg.ticker.api.comment_marker)
)
@ -63,22 +60,32 @@ 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 = cfg.ticker.api.separator.join(
["", *ticker_content_lines, ""],
)
return ticker_content.strip()
@ router.get("/get/html")
@ router.get("/html")
async def get_ticker(
ticker_content: str = Depends(get_ticker_content),
) -> str:
return markdown(ticker_content)
@ router.get("/get/raw")
@ 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.ui

View file

@ -52,6 +52,10 @@ class Settings(BaseSettings):
cache_seconds: int = 30
cache_size: int = 30
# doesn't even have to be reachable
ping_address: str = "10.0.0.0"
ping_port: int = 1
api_v1_prefix: str = "api/v1"
openapi_url: str = "/openapi.json"
docs_url: Optional[str] = None if production_mode else "/docs"