Trackers: ajoute tr4ker (SPA React, auth cookie) + jetons Crédit

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).
This commit is contained in:
jerem
2026-06-17 10:57:07 +02:00
parent c4e5c141aa
commit f6f6694215
3 changed files with 48 additions and 1 deletions

View File

@@ -54,6 +54,12 @@ MONITORINK_CODEX_TOKEN_FILE=/hermes/auth.json
#MONITORINK_TRACKER_TORR9_URL=https://api.torr9.net #MONITORINK_TRACKER_TORR9_URL=https://api.torr9.net
#MONITORINK_TRACKER_TORR9_USER=TonUsername #MONITORINK_TRACKER_TORR9_USER=TonUsername
#MONITORINK_TRACKER_TORR9_PASS=TonMotDePasse #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 #MONITORINK_TRACKER_TTL=1800
# Home Assistant (optionnel) — laisser vide pour désactiver # Home Assistant (optionnel) — laisser vide pour désactiver

View File

@@ -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: async def _fetch_one(spec: TrackerSpec) -> TrackerStat:

View File

@@ -69,6 +69,7 @@ CTX = {
"trackers": [ "trackers": [
{"ok": True, "label": "c411", "ratio_h": "1,04", "up_h": "378 Go", "down_h": "365 Go", "tokens": None}, {"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": "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"}, {"ok": False, "label": "yggreborn", "error": "2FA requise"},
], ],
"ha_states": [ "ha_states": [