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__) _logger = getLogger(__name__)
class TickerConfig(BaseModel): class TickerAPIConfig(BaseModel):
""" """
Section "[ticker]" in "config.txt". Section "[ticker.api]" in "config.txt".
""" """
file_name: str = "ticker" file_name: str = "ticker"
separator: str = " +++ " separator: str = " +++ "
comment_marker: str = "#" comment_marker: str = "#"
class TickerUIConfig(BaseModel):
"""
Section "[ticker.ui]" in "config.txt".
"""
display: bool = True
color: str = "primary" color: str = "primary"
speed: int = 30 speed: int = 30
class TickerConfig(BaseModel):
"""
Section "[ticker]" in "config.txt".
"""
api: TickerAPIConfig = TickerAPIConfig()
ui: TickerUIConfig = TickerUIConfig()
class ImageConfig(BaseModel): class ImageConfig(BaseModel):
""" """
Sections "[image*]" in "config.txt". Sections "[image*]" in "config.txt".
@ -72,7 +89,7 @@ class Config(BaseModel):
dav_file = DavFile(SETTINGS.config_path) dav_file = DavFile(SETTINGS.config_path)
try: try:
return cls.parse_obj( cfg = cls.parse_obj(
toml_loads(await dav_file.as_string) toml_loads(await dav_file.as_string)
) )
@ -89,4 +106,4 @@ class Config(BaseModel):
buffer.seek(0) buffer.seek(0)
await dav_file.write(buffer.read()) await dav_file.write(buffer.read())
return cfg return cfg

View file

@ -7,7 +7,7 @@ This file: Main API router definition.
from fastapi import APIRouter from fastapi import APIRouter
from ..settings import SETTINGS 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 = APIRouter(prefix=f"/{SETTINGS.api_v1_prefix}")
main_router.include_router(text.router) 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(image.router)
main_router.include_router(calendar.router) main_router.include_router(calendar.router)
main_router.include_router(aggregate.router) main_router.include_router(aggregate.router)
main_router.include_router(misc.router)
__all__ = [ __all__ = [
"main_router", "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 - finding text files by name prefix
- getting text file raw content by name prefix - getting text file raw content by name prefix
- getting text file HTML content by name prefix (using Markdown) - getting text file HTML content by name prefix (using Markdown)
- getting the "ticker" raw content
- getting the "ticker" HTML content (using Markdown)
""" """
import re import re

View file

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