v0.5.112: keep skill demos at 16:9 and harden web refresh deploy triggers.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
voson
2026-07-30 01:48:01 +08:00
co-authored by Cursor
parent 28858c0703
commit fdd926e9bb
11 changed files with 295 additions and 48 deletions
+12 -6
View File
@@ -22,11 +22,13 @@ Approach (verified 2026-07):
``webcast/room/web/enter`` API was considered but returns empty bodies
without request signing, so the SSR page is the source of truth.)
Everything is soft-fail: network errors, empty or non-JSON responses keep the
previous ``is_live`` value and never abort a refresh tier (exit code is
always 0). Only the two probe fields are touched; all other keys (including
``live_url``) are preserved. Note the ``daily`` tier means the badge trails
reality by up to a day — truly real-time would need a higher-frequency job.
Everything is soft-fail: network errors, empty or non-JSON responses clear
``is_live`` to False and drop ``live_probed_at`` (so consumers treat the
badge as stale/unknown) and never abort a refresh tier (exit code is always
0). Only the two probe fields are touched; all other keys (including
``live_url``) are preserved. Production live badges are owned by the
visit-triggered ``/api/live-status`` edge probe; this daily write is only a
``data.json`` fallback until that API returns.
Preview only — do not merge into relations/heroes or recommend.
@@ -212,7 +214,11 @@ def probe_streamers(
print(f"skip {sid}: platform={platform!r} unsupported", flush=True)
continue
except (urllib.error.URLError, TimeoutError, OSError, ValueError) as e:
print(f" FAIL {sid}: {e} (keeping previous is_live)", flush=True)
# Align with /api/live-status and local serve_relations: unknown is
# not live, and must not preserve a stale positive badge.
row["is_live"] = False
row.pop("live_probed_at", None)
print(f" FAIL {sid}: {e} (is_live=false, stale)", flush=True)
fail += 1
continue
row["is_live"] = is_live