Add retry extraction context menu, increase error text limit
- Right-click packages with extraction errors shows "Extraktion wiederholen" option to manually retry - Increase WinRAR error text from 240 to 500 chars for better diagnostics in logs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
ecf56cb977
commit
a22a90adf3
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "real-debrid-downloader",
|
"name": "real-debrid-downloader",
|
||||||
"version": "1.5.14",
|
"version": "1.5.15",
|
||||||
"description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)",
|
"description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)",
|
||||||
"main": "build/main/main/main.js",
|
"main": "build/main/main/main.js",
|
||||||
"author": "Sucukdeluxe",
|
"author": "Sucukdeluxe",
|
||||||
|
|||||||
@ -208,6 +208,10 @@ export class AppController {
|
|||||||
return this.manager.togglePause();
|
return this.manager.togglePause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public retryExtraction(packageId: string): void {
|
||||||
|
this.manager.retryExtraction(packageId);
|
||||||
|
}
|
||||||
|
|
||||||
public cancelPackage(packageId: string): void {
|
public cancelPackage(packageId: string): void {
|
||||||
this.manager.cancelPackage(packageId);
|
this.manager.cancelPackage(packageId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2955,6 +2955,27 @@ export class DownloadManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public retryExtraction(packageId: string): void {
|
||||||
|
const pkg = this.session.packages[packageId];
|
||||||
|
if (!pkg) return;
|
||||||
|
if (this.packagePostProcessTasks.has(packageId)) return;
|
||||||
|
const items = pkg.itemIds.map((id) => this.session.items[id]).filter(Boolean) as DownloadItem[];
|
||||||
|
const completedItems = items.filter((item) => item.status === "completed");
|
||||||
|
if (completedItems.length === 0) return;
|
||||||
|
pkg.status = "queued";
|
||||||
|
pkg.updatedAt = nowMs();
|
||||||
|
for (const item of completedItems) {
|
||||||
|
if (!isExtractedLabel(item.fullStatus)) {
|
||||||
|
item.fullStatus = "Entpacken - Ausstehend";
|
||||||
|
item.updatedAt = nowMs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info(`Extraktion manuell wiederholt: pkg=${pkg.name}`);
|
||||||
|
this.persistSoon();
|
||||||
|
this.emitState(true);
|
||||||
|
void this.runPackagePostProcessing(packageId).catch((err) => logger.warn(`runPackagePostProcessing Fehler (retryExtraction): ${compactErrorText(err)}`));
|
||||||
|
}
|
||||||
|
|
||||||
private removePackageFromSession(packageId: string, itemIds: string[]): void {
|
private removePackageFromSession(packageId: string, itemIds: string[]): void {
|
||||||
const postProcessController = this.packagePostProcessAbortControllers.get(packageId);
|
const postProcessController = this.packagePostProcessAbortControllers.get(packageId);
|
||||||
if (postProcessController && !postProcessController.signal.aborted) {
|
if (postProcessController && !postProcessController.signal.aborted) {
|
||||||
|
|||||||
@ -178,7 +178,7 @@ function effectiveConflictMode(conflictMode: ConflictMode): "overwrite" | "skip"
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanErrorText(text: string): string {
|
function cleanErrorText(text: string): string {
|
||||||
return String(text || "").replace(/\s+/g, " ").trim().slice(0, 240);
|
return String(text || "").replace(/\s+/g, " ").trim().slice(0, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
function appendLimited(base: string, chunk: string, maxLen = MAX_EXTRACT_OUTPUT_BUFFER): string {
|
function appendLimited(base: string, chunk: string, maxLen = MAX_EXTRACT_OUTPUT_BUFFER): string {
|
||||||
|
|||||||
@ -314,6 +314,10 @@ function registerIpcHandlers(): void {
|
|||||||
validateString(packageId, "packageId");
|
validateString(packageId, "packageId");
|
||||||
return controller.togglePackage(packageId);
|
return controller.togglePackage(packageId);
|
||||||
});
|
});
|
||||||
|
ipcMain.handle(IPC_CHANNELS.RETRY_EXTRACTION, (_event: IpcMainInvokeEvent, packageId: string) => {
|
||||||
|
validateString(packageId, "packageId");
|
||||||
|
return controller.retryExtraction(packageId);
|
||||||
|
});
|
||||||
ipcMain.handle(IPC_CHANNELS.EXPORT_QUEUE, () => controller.exportQueue());
|
ipcMain.handle(IPC_CHANNELS.EXPORT_QUEUE, () => controller.exportQueue());
|
||||||
ipcMain.handle(IPC_CHANNELS.IMPORT_QUEUE, (_event: IpcMainInvokeEvent, json: string) => {
|
ipcMain.handle(IPC_CHANNELS.IMPORT_QUEUE, (_event: IpcMainInvokeEvent, json: string) => {
|
||||||
validateString(json, "json");
|
validateString(json, "json");
|
||||||
|
|||||||
@ -47,6 +47,7 @@ const api: ElectronApi = {
|
|||||||
exportBackup: (): Promise<{ saved: boolean }> => ipcRenderer.invoke(IPC_CHANNELS.EXPORT_BACKUP),
|
exportBackup: (): Promise<{ saved: boolean }> => ipcRenderer.invoke(IPC_CHANNELS.EXPORT_BACKUP),
|
||||||
importBackup: (): Promise<{ restored: boolean; message: string }> => ipcRenderer.invoke(IPC_CHANNELS.IMPORT_BACKUP),
|
importBackup: (): Promise<{ restored: boolean; message: string }> => ipcRenderer.invoke(IPC_CHANNELS.IMPORT_BACKUP),
|
||||||
openLog: (): Promise<void> => ipcRenderer.invoke(IPC_CHANNELS.OPEN_LOG),
|
openLog: (): Promise<void> => ipcRenderer.invoke(IPC_CHANNELS.OPEN_LOG),
|
||||||
|
retryExtraction: (packageId: string): Promise<void> => ipcRenderer.invoke(IPC_CHANNELS.RETRY_EXTRACTION, packageId),
|
||||||
onStateUpdate: (callback: (snapshot: UiSnapshot) => void): (() => void) => {
|
onStateUpdate: (callback: (snapshot: UiSnapshot) => void): (() => void) => {
|
||||||
const listener = (_event: unknown, snapshot: UiSnapshot): void => callback(snapshot);
|
const listener = (_event: unknown, snapshot: UiSnapshot): void => callback(snapshot);
|
||||||
ipcRenderer.on(IPC_CHANNELS.STATE_UPDATE, listener);
|
ipcRenderer.on(IPC_CHANNELS.STATE_UPDATE, listener);
|
||||||
|
|||||||
@ -2565,6 +2565,14 @@ export function App(): ReactElement {
|
|||||||
else { executeDeleteSelection(ids); }
|
else { executeDeleteSelection(ids); }
|
||||||
}}>Ausgewählte entfernen ({[...selectedIds].filter((id) => snapshot.session.items[id]).length})</button>
|
}}>Ausgewählte entfernen ({[...selectedIds].filter((id) => snapshot.session.items[id]).length})</button>
|
||||||
)}
|
)}
|
||||||
|
{hasPackages && !multi && (() => {
|
||||||
|
const pkg = snapshot.session.packages[contextMenu.packageId];
|
||||||
|
const items = pkg?.itemIds.map((id) => snapshot.session.items[id]).filter(Boolean) || [];
|
||||||
|
const hasExtractError = items.some((item) => item && /^Entpack-Fehler/i.test(item.fullStatus));
|
||||||
|
return hasExtractError ? (
|
||||||
|
<button className="ctx-menu-item" onClick={() => { void window.rd.retryExtraction(contextMenu.packageId); setContextMenu(null); }}>Extraktion wiederholen</button>
|
||||||
|
) : null;
|
||||||
|
})()}
|
||||||
{hasPackages && (
|
{hasPackages && (
|
||||||
<button className="ctx-menu-item ctx-danger" onClick={() => {
|
<button className="ctx-menu-item ctx-danger" onClick={() => {
|
||||||
setContextMenu(null);
|
setContextMenu(null);
|
||||||
|
|||||||
@ -31,5 +31,6 @@ export const IPC_CHANNELS = {
|
|||||||
QUIT: "app:quit",
|
QUIT: "app:quit",
|
||||||
EXPORT_BACKUP: "app:export-backup",
|
EXPORT_BACKUP: "app:export-backup",
|
||||||
IMPORT_BACKUP: "app:import-backup",
|
IMPORT_BACKUP: "app:import-backup",
|
||||||
OPEN_LOG: "app:open-log"
|
OPEN_LOG: "app:open-log",
|
||||||
|
RETRY_EXTRACTION: "queue:retry-extraction"
|
||||||
} as const;
|
} as const;
|
||||||
|
|||||||
@ -42,6 +42,7 @@ export interface ElectronApi {
|
|||||||
exportBackup: () => Promise<{ saved: boolean }>;
|
exportBackup: () => Promise<{ saved: boolean }>;
|
||||||
importBackup: () => Promise<{ restored: boolean; message: string }>;
|
importBackup: () => Promise<{ restored: boolean; message: string }>;
|
||||||
openLog: () => Promise<void>;
|
openLog: () => Promise<void>;
|
||||||
|
retryExtraction: (packageId: string) => Promise<void>;
|
||||||
onStateUpdate: (callback: (snapshot: UiSnapshot) => void) => () => void;
|
onStateUpdate: (callback: (snapshot: UiSnapshot) => void) => () => void;
|
||||||
onClipboardDetected: (callback: (links: string[]) => void) => () => void;
|
onClipboardDetected: (callback: (links: string[]) => void) => () => void;
|
||||||
onUpdateInstallProgress: (callback: (progress: UpdateInstallProgress) => void) => () => void;
|
onUpdateInstallProgress: (callback: (progress: UpdateInstallProgress) => void) => () => void;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user