Add TRMNL plugin markup
This commit is contained in:
@@ -0,0 +1,56 @@
|
|||||||
|
"""TRMNL e-ink display feed.
|
||||||
|
|
||||||
|
Serves today's jokes in the JSON shape TRMNL's Private Plugin "polling"
|
||||||
|
strategy expects, so a device can render them with the TRMNL design system.
|
||||||
|
|
||||||
|
Polling URL: https://wiki-jokes.obahan.xyz/trmnl.json
|
||||||
|
If TRMNL_TOKEN is set, the device must send it as ?token=*** header
|
||||||
|
(polling headers: trmnl-token=<token>).
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
from fastapi import Request
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
|
from . import db
|
||||||
|
from .generator import today_local
|
||||||
|
|
||||||
|
REFRESH_INTERVAL_SECONDS = 900 # jokes only change once a day; match TRMNL cadence
|
||||||
|
|
||||||
|
|
||||||
|
def _batch():
|
||||||
|
"""Today's batch, falling back to the latest available (stale flag set)."""
|
||||||
|
day = today_local()
|
||||||
|
batch = db.get_day(day)
|
||||||
|
stale = False
|
||||||
|
if batch is None:
|
||||||
|
batch = db.get_latest()
|
||||||
|
stale = True
|
||||||
|
return batch, stale
|
||||||
|
|
||||||
|
|
||||||
|
def payload(batch: dict, stale: bool) -> dict:
|
||||||
|
return {
|
||||||
|
"refresh_interval": REFRESH_INTERVAL_SECONDS,
|
||||||
|
"day": batch["day"],
|
||||||
|
"stale": stale,
|
||||||
|
"article_title": batch["article_title"],
|
||||||
|
"article_url": batch["article_url"],
|
||||||
|
"jokes": [{"text": j} for j in batch["jokes"]],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def trmnl_endpoint(request: Request):
|
||||||
|
token = os.environ.get("TRMNL_TOKEN", "")
|
||||||
|
if token:
|
||||||
|
supplied = request.query_params.get("token") or request.headers.get("trmnl-token")
|
||||||
|
if supplied != token:
|
||||||
|
return JSONResponse({"error": "unauthorized"}, status_code=403)
|
||||||
|
batch, stale = _batch()
|
||||||
|
if batch is None:
|
||||||
|
# Keep the last screen on the device instead of blanking it.
|
||||||
|
return JSONResponse(
|
||||||
|
{"status": "no_data", "refresh_interval": REFRESH_INTERVAL_SECONDS},
|
||||||
|
status_code=204,
|
||||||
|
)
|
||||||
|
return JSONResponse(payload(batch, stale))
|
||||||
Reference in New Issue
Block a user