feat: dynamic provider order, hoster routing, MKV sample fix
- Replace fixed primary/secondary/tertiary slots with unlimited ordered providerOrder: DebridProvider[] list; supports as many accounts as needed - Provider list reorderable via up/down buttons in Accounts settings tab - Migration: derives order from legacy primary/secondary/tertiary if empty - Mega-Debrid split into megadebrid-api and megadebrid-web as separate providers - Add per-hoster routing (hosterRouting) to assign specific debrid provider per hoster - Fix duplicate MKV files in library: filter out sample files from Sample subfolders - Remove legacy provider-selection dropdowns from hidden settings section - Add CSS for provider-order-list/row/num/label/actions classes - Update debrid tests: add providerOrder: [] to use legacy fallback path Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
0003d786d8
commit
716b516900
@@ -156,6 +156,41 @@ function normalizeHosterRouting(raw: unknown, megaDebridPreferApi: boolean, mega
|
||||
return result;
|
||||
}
|
||||
|
||||
function normalizeProviderOrder(
|
||||
raw: unknown,
|
||||
megaDebridPreferApi: boolean,
|
||||
megaDebridApiEnabled: boolean,
|
||||
megaDebridWebEnabled: boolean,
|
||||
legacyPrimary: unknown,
|
||||
legacySecondary: unknown,
|
||||
legacyTertiary: unknown
|
||||
): DebridProvider[] {
|
||||
let list: unknown[] = [];
|
||||
|
||||
if (Array.isArray(raw) && raw.length > 0) {
|
||||
list = raw;
|
||||
} else {
|
||||
// Migrate from old primary/secondary/tertiary
|
||||
const candidates = [legacyPrimary, legacySecondary, legacyTertiary].filter(
|
||||
(v) => v && String(v).trim() && String(v).trim() !== "none"
|
||||
);
|
||||
if (candidates.length > 0) {
|
||||
list = candidates;
|
||||
}
|
||||
}
|
||||
|
||||
const seen = new Set<DebridProvider>();
|
||||
const result: DebridProvider[] = [];
|
||||
for (const entry of list) {
|
||||
const provider = normalizeConfiguredProvider(entry, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled);
|
||||
if (provider && !seen.has(provider)) {
|
||||
seen.add(provider);
|
||||
result.push(provider);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const DEPRECATED_UPDATE_REPOS = new Set([
|
||||
"sucukdeluxe/real-debrid-downloader"
|
||||
]);
|
||||
@@ -200,6 +235,11 @@ export function normalizeSettings(settings: AppSettings): AppSettings {
|
||||
linkSnappyPassword: asText(settings.linkSnappyPassword),
|
||||
archivePasswordList: String(settings.archivePasswordList ?? "").replace(/\r\n|\r/g, "\n"),
|
||||
rememberToken: Boolean(settings.rememberToken),
|
||||
providerOrder: normalizeProviderOrder(
|
||||
settings.providerOrder,
|
||||
megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled,
|
||||
settings.providerPrimary, settings.providerSecondary, settings.providerTertiary
|
||||
),
|
||||
providerPrimary: normalizeConfiguredProvider(settings.providerPrimary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled) || defaults.providerPrimary,
|
||||
providerSecondary: normalizeFallbackProvider(settings.providerSecondary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
|
||||
providerTertiary: normalizeFallbackProvider(settings.providerTertiary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
|
||||
|
||||
Reference in New Issue
Block a user