Items with transient status texts like Provider-Cooldown, Warte auf
Daten, Verbindungsfehler are reset to "Wartet" when the app restarts,
so they don't show misleading status from a previous session.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Debounce: simultaneous failures within 2s count as 1 failure
(prevents 8 parallel unrestrict failures from instant-triggering)
- Raise threshold from 8 to 20 consecutive failures before cooldown
- Escalation tiers: 20→30s, 35→60s, 50→120s, 80+→300s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pause now aborts active extractions (previously extraction continued
during pause, showing wrong status like Provider-Cooldown)
- Unpause clears provider circuit breaker for fresh start
- Post-processing status checks account for global pause state
- Reduce stall detection timeout from 30s to 15s for faster retry
- Reduce stall retry base delay from 500ms to 300ms
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add pause check at top of processItem retry loop so items show
"Pausiert" instead of "Provider-Cooldown" when paused
- Lower extraction process priority from BELOW_NORMAL to IDLE
(IDLE_PRIORITY_CLASS on Windows also lowers I/O priority, reducing
disk contention between extraction and active downloads)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make saveSettings async to stop blocking the event loop during downloads
- Add 120ms minimum gap for forced state emissions to prevent rapid-fire IPC
- Fix circuit breaker feedback loop: reset failure count after cooldown expires
- Add 120s time-decay for failure counter (transient bursts don't snowball)
- Raise circuit breaker threshold from 5 to 8 consecutive failures
- Stop counting network stalls as provider failures
- Items without a provider only check primary provider cooldown, not all
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New "Jetzt entpacken" right-click option: triggers extraction for
completed packages regardless of paused/stopped state
- Fix 5-10s freeze when pressing Start after Pause: recoverRetryableItems
was calling fs.stat on every item (474+); now only checks failed/completed
- Full IPC pipeline: extractNow in manager, controller, preload, renderer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WinRAR doesn't support \?\ prefix (interprets it as UNC network path).
Replace with subst drive mapping: maps targetDir to a short drive letter
(Z:, Y:, etc.) before extraction, then removes mapping after. This keeps
total paths under 260 chars even when archives contain deep internal
directory structures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add longPathForWindows() helper that prefixes extract target directories
with \?\ on Windows, bypassing the 260-char MAX_PATH limit. Applied to
both WinRAR/UnRAR and 7z arguments. Fixes "Die Syntax für den
Dateinamen, Verzeichnisnamen" errors when archive internal directories
create deeply nested output paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- triggerPendingExtractions() now runs when unpausing, so packages
with extraction errors are automatically retried
- executeDeleteSelection no longer depends on snapshot objects
(prevents unnecessary re-renders with large queues)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Session counter now uses sessionDownloadedBytes (in-memory counter)
instead of summing completed items. Removing packages after extraction
no longer resets the session total.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Save settings every 30s during active downloads (not just session)
- Force settings save on shutdown and run finish
- Preserve live totalDownloadedAllTime when user saves settings
(app-controller's stale copy no longer overwrites the counter)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pause button is now one-way (orange glow when paused, disabled when
already paused). Start button resumes from pause.
- Fix hybrid extraction attempting incomplete multi-part archives when
paused: disk-fallback now blocks any non-terminal item status, not
just downloading/validating/integrity_check.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Dynamic left padding based on measured label width (no more cut-off numbers)
- Speed history ref lifted to App so chart data survives tab switches
- Pause button uses optimistic UI update for instant visual feedback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track totalDownloadedAllTime in settings (persists across restarts)
- Track sessionDownloadedBytes for current app session
- Status bar shows both: Session + Gesamt
- Statistics section shows Heruntergeladen (Session) + (Gesamt)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Bandwidth chart drawChart effect now runs on every re-render instead
of only when running/paused changes (chart was stuck showing empty)
- Pause button no longer wrapped in performQuickAction/actionBusy guard,
so it works immediately even during ongoing operations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track packageId in speed events so package speed uses same 3-second
window as global speed (fixes mismatch between package and status bar)
- Add packageSpeedBps to UiSnapshot, computed from speed events
- Context menu delete actions now respect confirmDeleteSelection setting
- Progress bar visible even when package is collapsed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Ctrl+Click: mousedown no longer immediately adds item, preventing
onClick from toggling it back off. Drag-select still works via mouseenter.
- Delete key removes selected items/packages with JDownloader-style
confirmation dialog showing count and remaining items.
- "Nicht mehr anzeigen" checkbox disables future confirmations.
- New setting "Vor dem Löschen bestätigen" under Allgemein.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dead link detection:
- Mega-Web: parse hoster error messages (hosterNotAvailable, etc.) from HTML
and throw specific error instead of returning null
- MegaDebridClient: stop retrying on permanent hoster errors
- download-manager: isPermanentLinkError() immediately fails items with dead
links instead of retrying forever
Extraction race condition:
- package_done cleanup policy checked if all items were "completed" (downloaded)
but not if they were "extracted" — removing the package before the last
episode could be extracted
- Both applyCompletedCleanupPolicy and applyPackageDoneCleanup now guard
against premature removal when autoExtract is enabled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- HTTP 200 on resume: detect server ignoring Range header, write in truncate mode
instead of appending (prevents doubled/corrupted files)
- HTTP 416 without Content-Range: assume complete if >1MB exists instead of
deleting potentially multi-GB finished files
- Stream handle leak: explicit destroy() after finally to prevent fd exhaustion
- Drain timeout: don't abort controller on disk backpressure, let inner retry
loop handle it instead of escalating to full stall pipeline
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Provider circuit breaker: track consecutive failures per provider with
escalating cooldowns (30s/60s/120s/300s), auto-invalidate Mega-Debrid
session on cooldown
- Escalating backoff: retry delays now scale up to 120s (was 30s max),
unrestrict backoff exponential instead of linear 15s cap
- Shelve logic: after 15 consecutive failures, item pauses 5 min with
counter halving for gradual recovery
- Periodic soft-reset: every 10 min, reset stale retry counters (>10 min
queued) and old provider failures (>15 min), acts like mini-restart
- Mega-Debrid queue timeout: 90s wait limit in runExclusive to prevent
cascade blocking behind stuck calls
- Provider-cooldown-aware retry delays: items wait for provider cooldown
instead of retrying against broken service
- Fix: reconnect/package_toggle now persist retry counters (previously
lost on interruption, defeating shelve logic)
- Mega-Debrid generate: tighter timeouts, progressive reload backoff,
hoster retry limit (5x max)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Left half (blue) shows download progress, right half (green) shows
extraction progress. When no extraction is active, full bar is blue.
Full bar = 50% blue (all downloaded) + 50% green (all extracted).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Active packages are now sorted by completed item count (descending),
then by downloaded bytes, so packages with real download progress
appear above packages still in link resolution phase.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Packages with items in downloading/validating/extracting/integrity_check
state are always shown at the top regardless of sort order (A-Z or Z-A).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show current aggregate speed (all active downloads) in the stats bar
next to Pakete/Dateien/Gesamt. Only visible while session is running.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Some hosters return tiny error responses (e.g. 9 bytes) with HTTP 200.
- downloadToFile: detect files <512 B, log content, delete and throw for retry
- Post-download: catch <512 B files even when totalBytes is unknown
- Logs the error-page content for debugging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix .z001/.z002 split zip volumes not deleted after extraction
(regex matched only 2-digit, now matches 2-3 digit volumes)
- Make extract progress file writes atomic (write to .tmp then rename)
to prevent corruption on crash during extraction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep existing good filename when debrid API returns "download.bin"
or opaque name. Only overwrite item.fileName if the resolved name
is actually better (not opaque, not download.bin).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>