Compare commits
4 commits
83db799b96
...
564bac8ea4
| Author | SHA1 | Date | |
|---|---|---|---|
| 564bac8ea4 | |||
| a8c5180027 | |||
| 1f2b5a9607 | |||
| ccbac0a455 |
6 changed files with 92 additions and 20 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
45
api/ovdashboard_api/routers/misc.py
Normal file
45
api/ovdashboard_api/routers/misc.py
Normal 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")
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue