Trackers: horodatage discret de la dernière maj des données (cache 1h)

This commit is contained in:
jerem
2026-06-17 15:33:13 +02:00
parent b6e8aa7225
commit 767e514dad
3 changed files with 19 additions and 1 deletions

View File

@@ -323,3 +323,11 @@ async def fetch_all() -> list[TrackerStat]:
return [] return []
_load_cache() # hydrate le cache depuis le disque au premier appel _load_cache() # hydrate le cache depuis le disque au premier appel
return list(await asyncio.gather(*(_fetch_one(s) for s in specs))) 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

View File

@@ -64,6 +64,11 @@ async def build_context() -> dict:
) )
now = datetime.now(ZoneInfo(config.timezone)) 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 { return {
"width": config.width, "width": config.width,
"height": config.height, "height": config.height,
@@ -77,6 +82,7 @@ async def build_context() -> dict:
"nas": nas_status, "nas": nas_status,
"codex": codex_status, "codex": codex_status,
"trackers": tracker_stats, "trackers": tracker_stats,
"trackers_updated": trackers_updated,
"kobo": kobo.current(), "kobo": kobo.current(),
"updated": now.strftime("%H:%M"), "updated": now.strftime("%H:%M"),
"stale": False, "stale": False,

View File

@@ -43,6 +43,9 @@
.label .meta { font-weight: 700; font-size: 24px; letter-spacing: 1px; text-transform: uppercase; .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); } margin-left: auto; padding: 4px 12px; border: 3px solid var(--ink); }
.label .alarm { background: var(--ink); color: var(--paper); } .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; } hr.div { border: 0; border-top: 4px solid var(--ink); margin: 22px 0; }
.pane hr.div { margin: 16px 0; } .pane hr.div { margin: 16px 0; }
@@ -209,7 +212,8 @@
{% if trackers %} {% if trackers %}
<hr class="div"> <hr class="div">
<div class="label"><span class="t">Trackers</span></div> <div class="label"><span class="t">Trackers</span>
{% if trackers_updated %}<span class="stamp">maj {{ trackers_updated }}</span>{% endif %}</div>
<div class="rows"> <div class="rows">
{% for t in trackers %} {% for t in trackers %}
<div class="trk"> <div class="trk">