-
v1.6.39 Stable
released this
2026-03-05 02:37:18 +01:00 | 629 commits to main since this releaseFixes
- Strip markdown from update changelog dialog: The confirm dialog is plain text and cannot render markdown. Headings (
##), bold (**), italic (*), and code backticks are now stripped so the changelog displays cleanly.
Downloads
- Strip markdown from update changelog dialog: The confirm dialog is plain text and cannot render markdown. Headings (
-
v1.6.38 Stable
released this
2026-03-05 02:32:59 +01:00 | 630 commits to main since this releaseFixes
- Fix DDownload downloads failing with connection errors: DDownload storage servers (dstorage.org) use SSL certificates that fail Node.js TLS verification, causing all downloads to fail with "Verbindungsfehler". Added
skipTlsVerifyflag so TLS certificate verification is temporarily disabled only for DDownload download connections.
Downloads
- Fix DDownload downloads failing with connection errors: DDownload storage servers (dstorage.org) use SSL certificates that fail Node.js TLS verification, causing all downloads to fail with "Verbindungsfehler". Added
-
v1.6.37 Stable
released this
2026-03-05 02:25:34 +01:00 | 631 commits to main since this releaseFixes
- DDownload auto-routing: DDownload URLs (ddownload.com / ddl.to) are now automatically routed to the DDownload provider before trying any debrid services. Previously, debrid providers like Mega-Debrid would attempt (and fail) to handle these URLs first.
- Remove DDownload from provider dropdowns: DDownload is a direct file hoster, not a debrid service. It no longer appears in the primary/secondary/tertiary provider selection since it only handles its own URLs and is used automatically when configured.
- Fix blank screen on upgrade (from v1.6.36): Guard against undefined
ddownloadLogin/ddownloadPasswordin renderer when upgrading from versions without DDownload support.
Downloads
-
v1.6.36 Stable
released this
2026-03-05 02:17:41 +01:00 | 632 commits to main since this releaseBug Fix
- Fix blank screen crash when upgrading from a version without DDownload support
- Guard against undefined
ddownloadLogin/ddownloadPasswordin the renderer when persisted settings lack the new fields - Applies
|| ""fallback inconfiguredProvidersuseMemo and input value bindings
- Guard against undefined
Downloads
- Fix blank screen crash when upgrading from a version without DDownload support
-
v1.6.35 Stable
released this
2026-03-05 02:07:52 +01:00 | 633 commits to main since this releaseNew Features
DDownload Provider
- Added DDownload (ddownload.com / ddl.to) as a new file hoster provider
- Uses web login with email/password authentication (same approach as JDownloader)
- Premium download support via XFS (XFileSharing) web flow
- Automatic session management with cookie-based authentication
- Supports both ddownload.com and ddl.to URL formats
- Integrates into the existing provider fallback chain (primary/secondary/tertiary)
- Available in the Accounts tab alongside existing providers
Post-Processing Status Labels
- Package status now shows detailed labels during post-processing phases
- Displays "Entpacken..." during extraction
- Displays "Renaming..." during auto-rename operations
- Displays "Aufr�umen..." during archive cleanup
- Displays "Verschiebe MKVs..." during MKV library collection
- Labels appear after the [done/total] counter for clear progress indication
- Labels are transient and automatically cleared on app restart
Changelog in Update Dialog
- Update confirmation dialog now shows release notes when available
- Changelog is displayed between version info and the install prompt
- Long changelogs are truncated to 500 characters for readability
- Release notes are fetched from the Gitea API release body field
Downloads
-
v1.6.34 Stable
released this
2026-03-05 01:38:51 +01:00 | 635 commits to main since this releasev1.6.34
Bug Fix
- Fixed hybrid extraction status label: Completed items that are part of incomplete multi-part archives now correctly show "Entpacken - Warten auf Parts" instead of "Entpacken - Ausstehend" when other parts are still downloading. Previously, when hybrid extraction found no ready archive sets, items kept the misleading "Ausstehend" label from download completion.
Downloads
-
v1.6.33 Stable
released this
2026-03-05 01:24:26 +01:00 | 636 commits to main since this releasev1.6.33
Test release to verify auto-updater migration from v1.6.32.
Downloads
-
v1.6.32 Stable
released this
2026-03-05 01:21:40 +01:00 | 637 commits to main since this releasev1.6.32
Bug Fixes
- Fixed auto-updater "GetUserByName" error: Users upgrading from older versions had the deprecated
Sucukdeluxe/real-debrid-downloaderrepo stored in settings. The updater now auto-migrates known deprecated repo values to the correctAdministrator/real-debrid-downloaderdefault on settings load.
Security
- Backup export now masks sensitive credentials: The JSON backup export (
exportBackup) now replaces API tokens (token,bestToken,allDebridToken) and the Mega-Debrid password (megaPassword) with***<last 4 chars>instead of writing them in plain text. On import, masked values are detected and the current saved credentials are preserved.
Cleanup
- Removed 22 obsolete per-version release scripts (
release_v1597.mjsthroughrelease_v1630.mjs) - Removed legacy
release_codeberg.mjsandset_version_node.mjshelper scripts - Removed
release:codebergnpm script frompackage.json - Cleaned up ~3,100 lines of dead code from the
scripts/directory
Downloads
- Fixed auto-updater "GetUserByName" error: Users upgrading from older versions had the deprecated
-
v1.6.31 Stable
released this
2026-03-05 00:45:46 +01:00 | 639 commits to main since this releasev1.6.31 — Massive Stability & Infrastructure Update
This release consolidates 8 rounds of deep code review (108 bug fixes across the entire codebase) plus a full infrastructure migration to a self-hosted Gitea instance.
Infrastructure
- Migrated primary release and auto-update source from Codeberg to
git.24-music.de(self-hosted Gitea) - Added multi-source update fallback chain: git.24-music.de → Codeberg → GitHub
- New one-command release script:
npm run release:gitea -- <version> "<notes>" - App renamed to "Multi Debrid Downloader"
Download Engine (download-manager.ts)
- Fixed session byte tracking corruption:
resolveStartConflictoverwrite path used raw.delete()instead ofdropItemContribution(), permanently inflatingtotalDownloadedBytesand corrupting speed/ETA display - Fixed start() race condition: Set
session.running = truebefore firstawaitto prevent concurrentstart()calls from bypassing the guard - Fixed item-recovery race: Added post-await re-check of item status and active tasks to prevent overwriting an active download with "completed"
- Fixed done-phase marking failed archives as "Done": Both hybrid and final extraction done handlers now only clear tracking maps instead of blindly marking all remaining archives as completed
- Fixed extraction triggered on disabled packages at startup:
recoverPostProcessingOnStartupnow respectspkg.enabled - Fixed stream.destroy() leak: Moved
stream.destroy()into catch block before re-throwing to prevent file handle leaks on Windows - Fixed prepareForShutdown mislabeling: Pending/waiting extraction items no longer get incorrectly labeled as "abgebrochen"
- Fixed stop() missing retryStateByItem.clear(): Stale retry counters from previous runs no longer accumulate
- Fixed stop() pkg.enabled label: Items in disabled packages now show "Paket gestoppt" instead of "Wartet"
- Fixed missing retryStateByItem.clear() in empty start() path: Prevents stale retry counters from causing premature item shelving
- Fixed resolveStartConflict not resetting item.provider: Provider field no longer shows stale data after overwrite
- Fixed normalizeSessionStatuses for disabled packages: Items in disabled packages now show "Paket gestoppt" after restart instead of "Wartet"
- Fixed startPackages/startItems skipping triggerPendingExtractions: "Start Selected" on fully-downloaded-but-unextracted packages now correctly triggers extraction
- Fixed missing releaseTargetPath in tiny-file detection: Reserved target path slot is now released when a tiny error-response file is detected and deleted
- Fixed hybrid extraction abort not checking session.running: Abort path now uses
session.runningin status ternary, consistent with all other paths - Fixed timeout branch updatedAt on already-extracted items:
updatedAtis now only stamped whenfullStatusactually changes - Fixed hybrid extraction progress callback churning updatedAt: Added
entry.fullStatus !== labelguard to prevent unnecessary persistence pressure every 260ms - Fixed updatedAt set unconditionally in 3 extraction error/abort handlers: Now only set when fullStatus actually changes
- Fixed reorderPackages O(n²): Changed
valid.includes(id)toseen.has(id)for Set-based lookup - Fixed duplicate retryAfterByItem/retryStateByItem.clear() in clearAll(): Removed redundant double-clear
- Fixed indentation inconsistency in start() method
- Improved importBackup persistence protection: New
blockAllPersistenceflag blocks bothpersistSoon()and shutdown persistence to protect restored backups from being overwritten by in-flight async saves - Various extraction status label fixes, progress sorting, and status transition corrections across R1-R5
Extractor (extractor.ts)
- Fixed noextractor:skipped unhandled throw: Password-discovery serial pass now catches non-abort errors properly instead of propagating unhandled out of
extractPackageArchives - Fixed nested archive namespace collision: Added
nested:prefix to resume state keys for nested archives to prevent false resume matches with original archives - Fixed hasAnyEntries false positive on empty directories: Uses recursive file check (
hasAnyFilesRecursive) instead of directory-entry check - Fixed SevenZipJBinding "registered codecs" error: JVM extractor now falls back to legacy UnRAR instead of throwing
- Fixed parallel JVM extraction temp dir conflicts: Each JVM process gets an isolated temp directory to prevent native DLL file lock crashes
Debrid Service (debrid.ts, realdebrid.ts)
- Fixed sleepWithSignal race condition: Added
signal.abortedcheck before entering Promise constructor to prevent missed abort signals - Fixed dead ternary branch in MegaDebridClient.unrestrictLink: Simplified unreachable
web ?arm that always evaluated to false branch - Fixed HTML response detection: Properly handles cases where Real-Debrid returns HTML instead of JSON
Storage (storage.ts)
- Fixed orphaned temp files on non-EXDEV rename failure: Both
writeSettingsPayloadandwriteSessionPayloadnow clean up temp files before re-throwing rename errors
UI (App.tsx)
- Fixed progress bar overflow:
dlProgress,exProgress, andcombinedProgressare now clamped to their respective maxima (50/100) to prevent CSS overflow when progress data briefly exceeds 100% - Fixed BandwidthChart resize handler: Previous pending
requestAnimationFrameis now cancelled before scheduling a new one during resize bursts - Fixed extractHoster called twice per render: Item-row hoster column now computes the value once
- Fixed delete confirm dialog negative totalRemaining: Uses
Math.max(0, ...)to prevent display of negative item counts - Fixed dead CSS selector in Escape key handler: Removed non-existent
.link-popup-overlayclass reference - Fixed collapsedPackages missing from auto-expand useEffect deps: Auto-expand logic now correctly reacts to collapse state changes
- Deduplicated Hoster/Account column IIFE calculations: Eliminated redundant computation in package header rendering
Full list of reviewed files
Every line of the following files was reviewed across 8 rounds with 10 parallel review agents each:
src/main/download-manager.ts(7,070 lines)src/main/extractor.ts(2,332 lines)src/main/debrid.ts(1,127 lines)src/main/realdebrid.ts(202 lines)src/main/storage.ts(728 lines)src/main/app-controller.ts(366 lines)src/main/main.ts(513 lines)src/renderer/App.tsx(3,475 lines)
Downloads
- Migrated primary release and auto-update source from Codeberg to
-
v1.6.30 Stable
released this
2026-03-04 21:36:35 +01:00 | 646 commits to main since this releaseRelease v1.6.30
Downloads