From 83640b8f1f75f389df56934d8d45522cbb51aeb9 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Tue, 10 Mar 2026 20:08:43 +0100 Subject: [PATCH] Honor configured parallel extraction slots --- src/main/download-manager.ts | 7 +++---- tests/download-manager.test.ts | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/download-manager.ts b/src/main/download-manager.ts index d12436c..be29d26 100644 --- a/src/main/download-manager.ts +++ b/src/main/download-manager.ts @@ -5868,10 +5868,9 @@ export class DownloadManager extends EventEmitter { } private async acquirePostProcessSlot(packageId: string): Promise { - // Extract packages sequentially (one at a time) to focus I/O on finishing - // the earliest package first. maxParallelExtract is reserved for future - // intra-package parallelism. - const maxConcurrent = 1; + // Honor the user-facing "Parallele Entpackungen" setting for package-level + // post-processing so multiple episodes/packages can extract concurrently. + const maxConcurrent = Math.max(1, Math.min(8, this.settings.maxParallelExtract || 1)); if (this.packagePostProcessActive < maxConcurrent) { this.packagePostProcessActive += 1; return; diff --git a/tests/download-manager.test.ts b/tests/download-manager.test.ts index c4e68d4..8a3636f 100644 --- a/tests/download-manager.test.ts +++ b/tests/download-manager.test.ts @@ -243,6 +243,42 @@ describe("download manager", () => { expect((manager as any).shouldCollapseQuickPostProcessRequeue(packageId)).toBe(false); }); + it("honors maxParallelExtract for concurrent post-process slots", async () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-postprocess-slots-")); + tempDirs.push(root); + + const manager = new DownloadManager( + { + ...defaultSettings(), + token: "rd-token", + maxParallelExtract: 4 + }, + emptySession(), + createStoragePaths(path.join(root, "state")) + ); + + await (manager as any).acquirePostProcessSlot("pkg-1"); + await (manager as any).acquirePostProcessSlot("pkg-2"); + await (manager as any).acquirePostProcessSlot("pkg-3"); + await (manager as any).acquirePostProcessSlot("pkg-4"); + + expect((manager as any).packagePostProcessActive).toBe(4); + + let fifthResolved = false; + const fifth = (manager as any).acquirePostProcessSlot("pkg-5").then(() => { + fifthResolved = true; + }); + + await new Promise((resolve) => setTimeout(resolve, 30)); + expect(fifthResolved).toBe(false); + + (manager as any).releasePostProcessSlot(); + await fifth; + + expect(fifthResolved).toBe(true); + expect((manager as any).packagePostProcessActive).toBe(4); + }); + it("extractNow only re-arms completed items that are not already extracted", () => { const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-extract-now-")); tempDirs.push(root);