From bc70ff94cc637fc2b942125ed367ed9bf8e3bd84 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Mon, 2 Mar 2026 19:29:32 +0100 Subject: [PATCH] Persist totalDownloadedAllTime across restarts - Save settings every 30s during active downloads (not just session) - Force settings save on shutdown and run finish - Preserve live totalDownloadedAllTime when user saves settings (app-controller's stale copy no longer overwrites the counter) Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- src/main/app-controller.ts | 3 +++ src/main/download-manager.ts | 13 +++++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2fa247b..78f7af6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "real-debrid-downloader", - "version": "1.5.11", + "version": "1.5.12", "description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)", "main": "build/main/main/main.js", "author": "Sucukdeluxe", diff --git a/src/main/app-controller.ts b/src/main/app-controller.ts index 8cb5001..f68ec48 100644 --- a/src/main/app-controller.ts +++ b/src/main/app-controller.ts @@ -133,6 +133,9 @@ export class AppController { return this.settings; } + // Preserve the live totalDownloadedAllTime from the download manager + const liveSettings = this.manager.getSettings(); + nextSettings.totalDownloadedAllTime = Math.max(nextSettings.totalDownloadedAllTime || 0, liveSettings.totalDownloadedAllTime || 0); this.settings = nextSettings; saveSettings(this.storagePaths, this.settings); this.manager.setSettings(this.settings); diff --git a/src/main/download-manager.ts b/src/main/download-manager.ts index 03a6d00..223b6af 100644 --- a/src/main/download-manager.ts +++ b/src/main/download-manager.ts @@ -23,7 +23,7 @@ import { DebridService, MegaWebUnrestrictor } from "./debrid"; import { collectArchiveCleanupTargets, extractPackageArchives, findArchiveCandidates } from "./extractor"; import { validateFileAgainstManifest } from "./integrity"; import { logger } from "./logger"; -import { StoragePaths, saveSession, saveSessionAsync } from "./storage"; +import { StoragePaths, saveSession, saveSessionAsync, saveSettings } from "./storage"; import { compactErrorText, ensureDirPath, filenameFromUrl, formatEta, humanSize, looksLikeOpaqueFilename, nowMs, sanitizeFilename, sleep } from "./utils"; type ActiveTask = { @@ -735,6 +735,7 @@ export class DownloadManager extends EventEmitter { private statsCacheAt = 0; private lastPersistAt = 0; + private lastSettingsPersistAt = 0; private cleanupQueue: Promise = Promise.resolve(); @@ -802,6 +803,7 @@ export class DownloadManager extends EventEmitter { } public setSettings(next: AppSettings): void { + next.totalDownloadedAllTime = Math.max(next.totalDownloadedAllTime || 0, this.settings.totalDownloadedAllTime || 0); this.settings = next; this.debridService.setSettings(next); this.resolveExistingQueuedOpaqueFilenames(); @@ -2462,6 +2464,7 @@ export class DownloadManager extends EventEmitter { this.retryAfterByItem.clear(); this.nonResumableActive = 0; this.session.summaryText = ""; + this.lastSettingsPersistAt = 0; // force settings save on shutdown this.persistNow(); this.emitState(true); logger.info(`Shutdown-Vorbereitung beendet: requeued=${requeuedItems}`); @@ -2636,8 +2639,13 @@ export class DownloadManager extends EventEmitter { } private persistNow(): void { - this.lastPersistAt = nowMs(); + const now = nowMs(); + this.lastPersistAt = now; void saveSessionAsync(this.storagePaths, this.session).catch((err) => logger.warn(`saveSessionAsync Fehler: ${compactErrorText(err)}`)); + if (now - this.lastSettingsPersistAt >= 30000) { + this.lastSettingsPersistAt = now; + try { saveSettings(this.storagePaths, this.settings); } catch (err) { logger.warn(`saveSettings Fehler: ${compactErrorText(err as Error)}`); } + } } private emitState(force = false): void { @@ -5405,6 +5413,7 @@ export class DownloadManager extends EventEmitter { this.nonResumableActive = 0; this.lastGlobalProgressBytes = this.session.totalDownloadedBytes; this.lastGlobalProgressAt = nowMs(); + this.lastSettingsPersistAt = 0; // force settings save on run finish this.persistNow(); this.emitState(); }