Release v1.6.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
55d0e3141c
commit
17844d4c28
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "real-debrid-downloader",
|
"name": "real-debrid-downloader",
|
||||||
"version": "1.6.0",
|
"version": "1.6.1",
|
||||||
"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",
|
||||||
|
|||||||
@ -1462,6 +1462,7 @@ export class DownloadManager extends EventEmitter {
|
|||||||
this.runOutcomes.delete(itemId);
|
this.runOutcomes.delete(itemId);
|
||||||
this.itemContributedBytes.delete(itemId);
|
this.itemContributedBytes.delete(itemId);
|
||||||
this.retryAfterByItem.delete(itemId);
|
this.retryAfterByItem.delete(itemId);
|
||||||
|
this.retryStateByItem.delete(itemId);
|
||||||
if (this.session.running) {
|
if (this.session.running) {
|
||||||
this.runItemIds.add(itemId);
|
this.runItemIds.add(itemId);
|
||||||
}
|
}
|
||||||
@ -1555,7 +1556,6 @@ export class DownloadManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async checkRapidgatorLinks(itemIds: string[]): Promise<void> {
|
private async checkRapidgatorLinks(itemIds: string[]): Promise<void> {
|
||||||
const checked = new Map<string, Awaited<ReturnType<typeof checkRapidgatorOnline>>>();
|
|
||||||
const itemsToCheck: Array<{ itemId: string; url: string }> = [];
|
const itemsToCheck: Array<{ itemId: string; url: string }> = [];
|
||||||
|
|
||||||
for (const itemId of itemIds) {
|
for (const itemId of itemIds) {
|
||||||
@ -2470,6 +2470,7 @@ export class DownloadManager extends EventEmitter {
|
|||||||
item.targetPath = "";
|
item.targetPath = "";
|
||||||
item.provider = null;
|
item.provider = null;
|
||||||
item.fullStatus = "Wartet";
|
item.fullStatus = "Wartet";
|
||||||
|
item.onlineStatus = undefined;
|
||||||
item.updatedAt = nowMs();
|
item.updatedAt = nowMs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2534,6 +2535,7 @@ export class DownloadManager extends EventEmitter {
|
|||||||
item.targetPath = "";
|
item.targetPath = "";
|
||||||
item.provider = null;
|
item.provider = null;
|
||||||
item.fullStatus = "Wartet";
|
item.fullStatus = "Wartet";
|
||||||
|
item.onlineStatus = undefined;
|
||||||
item.updatedAt = nowMs();
|
item.updatedAt = nowMs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2924,6 +2926,8 @@ export class DownloadManager extends EventEmitter {
|
|||||||
this.speedBytesPerPackage.clear();
|
this.speedBytesPerPackage.clear();
|
||||||
this.speedEventsHead = 0;
|
this.speedEventsHead = 0;
|
||||||
this.abortPostProcessing("stop");
|
this.abortPostProcessing("stop");
|
||||||
|
for (const waiter of this.packagePostProcessWaiters) { waiter.resolve(); }
|
||||||
|
this.packagePostProcessWaiters = [];
|
||||||
for (const active of this.activeTasks.values()) {
|
for (const active of this.activeTasks.values()) {
|
||||||
active.abortReason = "stop";
|
active.abortReason = "stop";
|
||||||
active.abortController.abort("stop");
|
active.abortController.abort("stop");
|
||||||
@ -3576,7 +3580,7 @@ export class DownloadManager extends EventEmitter {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.settings.autoExtract && failed === 0 && success > 0) {
|
if (this.settings.autoExtract && failed === 0 && cancelled === 0 && success > 0) {
|
||||||
const needsExtraction = items.some((item) => item.status === "completed" && !isExtractedLabel(item.fullStatus));
|
const needsExtraction = items.some((item) => item.status === "completed" && !isExtractedLabel(item.fullStatus));
|
||||||
if (needsExtraction) {
|
if (needsExtraction) {
|
||||||
pkg.status = "queued";
|
pkg.status = "queued";
|
||||||
@ -6048,7 +6052,11 @@ export class DownloadManager extends EventEmitter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Immediately clean up extracted items if "Sofort" policy is active
|
// Immediately clean up extracted items if "Sofort" policy is active
|
||||||
this.applyPackageDoneCleanup(packageId);
|
if (this.settings.completedCleanupPolicy === "immediate") {
|
||||||
|
for (const itemId of [...pkg.itemIds]) {
|
||||||
|
this.applyCompletedCleanupPolicy(packageId, itemId);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!this.session.packages[packageId]) {
|
if (!this.session.packages[packageId]) {
|
||||||
return; // Package was fully cleaned up
|
return; // Package was fully cleaned up
|
||||||
}
|
}
|
||||||
@ -6426,7 +6434,7 @@ export class DownloadManager extends EventEmitter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.removePackageFromSession(packageId, [...pkg.itemIds]);
|
this.removePackageFromSession(packageId, [...pkg.itemIds], "completed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -453,7 +453,7 @@ export function saveSettings(paths: StoragePaths, settings: AppSettings): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let asyncSettingsSaveRunning = false;
|
let asyncSettingsSaveRunning = false;
|
||||||
let asyncSettingsSaveQueued: { paths: StoragePaths; payload: string } | null = null;
|
let asyncSettingsSaveQueued: { paths: StoragePaths; settings: AppSettings } | null = null;
|
||||||
|
|
||||||
async function writeSettingsPayload(paths: StoragePaths, payload: string): Promise<void> {
|
async function writeSettingsPayload(paths: StoragePaths, payload: string): Promise<void> {
|
||||||
await fs.promises.mkdir(paths.baseDir, { recursive: true });
|
await fs.promises.mkdir(paths.baseDir, { recursive: true });
|
||||||
@ -476,7 +476,7 @@ export async function saveSettingsAsync(paths: StoragePaths, settings: AppSettin
|
|||||||
const persisted = sanitizeCredentialPersistence(normalizeSettings(settings));
|
const persisted = sanitizeCredentialPersistence(normalizeSettings(settings));
|
||||||
const payload = JSON.stringify(persisted, null, 2);
|
const payload = JSON.stringify(persisted, null, 2);
|
||||||
if (asyncSettingsSaveRunning) {
|
if (asyncSettingsSaveRunning) {
|
||||||
asyncSettingsSaveQueued = { paths, payload };
|
asyncSettingsSaveQueued = { paths, settings };
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
asyncSettingsSaveRunning = true;
|
asyncSettingsSaveRunning = true;
|
||||||
@ -489,7 +489,7 @@ export async function saveSettingsAsync(paths: StoragePaths, settings: AppSettin
|
|||||||
if (asyncSettingsSaveQueued) {
|
if (asyncSettingsSaveQueued) {
|
||||||
const queued = asyncSettingsSaveQueued;
|
const queued = asyncSettingsSaveQueued;
|
||||||
asyncSettingsSaveQueued = null;
|
asyncSettingsSaveQueued = null;
|
||||||
void writeSettingsPayload(queued.paths, queued.payload).catch((err) => logger.error(`Async Settings-Save (queued) fehlgeschlagen: ${String(err)}`));
|
void saveSettingsAsync(queued.paths, queued.settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2706,7 +2706,13 @@ export function App(): ReactElement {
|
|||||||
{deleteConfirm && (() => {
|
{deleteConfirm && (() => {
|
||||||
const itemCount = [...deleteConfirm.ids].filter((id) => snapshot.session.items[id]).length;
|
const itemCount = [...deleteConfirm.ids].filter((id) => snapshot.session.items[id]).length;
|
||||||
const pkgCount = [...deleteConfirm.ids].filter((id) => snapshot.session.packages[id]).length;
|
const pkgCount = [...deleteConfirm.ids].filter((id) => snapshot.session.packages[id]).length;
|
||||||
const totalRemaining = Object.keys(snapshot.session.items).length + Object.keys(snapshot.session.packages).length - itemCount - pkgCount;
|
const removedItemIds = new Set<string>();
|
||||||
|
for (const id of deleteConfirm.ids) {
|
||||||
|
if (snapshot.session.items[id]) removedItemIds.add(id);
|
||||||
|
const pkg = snapshot.session.packages[id];
|
||||||
|
if (pkg) { for (const iid of pkg.itemIds) removedItemIds.add(iid); }
|
||||||
|
}
|
||||||
|
const totalRemaining = Object.keys(snapshot.session.items).length - removedItemIds.size;
|
||||||
const parts: string[] = [];
|
const parts: string[] = [];
|
||||||
if (pkgCount > 0) parts.push(`${pkgCount} Paket(e)`);
|
if (pkgCount > 0) parts.push(`${pkgCount} Paket(e)`);
|
||||||
if (itemCount > 0) parts.push(`${itemCount} Link(s)`);
|
if (itemCount > 0) parts.push(`${itemCount} Link(s)`);
|
||||||
@ -2991,7 +2997,8 @@ export function App(): ReactElement {
|
|||||||
<div className="ctx-menu-sep" />
|
<div className="ctx-menu-sep" />
|
||||||
<button className="ctx-menu-item" onClick={() => {
|
<button className="ctx-menu-item" onClick={() => {
|
||||||
const urls = contextEntry!.urls!;
|
const urls = contextEntry!.urls!;
|
||||||
setLinkPopup({ title: contextEntry!.name, links: urls, isPackage: urls.length > 1 });
|
const links = urls.map((u) => ({ name: u, url: u }));
|
||||||
|
setLinkPopup({ title: contextEntry!.name, links, isPackage: links.length > 1 });
|
||||||
setHistoryCtxMenu(null);
|
setHistoryCtxMenu(null);
|
||||||
}}>Linkadressen anzeigen</button>
|
}}>Linkadressen anzeigen</button>
|
||||||
</>
|
</>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user