release: prepare v2.0.82

This commit is contained in:
Sucukdeluxe
2026-09-01 00:13:30 +02:00
parent d58cfba817
commit e7639bc4df
23 changed files with 313 additions and 59 deletions
+8
View File
@@ -88,6 +88,7 @@ import { normalizeStatisticsLedger, saveStatisticsLedger } from "./statistics-le
import { NotificationOutbox } from "./notification-outbox";
import { sendNotification } from "./notify";
import { DownloadHealthMonitor } from "./download-health-monitor";
import { ensureStartupWorkDirectories } from "./startup-work-directories";
import { shouldDeferAutoResumeToDailyStart } from "./daily-start-scheduler";
import { configureNetworkProxy, getNetworkProxyState, shutdownNetworkProxy } from "./network-proxy";
import { createProxyOnlyAccountError, resolveProxyOnlyAccountErrorCode } from "./proxy-account-errors";
@@ -173,6 +174,13 @@ export class AppController {
}
this.applyNetworkProxyConfiguration();
this.initializeLogStorage();
const workDirectories = ensureStartupWorkDirectories(this.settings);
if (workDirectories.created.length > 0) {
logger.info(`Arbeitsordner beim Start angelegt: ${workDirectories.created.map((entry) => entry.kind).join(", ")}`);
}
for (const failure of workDirectories.failures) {
logger.warn(`Arbeitsordner konnte beim Start nicht angelegt werden (${failure.kind}): ${failure.error}`);
}
this.runHistoryLifecycleCleanup("Start", () => resetHistoryForRetention(this.storagePaths, this.settings.historyRetentionMode));
const loadResult = loadSessionWithStatus(this.storagePaths);
const session = loadResult.session;
+4 -3
View File
@@ -79,9 +79,10 @@ export function defaultSettings(): AppSettings {
providerPrimary: "realdebrid",
providerSecondary: "megadebrid-api",
providerTertiary: "bestdebrid",
autoProviderFallback: true,
outputDir: baseDir,
packageName: "",
autoProviderFallback: true,
outputDir: baseDir,
createWorkDirectoriesOnStartup: false,
packageName: "",
autoExtract: true,
autoRename4sf4sj: false,
keepGermanAudioOnly: false,
+1
View File
@@ -179,6 +179,7 @@ export function createRendererSettings(settings: AppSettings): RendererSettings
providerTertiary: settings.providerTertiary,
autoProviderFallback: settings.autoProviderFallback,
outputDir: settings.outputDir,
createWorkDirectoriesOnStartup: settings.createWorkDirectoriesOnStartup,
packageName: settings.packageName,
autoExtract: settings.autoExtract,
autoRename4sf4sj: settings.autoRename4sf4sj,
+57
View File
@@ -0,0 +1,57 @@
import fs from "node:fs";
import path from "node:path";
import type { AppSettings } from "../shared/types";
export type StartupWorkDirectoryKind = "download" | "extract" | "video-library";
export interface StartupWorkDirectoryEntry {
kind: StartupWorkDirectoryKind;
directory: string;
}
export interface StartupWorkDirectoryFailure extends StartupWorkDirectoryEntry {
error: string;
}
export interface StartupWorkDirectoryResult {
created: StartupWorkDirectoryEntry[];
existing: StartupWorkDirectoryEntry[];
failures: StartupWorkDirectoryFailure[];
}
function directoryKey(directory: string): string {
const resolved = path.resolve(directory);
return process.platform === "win32" ? resolved.toLowerCase() : resolved;
}
export function ensureStartupWorkDirectories(settings: AppSettings): StartupWorkDirectoryResult {
const result: StartupWorkDirectoryResult = { created: [], existing: [], failures: [] };
if (!settings.createWorkDirectoriesOnStartup) {
return result;
}
const candidates: StartupWorkDirectoryEntry[] = [
{ kind: "download", directory: settings.outputDir },
...(settings.autoExtract ? [{ kind: "extract" as const, directory: settings.extractDir }] : []),
...(settings.collectMkvToLibrary ? [{ kind: "video-library" as const, directory: settings.mkvLibraryDir }] : [])
];
const seen = new Set<string>();
for (const candidate of candidates) {
const entry = { ...candidate, directory: path.resolve(candidate.directory) };
const key = directoryKey(entry.directory);
if (seen.has(key)) {
continue;
}
seen.add(key);
const existed = fs.existsSync(entry.directory);
try {
fs.mkdirSync(entry.directory, { recursive: true });
(existed ? result.existing : result.created).push(entry);
} catch (error) {
result.failures.push({ ...entry, error: String(error) });
}
}
return result;
}
+6 -3
View File
@@ -585,9 +585,12 @@ export function normalizeSettings(settings: AppSettings): AppSettings {
providerPrimary: normalizeConfiguredProvider(settings.providerPrimary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled) || defaults.providerPrimary,
providerSecondary: normalizeFallbackProvider(settings.providerSecondary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
providerTertiary: normalizeFallbackProvider(settings.providerTertiary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
autoProviderFallback: Boolean(settings.autoProviderFallback),
outputDir: normalizeAbsoluteDir(directorySettings.outputDir, defaults.outputDir),
packageName: asText(settings.packageName),
autoProviderFallback: Boolean(settings.autoProviderFallback),
outputDir: normalizeAbsoluteDir(directorySettings.outputDir, defaults.outputDir),
createWorkDirectoriesOnStartup: settings.createWorkDirectoriesOnStartup !== undefined
? Boolean(settings.createWorkDirectoriesOnStartup)
: defaults.createWorkDirectoriesOnStartup,
packageName: asText(settings.packageName),
autoExtract: Boolean(settings.autoExtract),
autoRename4sf4sj: Boolean(settings.autoRename4sf4sj),
keepGermanAudioOnly: Boolean(settings.keepGermanAudioOnly),