Commit Graph

76 Commits

Author SHA1 Message Date
Sucukdeluxe
30d216c7ca Fix extraction progress caching and JVM tuning
- Replace Map-based archive item cache with plain Object.create(null)
  to work around mysterious Map.has() returning false despite set()
  being called with the same key — this caused resolveArchiveItems
  to run on every 1.1s pulse instead of being cached, preventing
  extraction progress (Entpacken X%) from ever showing in the UI
- Apply same fix to both hybrid and full extraction paths
- Increase JVM heap from 512MB to 1GB for better extraction throughput
- Use SerialGC for faster JVM startup on short-lived extract processes
- Add download lifecycle logging (package add + item download start)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 05:42:23 +01:00
Sucukdeluxe
1cda391dfe Fix extraction speed and UI label updates
- Change OS priority from IDLE/BELOW_NORMAL to NORMAL/BELOW_NORMAL so
  extraction runs at full speed (matching manual 7-Zip/WinRAR performance)
- Use "high" priority in both hybrid and full extraction paths
- Increase hybrid extraction threads from hardcoded 2 to dynamic
  calculation (half CPU count, min 2, max 8)
- Fix emitState forced emit being silently dropped when a non-forced
  timer was already pending — forced emits now always replace pending
  timers to ensure immediate UI feedback during extraction transitions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 05:28:42 +01:00
Sucukdeluxe
95cf4fbed8 Eliminate 10-15s pause between package extractions
Release post-process slot immediately after main extraction completes.
All slow post-extraction work (nested extraction, auto-rename, archive
cleanup, link/sample removal, empty directory cleanup, MKV collection)
now runs in background via runDeferredPostExtraction so the next package
can start unpacking without delay.

- Export hasAnyFilesRecursive, removeEmptyDirectoryTree, cleanupArchives
  from extractor.ts for use in deferred handler
- Import removeDownloadLinkArtifacts, removeSampleArtifacts from cleanup
- Expand runDeferredPostExtraction with full post-cleanup pipeline:
  nested extraction, rename, archive cleanup, link/sample removal,
  empty dir tree removal, resume state clearing, MKV collection

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 04:22:20 +01:00
Sucukdeluxe
a1c8f42435 Comprehensive bugfix release v1.6.45
Fix ~70 issues across the entire codebase including security fixes,
error handling improvements, test stabilization, and code quality.

