From f6f6694215c272c17c97c75db7469c145e19da21 Mon Sep 17 00:00:00 2001 From: jerem Date: Wed, 17 Jun 2026 10:57:07 +0200 Subject: [PATCH] =?UTF-8?q?Trackers:=20ajoute=20tr4ker=20(SPA=20React,=20a?= =?UTF-8?q?uth=20cookie)=20+=20jetons=20Cr=C3=A9dit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type tr4ker : login cookie TR4KER_session via POST /api/auth/login {identifier, password}, profil GET /api/me. Ratio = (uploaded+bonus_upload)/(downloaded+ bonus_download), garde-fou download=0 -> 1 Go. Jetons = champ money, libellé token_currency_name (Crédit). --- .env.example | 6 +++++ backend/integrations/trackers.py | 42 +++++++++++++++++++++++++++++++- dev/preview.py | 1 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 1d078d8..da42a51 100644 --- a/.env.example +++ b/.env.example @@ -54,6 +54,12 @@ MONITORINK_CODEX_TOKEN_FILE=/hermes/auth.json #MONITORINK_TRACKER_TORR9_URL=https://api.torr9.net #MONITORINK_TRACKER_TORR9_USER=TonUsername #MONITORINK_TRACKER_TORR9_PASS=TonMotDePasse +# tr4ker : type "tr4ker" (SPA React, auth cookie). URL = domaine du site. +#MONITORINK_TRACKER_TR4KER_LABEL=tr4ker +#MONITORINK_TRACKER_TR4KER_TYPE=tr4ker +#MONITORINK_TRACKER_TR4KER_URL=https://tr4ker.net +#MONITORINK_TRACKER_TR4KER_USER=TonIdentifiant +#MONITORINK_TRACKER_TR4KER_PASS=TonMotDePasse #MONITORINK_TRACKER_TTL=1800 # Home Assistant (optionnel) — laisser vide pour désactiver diff --git a/backend/integrations/trackers.py b/backend/integrations/trackers.py index b816f1f..16b01b6 100644 --- a/backend/integrations/trackers.py +++ b/backend/integrations/trackers.py @@ -165,7 +165,47 @@ async def _fetch_torr9(spec: TrackerSpec) -> TrackerStat: ) -_FETCHERS = {"unit3d_nuxt": _fetch_unit3d, "torr9": _fetch_torr9} +async def _fetch_tr4ker(spec: TrackerSpec) -> TrackerStat: + """tr4ker : SPA React, API même origine. Login cookie (JWT `TR4KER_session`) via + `POST /api/auth/login` body `{identifier,password}` -> `{ok:true}`, puis `GET /api/me`. + Ratio comme le site : (uploaded + bonus_upload) / (downloaded + bonus_download) ; + si rien n'a été téléchargé, on compte 1 Go (le site fait pareil via bonus_download, + ça évite un ratio infini). Système de jetons = champ `money` (libellé `token_currency_name`).""" + if not (spec.base_url and spec.username and spec.password): + return TrackerStat(spec.key, spec.label, ok=False, error="non configuré") + + async with httpx.AsyncClient( + timeout=20, follow_redirects=True, headers={"User-Agent": _UA}, + ) as client: + r = await client.post( + f"{spec.base_url}/api/auth/login", + json={"identifier": spec.username, "password": spec.password}, + ) + try: + d = r.json() + except ValueError: + raise _AuthError(f"login HTTP {r.status_code}") + if not d.get("ok"): + raise _AuthError(str(d.get("error") or d.get("message") or "login refusé")) + me = await client.get(f"{spec.base_url}/api/me") # cookie de session porté par le client + if me.status_code != 200: + raise _AuthError(f"me HTTP {me.status_code}") + u = me.json() + + up = int(u.get("uploaded", 0) or 0) + int(u.get("bonus_upload", 0) or 0) + down = int(u.get("downloaded", 0) or 0) + int(u.get("bonus_download", 0) or 0) + if down <= 0: + down = 10 ** 9 # rien téléchargé -> on compte 1 Go (pas de ratio infini) + money = u.get("money") + return TrackerStat( + spec.key, spec.label, ok=True, + ratio=up / down, up_bytes=up, down_bytes=down, + tokens=int(money) if money is not None else None, + tokens_label=str(u.get("token_currency_name") or "crédits"), + ) + + +_FETCHERS = {"unit3d_nuxt": _fetch_unit3d, "torr9": _fetch_torr9, "tr4ker": _fetch_tr4ker} async def _fetch_one(spec: TrackerSpec) -> TrackerStat: diff --git a/dev/preview.py b/dev/preview.py index 2ff5bb8..51f32c4 100644 --- a/dev/preview.py +++ b/dev/preview.py @@ -69,6 +69,7 @@ CTX = { "trackers": [ {"ok": True, "label": "c411", "ratio_h": "1,04", "up_h": "378 Go", "down_h": "365 Go", "tokens": None}, {"ok": True, "label": "torr9", "ratio_h": "1,62", "up_h": "226 Go", "down_h": "140 Go", "tokens": 2168, "tokens_h": "2 168", "tokens_label": "jetons"}, + {"ok": True, "label": "tr4ker", "ratio_h": "5233,52", "up_h": "5,62 To", "down_h": "1 Go", "tokens": 223, "tokens_h": "223", "tokens_label": "Crédit"}, {"ok": False, "label": "yggreborn", "error": "2FA requise"}, ], "ha_states": [