Fix: 1fichier/DDownload-Fehler respektiert jetzt "Auto-Fallback aus"

Wenn ein 1fichier- oder DDownload-Link beim Entsperren scheiterte, fiel das
Tool bisher trotzdem auf die Provider-Kette (z.B. Mega-Debrid) durch — auch
wenn der Nutzer den automatischen Anbieter-Fallback in den Einstellungen
ausgeschaltet hatte. Damit wurde ein anderer Anbieter (und dessen Tageslimit/
Account) ungewollt verbraucht, obwohl der Nutzer genau das unterbinden wollte.

Jetzt prüfen die catch-Blöcke beider Hoster zusätzlich autoProviderFallback:
ist er aus, wird der Fehler direkt weitergereicht statt still auf den nächsten
Anbieter umzuschalten. Die Abbruch-Behandlung (User-Cancel/echtes aborted)
bleibt unverändert davor.

Wichtig: Die Dateinamen-Auflösung (getLinkInfos) bleibt bewusst NICHT betroffen
— deren Fehlschlag muss weiterhin nicht-fatal sein.

Test: 1fichier liefert KO + Fallback aus → Linkgenerierung wird abgelehnt und
die Mega-Debrid-getLink-Route nachweislich nicht aufgerufen.
This commit is contained in:
Sucukdeluxe 2026-06-17 04:37:42 +02:00
parent 8196263ac3
commit 21fb09b208
2 changed files with 48 additions and 0 deletions

View File

@ -3741,6 +3741,9 @@ export class DebridService {
if (signal?.aborted || (/aborted/i.test(errorText) && !/timeout/i.test(errorText))) { if (signal?.aborted || (/aborted/i.test(errorText) && !/timeout/i.test(errorText))) {
throw error; throw error;
} }
if (!settings.autoProviderFallback) {
throw error;
}
} }
} }
@ -3757,6 +3760,9 @@ export class DebridService {
if (signal?.aborted || (/aborted/i.test(errorText) && !/timeout/i.test(errorText))) { if (signal?.aborted || (/aborted/i.test(errorText) && !/timeout/i.test(errorText))) {
throw error; throw error;
} }
if (!settings.autoProviderFallback) {
throw error;
}
} }
} }

View File

@ -1453,6 +1453,48 @@ describe("debrid service", () => {
expect(cooldown!.category).toBe("rate_limit"); expect(cooldown!.category).toBe("rate_limit");
}); });
it("does not fall through a failed 1fichier link to the provider chain when autoProviderFallback is off", async () => {
let megaGetLinkCalled = false;
const settings = {
...defaultSettings(),
token: "",
bestToken: "",
allDebridToken: "",
oneFichierApiKey: "1f-key",
megaLogin: "user",
megaPassword: "pass",
megaCredentials: "user:pass",
megaDebridApiEnabled: true,
megaDebridWebEnabled: false,
megaDebridPreferApi: true,
providerPrimary: "megadebrid" as const,
providerSecondary: "none" as const,
providerTertiary: "none" as const,
autoProviderFallback: false
};
globalThis.fetch = (async (input: RequestInfo | URL): Promise<Response> => {
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
if (url.includes("api.1fichier.com")) {
return new Response(JSON.stringify({ status: "KO", message: "not available" }), { status: 500, headers: { "Content-Type": "application/json" } });
}
if (url.includes("action=connectUser")) {
return new Response(JSON.stringify({ response_code: "ok", token: "tok", vip_end: Math.floor(Date.now() / 1000) + 999999 }), { status: 200, headers: { "Content-Type": "application/json" } });
}
if (url.includes("action=getLink")) {
megaGetLinkCalled = true;
return new Response(JSON.stringify({ response_code: "ok", debridLink: "https://mega-cdn.example/file.rar", filename: "file.rar" }), { status: 200, headers: { "Content-Type": "application/json" } });
}
return new Response("not-found", { status: 404 });
}) as typeof fetch;
const service = new DebridService(settings);
const result = await service.unrestrictLink("https://1fichier.com/?abc12345xyz").then((r) => ({ ok: true, r }), (e: unknown) => ({ ok: false, e }));
expect(result.ok).toBe(false);
expect(megaGetLinkCalled).toBe(false);
});
it("uses Mega Web only when it is configured as a separate fallback provider", async () => { it("uses Mega Web only when it is configured as a separate fallback provider", async () => {
const settings = { const settings = {
...defaultSettings(), ...defaultSettings(),