Files
AV-Live/data_feeds/feeds/_util.py
T
L'électron rare 0d189a2139 feat: add real-time data feeds for various sources
- Implemented new data feeds for Blitzortung, Bluesky, GCN, GitHub, Mempool, Netzfrequenz, OpenSky, RTE éCO2mix, SWPC, USGS.
- Introduced utility functions for rate limiting and hashing.
- Established OSC communication for data reception and processing.
- Created SuperCollider definitions for handling incoming data and generating audio output based on real-time data.
- Added configuration management for API credentials and polling intervals.
2026-05-11 06:59:44 +02:00

50 lines
1.3 KiB
Python

"""Helpers communs aux feeds."""
from __future__ import annotations
import collections
import time
from typing import Iterable
class RateMeter:
"""Compte les événements sur une fenêtre glissante (en secondes)."""
def __init__(self, window: float = 60.0) -> None:
self.window = window
self._events: collections.deque[float] = collections.deque()
def tick(self) -> int:
now = time.monotonic()
self._events.append(now)
while self._events and now - self._events[0] > self.window:
self._events.popleft()
return len(self._events)
@property
def rate(self) -> float:
return len(self._events) / max(self.window, 1e-6)
def djb2(s: str) -> int:
"""Hash stable 0..65535 pour transformer une string en float OSC."""
h = 5381
for c in s.encode("utf-8", errors="ignore"):
h = ((h << 5) + h + c) & 0xFFFF
return h
def fnorm(x: float, lo: float, hi: float) -> float:
if hi <= lo:
return 0.0
return max(0.0, min(1.0, (x - lo) / (hi - lo)))
def safe_get(d: dict, path: Iterable[str], default=None):
cur = d
for k in path:
if isinstance(cur, dict) and k in cur:
cur = cur[k]
else:
return default
return cur