Trackers: section ratio/envoi/réception sous le NAS (c411, extensible)
Nouveau module integrations/trackers.py : pour chaque tracker configuré (env MONITORINK_TRACKERS + bloc par clé), récupère ratio/uploaded/downloaded. Type unit3d_nuxt (c411) : login session (CSRF meta + /api/auth/login) car le ratio n'est pas lisible au token API ; session réutilisée, résultat caché (TTL 30 min). Section dashboard sous le NAS, style instrument 1-bit. Architecture par type pour ajouter d'autres trackers ensuite.
This commit is contained in:
@@ -39,6 +39,19 @@ class HAEntity:
|
||||
return cls(entity_id=entity_id, label=label, unit=unit)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TrackerSpec:
|
||||
"""Un tracker torrent privé dont on affiche le ratio. `type` choisit le fetcher
|
||||
(v1 : `unit3d_nuxt`). Identifiants jamais versionnés (lus depuis `.env`)."""
|
||||
|
||||
key: str
|
||||
label: str
|
||||
base_url: str
|
||||
username: str
|
||||
password: str
|
||||
type: str = "unit3d_nuxt"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Config:
|
||||
# --- Affichage ---
|
||||
@@ -84,6 +97,13 @@ class Config:
|
||||
default_factory=lambda: _get("MONITORINK_CODEX_TOKEN_FILE", "/hermes/auth.json")
|
||||
)
|
||||
|
||||
# --- Trackers torrent privés (ratio du compte) ---
|
||||
# Le ratio change lentement et le login est coûteux (CSRF + session) : on cache
|
||||
# le résultat plus longtemps que le reste (défaut 30 min).
|
||||
tracker_ttl_seconds: int = field(
|
||||
default_factory=lambda: int(_get("MONITORINK_TRACKER_TTL", "1800"))
|
||||
)
|
||||
|
||||
# --- Cache / rafraîchissement serveur ---
|
||||
cache_ttl_seconds: int = field(
|
||||
default_factory=lambda: int(_get("MONITORINK_CACHE_TTL", "120"))
|
||||
@@ -106,6 +126,26 @@ class Config:
|
||||
def ha_entities(self) -> list[HAEntity]:
|
||||
return [HAEntity.parse(s) for s in _get_list("MONITORINK_HA_ENTITIES")]
|
||||
|
||||
@property
|
||||
def trackers(self) -> list[TrackerSpec]:
|
||||
"""Trackers actifs : `MONITORINK_TRACKERS=c411,autre` + un bloc d'env par clé,
|
||||
ex. `MONITORINK_TRACKER_C411_{URL,USER,PASS,LABEL,TYPE}`."""
|
||||
specs: list[TrackerSpec] = []
|
||||
for key in _get_list("MONITORINK_TRACKERS"):
|
||||
k = key.upper().replace("-", "_")
|
||||
base = _get(f"MONITORINK_TRACKER_{k}_URL").rstrip("/")
|
||||
if not base:
|
||||
continue
|
||||
specs.append(TrackerSpec(
|
||||
key=key,
|
||||
label=_get(f"MONITORINK_TRACKER_{k}_LABEL", key),
|
||||
base_url=base,
|
||||
username=_get(f"MONITORINK_TRACKER_{k}_USER"),
|
||||
password=_get(f"MONITORINK_TRACKER_{k}_PASS"),
|
||||
type=_get(f"MONITORINK_TRACKER_{k}_TYPE", "unit3d_nuxt"),
|
||||
))
|
||||
return specs
|
||||
|
||||
@property
|
||||
def ha_enabled(self) -> bool:
|
||||
return bool(self.ha_base_url and self.ha_token)
|
||||
|
||||
Reference in New Issue
Block a user