feat: add per-hoster provider routing (Hoster-Zuordnung)

- New settings field hosterRouting maps file hosters to specific debrid providers
- 27 known hosters predefined (Rapidgator, Uploaded, Turbobit, Nitroflare, etc.)
- Custom hoster support via prompt dialog
- Routing takes priority over default provider chain
- Falls back to normal chain on error when autoProviderFallback is enabled
- Logs routing decisions: "Hoster-Zuordnung: rapidgator → Debrid-Link"
- Full UI section in settings with add/remove/change provider per hoster
- Storage validation and normalization for hosterRouting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sucukdeluxe
2026-03-06 19:14:16 +01:00
co-authored by Claude Opus 4.6
parent 9f94404435
commit c811649b9d
6 changed files with 246 additions and 3 deletions
+15 -1
View File
@@ -91,6 +91,19 @@ function normalizeColumnOrder(raw: unknown): string[] {
return result;
}
function normalizeHosterRouting(raw: unknown): Record<string, DebridProvider> {
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
const result: Record<string, DebridProvider> = {};
for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {
const hoster = String(key).trim().toLowerCase();
const provider = String(value ?? "").trim();
if (hoster && VALID_PRIMARY_PROVIDERS.has(provider)) {
result[hoster] = provider as DebridProvider;
}
}
return result;
}
const DEPRECATED_UPDATE_REPOS = new Set([
"sucukdeluxe/real-debrid-downloader"
]);
@@ -164,7 +177,8 @@ export function normalizeSettings(settings: AppSettings): AppSettings {
columnOrder: normalizeColumnOrder(settings.columnOrder),
extractCpuPriority: settings.extractCpuPriority,
autoExtractWhenStopped: settings.autoExtractWhenStopped !== undefined ? Boolean(settings.autoExtractWhenStopped) : defaults.autoExtractWhenStopped,
disabledProviders: Array.isArray(settings.disabledProviders) ? settings.disabledProviders.filter((p: unknown) => VALID_PRIMARY_PROVIDERS.has(p as string)) as DebridProvider[] : []
disabledProviders: Array.isArray(settings.disabledProviders) ? settings.disabledProviders.filter((p: unknown) => VALID_PRIMARY_PROVIDERS.has(p as string)) as DebridProvider[] : [],
hosterRouting: normalizeHosterRouting(settings.hosterRouting)
};
if (!VALID_PRIMARY_PROVIDERS.has(normalized.providerPrimary)) {