- Fix TLS race condition with reference-counted acquire/release
- Bind debug server to 127.0.0.1 instead of 0.0.0.0
- Add overall timeout to MegaWebFallback
- Stream update installer to disk instead of RAM buffering
- Add path traversal protection in JVM extractor
- Cache DdownloadClient with credential-based invalidation
- Add .catch() to all fire-and-forget IPC calls
- Wrap app startup, clipboard, session-log in try/catch
- Add timeouts to container.ts fetch calls
- Fix variable shadowing, tsconfig path, line endings
- Stabilize tests with proper cleanup and timing tolerance
- Fix installer privileges, scripts, and afterPack null checks
- Delete obsolete _upload_release.mjs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 03:53:28 +01:00
Sucukdeluxe
2a528a126c Add detailed preparation labels and dash separator for post-process status
- Show "Entpacken vorbereiten..." while scanning archives and checking disk space
- Show "Archive scannen..." and "Speicherplatz prüfen..." phases from extractor
- Use dash separator in UI: "[10/10 - Done] - Entpacken 45% (3/6)"
- Handle new "preparing" phase in both hybrid and full extraction progress handlers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 02:57:23 +01:00
Sucukdeluxe
74920e2e2f Round 8 bug fixes (20 fixes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:14:03 +01:00
Sucukdeluxe
75775f2798 Round 7 bug fixes (13 fixes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:59:42 +01:00
Sucukdeluxe
0ca359e509 Round 6 bug fixes (pre-release)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:23:34 +01:00
Sucukdeluxe
1d0ee31001 Release v1.6.29
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 21:11:32 +01:00
Sucukdeluxe
20a0a59670 Release v1.6.28
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:54:49 +01:00
Sucukdeluxe
9a00304a93 Release v1.6.27
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:34:50 +01:00
Sucukdeluxe
55b00bf884 Release v1.6.26
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:18:47 +01:00
Sucukdeluxe
e85f12977f Fix extractedArchives.push -> .add (Set, not Array)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:03:40 +01:00
Sucukdeluxe
940346e2f4 Release v1.6.25
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 20:01:01 +01:00
Sucukdeluxe
26b2ef0abb Release v1.6.23
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 19:26:01 +01:00
Sucukdeluxe
1ed13f7f88 Release v1.6.21
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 18:57:18 +01:00
Sucukdeluxe
729aa30253 Release v1.6.20
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 18:09:13 +01:00
Sucukdeluxe
10bae4f98b Release v1.6.17
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 17:04:32 +01:00
Sucukdeluxe
86a358d568 Release v1.6.9
Fix extraction resume state / progress sync, abort labels, and hybrid pkg.status

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 14:43:31 +01:00
Sucukdeluxe
7446e07a8c Release v1.6.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 09:54:37 +01:00
Sucukdeluxe
1d4a13466f Release v1.6.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 05:41:40 +01:00
Sucukdeluxe
00fae5cadd Release v1.5.95
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 04:08:29 +01:00
Sucukdeluxe
7af9d67770 Release v1.5.87
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 02:38:05 +01:00
Sucukdeluxe
d63afcce89 Release v1.5.86
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 00:58:30 +01:00
Sucukdeluxe
0c058fa162 Release v1.5.75
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 22:28:40 +01:00
Sucukdeluxe
af6eea8253 Release v1.5.73
- Show full passwords (unmasked) in extraction logs for easier debugging

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 21:55:36 +01:00
Sucukdeluxe
7029271999 Release v1.5.72
- 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>
2026-03-03 21:50:35 +01:00
Sucukdeluxe
5dabee332e Parallel archive extraction within packages
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>
2026-03-03 21:43:34 +01:00
Sucukdeluxe
6ee98328fb Fix JVM extractor not falling back to legacy UnRAR on codec errors
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>
2026-03-03 21:28:47 +01:00
Sucukdeluxe
3dbb94d298 Release v1.5.68: Extractor optimizations inspired by JDownloader
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 21:25:02 +01:00
Sucukdeluxe
1d876f8ded Fix parallel JVM extraction: isolate temp dirs to prevent native DLL lock conflicts
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>
2026-03-03 20:23:57 +01:00
Sucukdeluxe
2ef3983049 Revert to v1.5.49 base + fix "Ausgewählte Downloads starten"
- 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>
2026-03-03 17:53:39 +01:00
Sucukdeluxe
353cef7dbd Add JVM hybrid-extract retry and clean up Java extractor
- 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>
2026-03-03 16:35:43 +01:00
Sucukdeluxe
0b7c658c8f Add Account Manager + fix Hybrid-Extract premature extraction
- 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>
2026-03-03 14:36:13 +01:00
Sucukdeluxe
fa30e738d9 Fix UNSUPPORTEDMETHOD: init SevenZipJBinding native libs, pass password to extractSlow
Some checks are pending
Build and Release / build (push) Waiting to run
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>
2026-03-03 02:35:19 +01:00
Sucukdeluxe
eefb536cb3 Fix path traversal false positive: skip subst drive mapping for JVM backend
Some checks are pending
Build and Release / build (push) Waiting to run
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>
2026-03-03 02:25:10 +01:00
Sucukdeluxe
02b136dac7 Fix JVM extractor: asarUnpack for class/jar files, add unpacked path candidate, default to jvm mode
Some checks are pending
Build and Release / build (push) Waiting to run
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>
2026-03-03 02:19:26 +01:00
Sucukdeluxe
b712282f62 Log which extraction backend was used (7zjbinding/zip4j/legacy)
Some checks are pending
Build and Release / build (push) Waiting to run
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 02:12:48 +01:00
Sucukdeluxe
de369f3bcd Replace extraction backend with SevenZipJBinding + Zip4j JVM sidecar
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-03 02:08:42 +01:00
Sucukdeluxe
3ee3af03cf Match JDownloader 2 extraction behavior: normal I/O, -mt2 hybrid
Some checks are pending
Build and Release / build (push) Waiting to run
- Remove setWindowsBackgroundIO entirely (JD2 uses normal I/O priority)
- Keep only CPU priority IDLE (os.setPriority)
- Hybrid threads fixed at -mt2 (matches JD2's ~16 MB/s controlled throughput)
- Final extraction uses full thread count (unchanged)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:14:47 +01:00
Sucukdeluxe
9a646d516b Fix extraction speed: I/O priority only in hybrid mode, more threads
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-03 01:08:40 +01:00
Sucukdeluxe
375b9885ee Disk space pre-check, nested extraction, lower I/O priority for hybrid extraction
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-03 00:54:10 +01:00
Sucukdeluxe
55e5b0079a Fix pause showing Provider-Cooldown, lower extraction I/O priority
- 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>
2026-03-02 21:06:00 +01:00
Sucukdeluxe
e013c63c59 Fix long path extraction using subst drive mapping instead of \?\ prefix
Some checks are pending
Build and Release / build (push) Waiting to run
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>
2026-03-02 20:32:23 +01:00
Sucukdeluxe
2ae22f942e Fix extraction failure on long paths (>260 chars) with \?\ prefix
Some checks are pending
Build and Release / build (push) Waiting to run
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>
2026-03-02 20:24:55 +01:00
Sucukdeluxe
a22a90adf3 Add retry extraction context menu, increase error text limit
- 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>
2026-03-02 20:15:00 +01:00
Sucukdeluxe
14d5a3abb4 Fix zip volume cleanup regex and atomic progress file writes
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-02 10:51:49 +01:00
Sucukdeluxe
e485cf734b Async FS optimizations, exponential backoff, cleanup dedup and release v1.4.72
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-01 21:53:07 +01:00
Sucukdeluxe
520ef91d2d Fix duplicate extraction and release v1.4.71
Some checks are pending
Build and Release / build (push) Waiting to run
- 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>
2026-03-01 21:09:53 +01:00
Sucukdeluxe
282c1ebf1d Reduce extract lag and improve long-path auto-rename stability 2026-03-01 03:47:18 +01:00