From 767e514dade8744d9cb00d7a3d7aa16b681b0210 Mon Sep 17 00:00:00 2001 From: jerem Date: Wed, 17 Jun 2026 15:33:13 +0200 Subject: [PATCH] =?UTF-8?q?Trackers:=20horodatage=20discret=20de=20la=20de?= =?UTF-8?q?rni=C3=A8re=20maj=20des=20donn=C3=A9es=20(cache=201h)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/integrations/trackers.py | 8 ++++++++ backend/render.py | 6 ++++++ backend/templates/dashboard.html | 6 +++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/backend/integrations/trackers.py b/backend/integrations/trackers.py index ac04f39..6b27dfc 100644 --- a/backend/integrations/trackers.py +++ b/backend/integrations/trackers.py @@ -323,3 +323,11 @@ async def fetch_all() -> list[TrackerStat]: return [] _load_cache() # hydrate le cache depuis le disque au premier appel return list(await asyncio.gather(*(_fetch_one(s) for s in specs))) + + +def last_updated() -> float | None: + """Horodatage epoch du fetch réussi le plus récent parmi les trackers cachés + (à appeler après `fetch_all`). Reflète la fraîcheur réelle des données, qui peut + dater (cache 1h + persistance disque), pas l'heure du rendu. None si rien en cache.""" + stamps = [entry["ts"] for entry in _cache.values() if entry["value"].ok] + return max(stamps) if stamps else None diff --git a/backend/render.py b/backend/render.py index 9558013..4f131f5 100644 --- a/backend/render.py +++ b/backend/render.py @@ -64,6 +64,11 @@ async def build_context() -> dict: ) now = datetime.now(ZoneInfo(config.timezone)) + trk_ts = trackers.last_updated() + trackers_updated = ( + datetime.fromtimestamp(trk_ts, ZoneInfo(config.timezone)).strftime("%Hh%M") + if trk_ts else None + ) return { "width": config.width, "height": config.height, @@ -77,6 +82,7 @@ async def build_context() -> dict: "nas": nas_status, "codex": codex_status, "trackers": tracker_stats, + "trackers_updated": trackers_updated, "kobo": kobo.current(), "updated": now.strftime("%H:%M"), "stale": False, diff --git a/backend/templates/dashboard.html b/backend/templates/dashboard.html index 4f42765..9048b32 100644 --- a/backend/templates/dashboard.html +++ b/backend/templates/dashboard.html @@ -43,6 +43,9 @@ .label .meta { font-weight: 700; font-size: 24px; letter-spacing: 1px; text-transform: uppercase; margin-left: auto; padding: 4px 12px; border: 3px solid var(--ink); } .label .alarm { background: var(--ink); color: var(--paper); } + /* Horodatage discret de fraîcheur des données (ex. trackers cachés jusqu'à 1 h). */ + .label .stamp { margin-left: auto; font-family: "JetBrains Mono", monospace; + font-weight: 500; font-size: 22px; letter-spacing: 0; } hr.div { border: 0; border-top: 4px solid var(--ink); margin: 22px 0; } .pane hr.div { margin: 16px 0; } @@ -209,7 +212,8 @@ {% if trackers %}
-
Trackers
+
Trackers + {% if trackers_updated %}maj {{ trackers_updated }}{% endif %}
{% for t in trackers %}