Release v1.6.9

Fix extraction resume state / progress sync, abort labels, and hybrid pkg.status

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sucukdeluxe 2026-03-04 14:43:31 +01:00
parent 97c5bfaa7d
commit 86a358d568
3 changed files with 23 additions and 4 deletions

View File

@ -1,6 +1,6 @@
{
"name": "real-debrid-downloader",
"version": "1.6.8",
"version": "1.6.9",
"description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)",
"main": "build/main/main/main.js",
"author": "Sucukdeluxe",

View File

@ -3495,13 +3495,19 @@ export class DownloadManager extends EventEmitter {
if (!item || item.status !== "completed") {
continue;
}
if (/^Entpacken/i.test(item.fullStatus || "")) {
const ft = (item.fullStatus || "").trim();
if (/^Entpacken/i.test(ft)) {
// Only mark items with active extraction progress as "abgebrochen".
// Items that were just pending ("Ausstehend", "Warten auf Parts") weren't
// actively being extracted, so keep their label as-is.
if (ft !== "Entpacken - Ausstehend" && ft !== "Entpacken - Warten auf Parts") {
item.fullStatus = "Entpacken abgebrochen (wird fortgesetzt)";
item.updatedAt = nowMs();
}
}
}
}
}
private async acquirePostProcessSlot(packageId: string): Promise<void> {
// Extract packages sequentially (one at a time) to focus I/O on finishing
@ -3614,6 +3620,8 @@ export class DownloadManager extends EventEmitter {
if (!allDone && this.settings.autoExtract && this.settings.hybridExtract && success > 0 && failed === 0) {
const needsExtraction = items.some((item) => item.status === "completed" && !isExtractedLabel(item.fullStatus));
if (needsExtraction) {
pkg.status = "queued";
pkg.updatedAt = nowMs();
for (const item of items) {
if (item.status === "completed" && !isExtractedLabel(item.fullStatus)) {
item.fullStatus = "Entpacken - Ausstehend";
@ -3716,6 +3724,8 @@ export class DownloadManager extends EventEmitter {
item.status === "completed" && !isExtractedLabel(item.fullStatus)
);
if (needsExtraction) {
pkg.status = "queued";
pkg.updatedAt = nowMs();
for (const item of items) {
if (item.status === "completed" && !isExtractedLabel(item.fullStatus)) {
item.fullStatus = "Entpacken - Ausstehend";

View File

@ -1945,6 +1945,15 @@ export async function extractPackageArchives(options: ExtractOptions): Promise<{
emitProgress(extracted, "", "extracting");
// Emit "done" progress for archives already completed via resume state
// so the caller's onProgress handler can mark their items as "Done" immediately
// rather than leaving them as "Entpacken - Ausstehend" until all extraction finishes.
for (const archivePath of candidates) {
if (resumeCompleted.has(archiveNameKey(path.basename(archivePath)))) {
emitProgress(extracted, path.basename(archivePath), "extracting", 100, 0);
}
}
const maxParallel = Math.max(1, options.maxParallel || 1);
let noExtractorEncountered = false;