release: prepare v2.0.82
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user