Improve extraction failure diagnostics

This commit is contained in:
Sucukdeluxe 2026-03-10 19:14:21 +01:00
parent 734c4e9968
commit a054eface5

View File

@ -1274,6 +1274,34 @@ export function extractArchiveNameFromExtractorLogMessage(message: string): stri
return null; return null;
} }
function summarizeExtractFailureReason(reason: string): string {
const text = compactErrorText(reason).replace(/^Error:\s*/i, "").trim();
if (!text) {
return "Entpacken fehlgeschlagen";
}
if (/checksum error|crc/i.test(text)) {
return "Checksum/CRC-Fehler im Archiv";
}
if (/wrong password|falsches passwort|password/i.test(text) && /checksum error in the encrypted file/i.test(text)) {
return "Checksum- oder Passwortfehler im verschluesselten Archiv";
}
if (/missing_file|next volume is required|cannot find volume|volume.*missing|part.*missing/i.test(text)) {
return "Teilarchiv fehlt oder ist nicht lesbar";
}
if (/unexpected end of archive|no end header found|invalid or unsupported zip format|not a rar archive|ungueltig|unsupported_format/i.test(text)) {
return "Archiv unvollstaendig oder ungueltig";
}
return text;
}
function formatExtractFailureLabel(reason: string, archiveName = ""): string {
const summary = summarizeExtractFailureReason(reason);
const archive = String(archiveName || "").trim();
return archive
? `Entpack-Fehler [${archive}]: ${summary}`
: `Entpack-Fehler: ${summary}`;
}
function retryDelayWithJitter(attempt: number, baseMs: number): number { function retryDelayWithJitter(attempt: number, baseMs: number): number {
const exponential = baseMs * Math.pow(1.5, Math.min(attempt - 1, 14)); const exponential = baseMs * Math.pow(1.5, Math.min(attempt - 1, 14));
const capped = Math.min(exponential, 120000); const capped = Math.min(exponential, 120000);
@ -5577,7 +5605,7 @@ export class DownloadManager extends EventEmitter {
if (entry.status !== "completed" || isExtractedLabel(entry.fullStatus)) { if (entry.status !== "completed" || isExtractedLabel(entry.fullStatus)) {
continue; continue;
} }
entry.fullStatus = `Entpack-Fehler: ${reason}`; entry.fullStatus = formatExtractFailureLabel(reason, archiveName);
entry.updatedAt = appliedAt; entry.updatedAt = appliedAt;
affectedItemIds.add(entry.id); affectedItemIds.add(entry.id);
} }
@ -5594,7 +5622,7 @@ export class DownloadManager extends EventEmitter {
const currentStatus = String(entry.fullStatus || "").trim(); const currentStatus = String(entry.fullStatus || "").trim();
if (currentStatus === "Entpacken - Error") { if (currentStatus === "Entpacken - Error") {
entry.fullStatus = `Entpack-Fehler: ${fallbackReason}`; entry.fullStatus = formatExtractFailureLabel(fallbackReason);
entry.updatedAt = appliedAt; entry.updatedAt = appliedAt;
appliedSpecificFailure = true; appliedSpecificFailure = true;
continue; continue;
@ -5615,7 +5643,7 @@ export class DownloadManager extends EventEmitter {
for (const entry of completedItems) { for (const entry of completedItems) {
if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) { if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) {
entry.fullStatus = `Entpack-Fehler: ${fallbackReason}`; entry.fullStatus = formatExtractFailureLabel(fallbackReason);
entry.updatedAt = appliedAt; entry.updatedAt = appliedAt;
} }
} }
@ -10316,6 +10344,17 @@ export class DownloadManager extends EventEmitter {
if (result.failed > 0) { if (result.failed > 0) {
const reason = compactErrorText(result.lastError || "Entpacken fehlgeschlagen"); const reason = compactErrorText(result.lastError || "Entpacken fehlgeschlagen");
const failAt = nowMs(); const failAt = nowMs();
if (fullFailedArchiveErrors.size > 0) {
const archiveSummaries = [...fullFailedArchiveErrors.entries()]
.slice(0, 3)
.map(([archiveName, errorText]) => `${archiveName}: ${summarizeExtractFailureReason(errorText)}`)
.join(" | ");
logger.warn(`Post-Processing Entpacken Fehlerdetails: pkg=${pkg.name}, archives=${archiveSummaries}`);
this.logPackageForPackage(pkg, "WARN", "Post-Processing Entpacken Fehlerdetails", {
failedArchives: [...fullFailedArchiveErrors.keys()],
summary: archiveSummaries
});
}
this.applyPackageExtractFailureStatuses( this.applyPackageExtractFailureStatuses(
completedItems, completedItems,
resolveArchiveItems, resolveArchiveItems,
@ -10359,7 +10398,7 @@ export class DownloadManager extends EventEmitter {
logger.error(`Post-Processing Entpacken Timeout: pkg=${pkg.name}`); logger.error(`Post-Processing Entpacken Timeout: pkg=${pkg.name}`);
for (const entry of completedItems) { for (const entry of completedItems) {
if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) { if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) {
entry.fullStatus = `Entpack-Fehler: ${timeoutReason}`; entry.fullStatus = formatExtractFailureLabel(timeoutReason);
entry.updatedAt = nowMs(); entry.updatedAt = nowMs();
} }
} }
@ -10384,7 +10423,7 @@ export class DownloadManager extends EventEmitter {
logger.error(`Post-Processing Entpacken Exception: pkg=${pkg.name}, reason=${reason}`); logger.error(`Post-Processing Entpacken Exception: pkg=${pkg.name}, reason=${reason}`);
for (const entry of completedItems) { for (const entry of completedItems) {
if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) { if (entry.status === "completed" && !isExtractedLabel(entry.fullStatus)) {
entry.fullStatus = `Entpack-Fehler: ${reason}`; entry.fullStatus = formatExtractFailureLabel(reason);
entry.updatedAt = nowMs(); entry.updatedAt = nowMs();
} }
} }