From c541f1cc92591607ada982f54454871b07ba175b Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Mon, 22 Jun 2026 03:33:00 +0200 Subject: [PATCH] Mega-Debrid: nicht mehr nach 3 transienten Leer-Antworten faelschlich aufs Tageslimit sperren Live-Ferndiagnose zeigte: beide Mega-Accounts wurden nach ~363 Downloads (~800GB) "bis zum Tagesreset" gesperrt, obwohl das echte Limit hoeher liegt (Nutzer: frueher ~1.3-1.4TB ueber Mega-Web). Ursache: die Web-Aufloesung liefert eine leere Antwort, wenn Rapidgator gerade keinen Server hat (transient) ODER ein Link offline/tot ist - beides per-Link/per-Hoster, KEIN Account- Tageslimit. Der Account loeste zwischendurch nachweislich weiter Links auf (result=OK), war also nicht erschoepft. Schon 3 solcher Leer-Antworten in Folge eskalierten aber zur harten 21h-Sperre ("Tageslimit erreicht"), die dann die ganze Liste lahmlegte und den Account ~500GB vor seinem echten Limit stoppte. Fix: die Schwelle fuer die "bis zum Tagesreset"-Sperre von 3 auf 10 aufeinander- folgende Leer-Antworten angehoben. Unterhalb der Schwelle greift weiter der bestehende 20s-Cooldown (schnelles Re-Probe), und jede erfolgreiche Aufloesung setzt die Zaehlung zurueck - so ueberstehen verstreute transiente Leer-Antworten bzw. einzelne tote Links die Sperre nicht mehr, und der Account laeuft bis zu seinem echten Limit. Eine wirklich anhaltende Leere (10x ohne einen Erfolg dazwischen = echte Erschoepfung) sperrt weiterhin bis zum Tagesreset. OFFEN (Folgeschritt, bewusst getrennt): tote/offline Rapidgator-Links auf dem Provider-Ketten-Pfad praezise als "Link offline" kennzeichnen statt als Hoster-/ Tageslimit, und fuer reine Per-Link-Fehler den Account gar nicht erst kuehlen (braucht Per-Link-Kontext quer durch die Aufloesungs-Kette). --- src/main/debrid.ts | 4 ++-- tests/debrid.test.ts | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/debrid.ts b/src/main/debrid.ts index c898230..fddbd13 100644 --- a/src/main/debrid.ts +++ b/src/main/debrid.ts @@ -302,7 +302,7 @@ function getMegaDebridAbortMinRunMs(): number { } const megaDebridEmptyResponseStreaks = new Map(); -export const MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART = 3; +export const MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART = 10; let megaDebridRotationCursor = 0; let megaDebridStickyCount = 0; @@ -2254,7 +2254,7 @@ class MegaDebridClient { const streak = recordMegaDebridEmptyResponseStreak(cooldownKey); if (streak >= MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART) { parkUntilRestart = true; - parkMessage = `Tageslimit erreicht (${streak}x kein Server/leere Antwort) — bis zum Tagesreset gesperrt`; + parkMessage = `Tageslimit erreicht (${streak}x leere Antwort in Folge) — bis zum Tagesreset gesperrt`; } } else { clearMegaDebridEmptyResponseStreak(cooldownKey); diff --git a/tests/debrid.test.ts b/tests/debrid.test.ts index 6a2495d..d922cd7 100644 --- a/tests/debrid.test.ts +++ b/tests/debrid.test.ts @@ -2140,7 +2140,7 @@ describe("debrid service", () => { it("escalates a Mega-Debrid account to 'until restart' after the empty-response streak threshold", () => { const key = `${getMegaDebridAccountId("user1")}:web`; - expect(MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART).toBe(3); + expect(MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART).toBe(10); expect(recordMegaDebridEmptyResponseStreak(key)).toBe(1); expect(recordMegaDebridEmptyResponseStreak(key)).toBe(2); expect(recordMegaDebridEmptyResponseStreak(key)).toBe(3); @@ -2265,8 +2265,9 @@ describe("debrid service", () => { globalThis.fetch = (async () => new Response("error", { status: 500 })) as typeof fetch; const key = `${getMegaDebridAccountId("user1")}:web`; - recordMegaDebridEmptyResponseStreak(key); - recordMegaDebridEmptyResponseStreak(key); + for (let i = 0; i < MEGA_DEBRID_EMPTY_STREAK_UNTIL_RESTART - 1; i += 1) { + recordMegaDebridEmptyResponseStreak(key); + } expect(getMegaDebridAccountCooldownState(key)?.untilRestart ?? false).toBe(false); const megaWeb = vi.fn(async () => null);