- WRONG_PASSWORD JVM error now falls back to legacy UnRAR extractor
- Added masked password logging for JVM and legacy extractors
- Per-attempt password logging shows which passwords are tried and in what order
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
maxParallelExtract now controls how many archives extract simultaneously
within a single package (e.g. 4 episodes at once). Packages still
extract sequentially (one package at a time) to focus I/O. Progress
handler updated to track multiple active archives independently.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When SevenZipJBinding reports "Archive file can't be opened with any
of the registered codecs", the extractor now falls back to legacy
UnRAR instead of failing immediately. Previously, backend mode "jvm"
(the production default) only allowed fallback for UNSUPPORTEDMETHOD.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each JVM extractor process now gets its own temp directory via
-Djava.io.tmpdir so parallel SevenZipJBinding instances don't fight
over the same lib7-Zip-JBinding.dll file lock on Windows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restore all source files from v1.5.49 (proven stable on both servers)
- Add startPackages() IPC method that starts only specified packages
- Fix context menu "Ausgewählte Downloads starten" to use startPackages()
instead of start() which was starting ALL enabled packages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add automatic retry with 3s delay when JVM extractor fails with
"codecs" or "can't be opened" error during hybrid-extract mode
(handles transient Windows file locks after download completion)
- Log archive file size before JVM extraction in hybrid mode
- Remove unused ArchiveFormat import, RAR_MULTIPART_RE/RAR_OLDSPLIT_RE
patterns, and hasOldStyleRarSplits() method from Java extractor
- Keep simple openSevenZipArchive with currentVolumeName tracking
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Account Manager: table UI with add/remove/check for all 4 providers
(Real-Debrid, Mega-Debrid, BestDebrid, AllDebrid)
- Backend: checkRealDebridAccount, checkAllDebridAccount, checkBestDebridAccount
- Hybrid-Extract fix: check item.fileName for queued items without targetPath,
disable disk-fallback for multi-part archives, extend disk-fallback to catch
active downloads by fileName match (prevents CRC errors on incomplete files)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root cause: SevenZip.initSevenZipFromPlatformJAR() was never called, so
native compression codecs (RAR5, LZMA2, etc.) were not loaded. Archives
could be opened (header parsing is pure Java) but all extractSlow() calls
returned UNSUPPORTEDMETHOD because no native decoder was available.
- Add ensureSevenZipInitialized() with lazy init before extraction
- Pass password to extractSlow(outStream, password) for RAR5 compatibility
- Add UNSUPPORTEDMETHOD -> legacy fallback in extractor.ts as safety net
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Java's getCanonicalFile() resolves subst drives inconsistently,
causing secureResolve() to falsely block valid filenames. JVM handles
long paths natively so subst is only needed for legacy UnRAR/7z.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The JVM sidecar class files were packed inside app.asar where Java
cannot access them. asarUnpack extracts them to app.asar.unpacked/.
Default backend changed from auto to jvm (no legacy fallback).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New JVM sidecar (resources/extractor-jvm/) using SevenZipJBinding for
RAR/7z/TAR and Zip4j for ZIP multipart, matching JDownloader 2 stack
- Auto/JVM/Legacy backend modes via RD_EXTRACT_BACKEND env variable
- Fallback to legacy UnRAR/7z when JVM runtime unavailable
- Fix isJvmRuntimeMissingError false positives on valid extraction errors
- Cache JVM layout resolution to avoid repeated filesystem checks
- Route nested ZIP extraction through JVM backend consistently
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- setWindowsBackgroundIO (Very Low I/O) now only applied in hybrid mode,
not for all extractions (was causing massive slowdown)
- Hybrid threads changed from -mt1 to half CPU count (e.g. -mt4 on 8-core)
- Move retry count (R9, R22 etc.) from status text to tooltip only
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add disk space check before extraction (aborts if insufficient space)
- Add single-level nested archive extraction (archives inside archives)
- Blacklist .iso/.img/.bin/.dmg from nested extraction
- Set real Windows I/O priority (Very Low) on UnRAR via NtSetInformationProcess
- Reduce UnRAR threads to -mt1 during hybrid extraction
- Fix double episode renaming (s01e01e02 pattern)
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>
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>
- 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>
- Convert all sync FS ops (existsSync, readdirSync, statSync, writeFileSync,
rmSync, renameSync) to async equivalents across download-manager, extractor,
cleanup, storage, and logger to prevent UI freezes
- Replace linear retry delays with exponential backoff + jitter to prevent
retry storms with many parallel downloads
- Deduplicate resolveArchiveItems into single shared function
- Replace Array.shift() O(N) in bandwidth chart with slice-based trimming
- Make logger rotation async in the async flush path
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Don't clear extraction resume state during hybrid mode (skipPostCleanup)
- Mark ALL completed items as "Entpackt" after successful hybrid extraction
to prevent full extraction from re-extracting already-extracted archives
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AllDebrid: add HTML response detection to unrestrictLink
- Cleanup: skip symlinks/junctions in all directory traversals
- Blob URL: increase revoke delay from 0ms to 60s
- Extractor: per-package progress file to prevent collision
- ADD_CONTAINERS: reject path traversal and relative paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements hybrid extraction: when a package has multiple episodes with
multi-part archives, completed archive sets are extracted immediately
while the rest of the package continues downloading. Uses the existing
hybridExtract setting (already in UI/types/storage).
Key changes:
- Export findArchiveCandidates/pathSetKey from extractor.ts
- Add onlyArchives/skipPostCleanup options to ExtractOptions
- Add findReadyArchiveSets to identify complete archive sets
- Add runHybridExtraction for incremental extraction passes
- Requeue logic in runPackagePostProcessing for new completions
- Resume state preserved across hybrid passes (no premature clear)
- Guard against extracting incomplete multi-part archives
- Correct abort/toggle handling during hybrid extraction
- Package toggle now also aborts active post-processing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add multi-threaded extraction via WinRAR -mt flag (uses all CPU cores)
- Fix -idq flag suppressing progress output, replaced with -idc
- Fix extraction timeout for multi-part archives (now calculates total size across all parts)
- Raise extraction timeout cap from 40min to 2h for large archives (40GB+)
- Add natural episode sorting (E1, E2, E10 instead of E1, E10, E2)
- Add split archive support (.zip.001, .7z.001) with proper cleanup
- Add write-stream drain timeout to prevent download freezes on backpressure
- Fix regex global-state bug in progress percentage parsing
- Optimize speed event pruning (every 1.5s instead of every chunk)
- Add performance flag fallback for older WinRAR versions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix extraction status display after restart (shows "Entpacken ausstehend" instead of stale status)
- Fix Start button to trigger pending extractions for already-downloaded packages
- Fix extraction resume when archives already cleaned (recognizes completed state from resume file)
- Reduce update download connection timeout from 8min to 30s per candidate for faster fallback
- Add logging for update download candidates and failures
- Show manual download URL on update failure
- Sequential extraction preserved (one package at a time via queue)
- Extraction properly cancelled on shutdown, resumes on restart
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>