Files
AV-Live/data_feeds/feeds/github.py
T
L'électron rare 8913393e4c feat(data-feeds): data-only profile + feeds
Add config.data-only.toml for headless bridge mode.
Update .gitignore to exclude .venv, __pycache__, *.pt.
Improve USGS, SWPC, RTE, GitHub, and pose feeds:
error handling, rate limiting, keypoint emission.
Refactor bridge.py to support -c config file flag.
2026-05-13 09:33:36 +02:00

44 lines
1.4 KiB
Python

"""GitHub public events — firehose dev mondial (polling REST anonyme)."""
from __future__ import annotations
import asyncio
import logging
import httpx
from ._util import djb2
LOG = logging.getLogger("feed.github")
async def run(ctx) -> None:
cfg = ctx.cfg
url = cfg["url"]
period = float(cfg.get("poll_seconds", 30))
# IDs GitHub sont des strings numeriques croissants : on compare en int
# (la compare string casse des que le nombre de digits change).
last_id: int = 0
async with httpx.AsyncClient(timeout=20.0,
headers={"Accept": "application/vnd.github+json"}) as cli:
while True:
try:
r = await cli.get(url)
r.raise_for_status()
for ev in reversed(r.json()):
raw = ev.get("id", "")
try:
eid = int(raw)
except (TypeError, ValueError):
continue
if eid <= last_id:
continue
ctx.send(
"event",
float(djb2(ev.get("type", "?"))),
float(djb2(((ev.get("repo") or {}).get("name") or "?"))),
)
last_id = eid
except Exception as e: # noqa: BLE001
LOG.warning("fetch failed: %s", e)
await asyncio.sleep(period)