Compare commits
No commits in common. "c7c6134d48cc2a37955f8d85f802b111e1e4183c" and "afef8dae6f05feaa3cca16b7b9acfefbf0b058f8" have entirely different histories.
c7c6134d48
...
afef8dae6f
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "real-debrid-downloader",
|
"name": "real-debrid-downloader",
|
||||||
"version": "1.7.24",
|
"version": "1.7.23",
|
||||||
"description": "Desktop downloader",
|
"description": "Desktop downloader",
|
||||||
"main": "build/main/main/main.js",
|
"main": "build/main/main/main.js",
|
||||||
"author": "Sucukdeluxe",
|
"author": "Sucukdeluxe",
|
||||||
|
|||||||
@ -1074,7 +1074,6 @@ export class DownloadManager extends EventEmitter {
|
|||||||
this.recoverPostProcessingOnStartup();
|
this.recoverPostProcessingOnStartup();
|
||||||
this.resolveExistingQueuedOpaqueFilenames();
|
this.resolveExistingQueuedOpaqueFilenames();
|
||||||
this.restoreTargetPathReservations();
|
this.restoreTargetPathReservations();
|
||||||
this.revalidateCompletedItems();
|
|
||||||
this.checkExistingRapidgatorLinks();
|
this.checkExistingRapidgatorLinks();
|
||||||
void this.cleanupExistingExtractedArchives().catch((err) => logger.warn(`cleanupExistingExtractedArchives Fehler (constructor): ${compactErrorText(err)}`));
|
void this.cleanupExistingExtractedArchives().catch((err) => logger.warn(`cleanupExistingExtractedArchives Fehler (constructor): ${compactErrorText(err)}`));
|
||||||
}
|
}
|
||||||
@ -3993,42 +3992,6 @@ export class DownloadManager extends EventEmitter {
|
|||||||
this.fixDuplicateSuffixFiles();
|
this.fixDuplicateSuffixFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Re-validate "completed" items on startup: if the file on disk is significantly
|
|
||||||
* smaller than expected, the item was incorrectly marked completed (e.g. by the
|
|
||||||
* old 50% recovery threshold). Reset to "queued" so it gets re-downloaded. */
|
|
||||||
private revalidateCompletedItems(): void {
|
|
||||||
let fixed = 0;
|
|
||||||
for (const item of Object.values(this.session.items)) {
|
|
||||||
if (item.status !== "completed") continue;
|
|
||||||
if (!item.targetPath || !item.totalBytes || item.totalBytes <= 0) continue;
|
|
||||||
try {
|
|
||||||
const stat = fs.statSync(item.targetPath);
|
|
||||||
if (stat.size < item.totalBytes - ALLOCATION_UNIT_SIZE) {
|
|
||||||
logger.warn(`revalidateCompleted: ${item.fileName} ist nur ${humanSize(stat.size)} statt ${humanSize(item.totalBytes)}, setze auf queued`);
|
|
||||||
item.status = "queued";
|
|
||||||
item.fullStatus = "Wartet";
|
|
||||||
item.downloadedBytes = stat.size;
|
|
||||||
item.progressPercent = Math.floor((stat.size / item.totalBytes) * 100);
|
|
||||||
item.speedBps = 0;
|
|
||||||
fixed += 1;
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// file doesn't exist — reset to queued so it gets re-downloaded
|
|
||||||
logger.warn(`revalidateCompleted: ${item.fileName} Datei nicht gefunden, setze auf queued`);
|
|
||||||
item.status = "queued";
|
|
||||||
item.fullStatus = "Wartet";
|
|
||||||
item.downloadedBytes = 0;
|
|
||||||
item.progressPercent = 0;
|
|
||||||
item.speedBps = 0;
|
|
||||||
fixed += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fixed > 0) {
|
|
||||||
logger.info(`revalidateCompletedItems: ${fixed} Items korrigiert`);
|
|
||||||
this.persistSoon();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Detect items whose targetPath has a " (N)" suffix from a previous bug and rename
|
/** Detect items whose targetPath has a " (N)" suffix from a previous bug and rename
|
||||||
* them back to the original filename if the original path is not claimed by another item. */
|
* them back to the original filename if the original path is not claimed by another item. */
|
||||||
private fixDuplicateSuffixFiles(): void {
|
private fixDuplicateSuffixFiles(): void {
|
||||||
|
|||||||
@ -5363,7 +5363,7 @@ interface PackageCardProps {
|
|||||||
selectedIds: Set<string>;
|
selectedIds: Set<string>;
|
||||||
columnOrder: string[];
|
columnOrder: string[];
|
||||||
gridTemplate: string;
|
gridTemplate: string;
|
||||||
onSelect: (id: string, ctrlKey: boolean, shiftKey: boolean) => void;
|
onSelect: (id: string, ctrlKey: boolean) => void;
|
||||||
onSelectMouseDown: (id: string, e: React.MouseEvent) => void;
|
onSelectMouseDown: (id: string, e: React.MouseEvent) => void;
|
||||||
onSelectMouseEnter: (id: string) => void;
|
onSelectMouseEnter: (id: string) => void;
|
||||||
onStartEdit: (packageId: string, packageName: string) => void;
|
onStartEdit: (packageId: string, packageName: string) => void;
|
||||||
@ -5422,7 +5422,7 @@ const PackageCard = memo(function PackageCard({ pkg, items, packageSpeed, isFirs
|
|||||||
className={`package-card queue-package-card${pkg.enabled ? "" : " disabled-pkg"}${selectedIds.has(pkg.id) ? " pkg-selected" : ""}`}
|
className={`package-card queue-package-card${pkg.enabled ? "" : " disabled-pkg"}${selectedIds.has(pkg.id) ? " pkg-selected" : ""}`}
|
||||||
draggable
|
draggable
|
||||||
onContextMenu={(e) => { e.preventDefault(); e.stopPropagation(); onContextMenu(pkg.id, undefined, e.clientX, e.clientY); }}
|
onContextMenu={(e) => { e.preventDefault(); e.stopPropagation(); onContextMenu(pkg.id, undefined, e.clientX, e.clientY); }}
|
||||||
onClick={(e) => { if (e.ctrlKey || e.shiftKey) onSelect(pkg.id, e.ctrlKey, e.shiftKey); }}
|
onClick={(e) => { if (e.ctrlKey) onSelect(pkg.id, true); }}
|
||||||
onMouseDown={(e) => onSelectMouseDown(pkg.id, e)}
|
onMouseDown={(e) => onSelectMouseDown(pkg.id, e)}
|
||||||
onMouseEnter={() => onSelectMouseEnter(pkg.id)}
|
onMouseEnter={() => onSelectMouseEnter(pkg.id)}
|
||||||
onDragStart={(event) => { event.stopPropagation(); onDragStart(pkg.id); }}
|
onDragStart={(event) => { event.stopPropagation(); onDragStart(pkg.id); }}
|
||||||
@ -5504,7 +5504,7 @@ const PackageCard = memo(function PackageCard({ pkg, items, packageSpeed, isFirs
|
|||||||
{useExtractSplit && <div className="progress-ex" style={{ width: `${exProgress}%` }} />}
|
{useExtractSplit && <div className="progress-ex" style={{ width: `${exProgress}%` }} />}
|
||||||
</div>
|
</div>
|
||||||
{!collapsed && items.filter((item) => !hideExtractedItems || !item.fullStatus?.startsWith("Entpackt")).map((item) => (
|
{!collapsed && items.filter((item) => !hideExtractedItems || !item.fullStatus?.startsWith("Entpackt")).map((item) => (
|
||||||
<div key={item.id} className={`item-row${selectedIds.has(item.id) ? " item-selected" : ""}`} style={{ gridTemplateColumns: gridTemplate }} onClick={(e) => { e.stopPropagation(); onSelect(item.id, e.ctrlKey, e.shiftKey); }} onMouseDown={(e) => { e.stopPropagation(); onSelectMouseDown(item.id, e); }} onMouseEnter={() => onSelectMouseEnter(item.id)} onContextMenu={(e) => { e.preventDefault(); e.stopPropagation(); onContextMenu(pkg.id, item.id, e.clientX, e.clientY); }}>
|
<div key={item.id} className={`item-row${selectedIds.has(item.id) ? " item-selected" : ""}`} style={{ gridTemplateColumns: gridTemplate }} onClick={(e) => { e.stopPropagation(); onSelect(item.id, e.ctrlKey); }} onMouseDown={(e) => { e.stopPropagation(); onSelectMouseDown(item.id, e); }} onMouseEnter={() => onSelectMouseEnter(item.id)} onContextMenu={(e) => { e.preventDefault(); e.stopPropagation(); onContextMenu(pkg.id, item.id, e.clientX, e.clientY); }}>
|
||||||
{columnOrder.map((col) => {
|
{columnOrder.map((col) => {
|
||||||
switch (col) {
|
switch (col) {
|
||||||
case "name": return (
|
case "name": return (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user