Fix: Selbst-Lahmlegung der Mega-Debrid-API beheben (1-Token-pro-Account + falscher 60-min-Cooldown)
Live aus conversion.log belegt: bei API-first + maxParallel hammerten viele parallele Umwandlungen DENSELBEN Account → Mega-Debrids 1-Token-pro-Account- Regel → "Token error, please log-in" (Token gegenseitig invalidiert). Ein einzelner generischer Null-getLink wurde dann als "Login oder Unrestrict fehlgeschlagen" geworfen → classifyAccountFailure matchte das Wort "Login" → category=invalid → 60-MINUTEN-Cooldown auf einen NACHWEISLICH funktionierenden Account (39x OK davor, klappt auch auf der Webseite). Folge: alle Accounts cooled, alle Slots haengen an Fehl-Umwandlungen (conv12/dl0), nichts laedt. Fix A (download-manager): getSerializedValidatingLimit gilt jetzt auch fuer megadebrid-api (nicht nur -web) = Anzahl nutzbarer Accounts ohne :api-Cooldown. Damit laeuft hoechstens EINE API-Umwandlung pro Account gleichzeitig (Rotation verteilt 1/Account) — respektiert die 1-Token-Regel, verhindert die Token- Kollision und gibt Download-Slots frei. Fix B (debrid): (1) generische Wurf-Meldung "Login oder Unrestrict fehlgeschlagen" -> "Linkgenerierung lieferte kein Ergebnis" (kein "Login"- Trigger mehr). (2) classifyAccountFailure: "token error"/"please log-in" -> kurzer temporary-Cooldown (15s); invalid-Branch nur noch bei ECHTEN Credential-Fehlern (bad login/incorrect password/invalid credentials/ unauthorized/forbidden/connectUser) statt losem login|auth. Ein transienter Fehler sperrt einen guten Account nicht mehr 60 min, sondern hoechstens Sekunden. Tests: API-Serialisierung 2-Acct->2-parallel + 1-Acct->1-at-a-time; kein 60-min-invalid bei Null-Ergebnis; token-error<60s. 844/844 gruen, tsc=6.
This commit is contained in:
+6
-2
@@ -1897,7 +1897,7 @@ class MegaDebridClient {
|
||||
logger.info(`Mega-Debrid (API) unrestrict OK: ${apiResult.fileName}`);
|
||||
return apiResult;
|
||||
}
|
||||
throw new Error("Mega-Debrid API: Login oder Unrestrict fehlgeschlagen");
|
||||
throw new Error("Mega-Debrid API: Linkgenerierung lieferte kein Ergebnis");
|
||||
} catch (error) {
|
||||
const errorText = compactErrorText(error);
|
||||
if (signal?.aborted || (/aborted/i.test(errorText) && !/timeout/i.test(errorText))) {
|
||||
@@ -2162,7 +2162,11 @@ class MegaDebridClient {
|
||||
return { fatal: true, cooldownMs: 0, message: errorText, category: "temporary" };
|
||||
}
|
||||
|
||||
if (/login|password|auth|credentials|unauthorized|forbidden/i.test(errorText) || /connectUser/i.test(errorText)) {
|
||||
if (/token.?error|please log.?in/i.test(errorText)) {
|
||||
return { fatal: false, cooldownMs: 15_000, message: errorText, category: "temporary" };
|
||||
}
|
||||
|
||||
if (/bad.?login|incorrect.?(login|password)|invalid.?(login|password|credentials)|wrong.?password|unauthorized|forbidden|connectUser/i.test(errorText)) {
|
||||
return {
|
||||
fatal: false,
|
||||
cooldownMs: MEGA_DEBRID_INVALID_ACCOUNT_COOLDOWN_MS,
|
||||
|
||||
@@ -7998,9 +7998,10 @@ export class DownloadManager extends EventEmitter {
|
||||
}
|
||||
|
||||
private getSerializedValidatingLimit(provider: DebridProvider | null): number {
|
||||
if (provider === "megadebrid-web") {
|
||||
if (provider === "megadebrid-web" || provider === "megadebrid-api") {
|
||||
const mode = provider === "megadebrid-web" ? "web" : "api";
|
||||
const usableAccounts = getAvailableMegaDebridAccounts(this.settings)
|
||||
.filter((account) => !getMegaDebridAccountCooldownState(`${account.id}:web`))
|
||||
.filter((account) => !getMegaDebridAccountCooldownState(`${account.id}:${mode}`))
|
||||
.length;
|
||||
return Math.max(1, usableAccounts);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user