- Replace extractSlow() per-item extraction with IInArchive.extract() bulk API
in 7-Zip-JBinding. Solid RAR archives no longer re-decode from the beginning
for each item, bringing extraction speed close to native WinRAR/7z.exe (~375 MB/s
instead of ~43 MB/s).
- Add BulkExtractCallback implementing both IArchiveExtractCallback and
ICryptoGetTextPassword for proper password handling during bulk extraction.
- Fix resolveArchiveItemsFromList with multi-level fallback matching:
1. Pattern match (multipart RAR, split ZIP/7z, generic splits)
2. Exact filename match (case-insensitive)
3. Stem-based fuzzy match (handles debrid service filename modifications)
4. Single-item archive fallback
- Simplify caching from Set+Array workaround back to simple Map<string, T>
(the original "caching failure" was caused by resolveArchiveItemsFromList
returning empty arrays, not by Map/Set/Object data structure bugs).
- Add comprehensive tests for archive item resolution (14 test cases)
and JVM extraction progress callbacks (2 test cases).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- JVM extractor now supports --daemon mode: starts once, processes
multiple archives via stdin JSON protocol, eliminating ~5s JVM boot
per archive
- TypeScript side: daemon manager starts JVM once, sends requests via
stdin, falls back to spawning new process if daemon is busy
- Fix extraction progress caching: replaced Object.create(null) + in
operator with Set<string> + linear Array scan — both Map.has() and
the in operator mysteriously failed to find keys that were just set
- Daemon auto-shutdown on app quit via shutdownDaemon() in before-quit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- Log when packages are added (count + names)
- Log when individual item downloads start (filename, size, provider)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- Force immediate emitState when first resolving archive items so UI
transitions from 'Ausstehend' to 'Entpacken X%' instantly
- Use BELOW_NORMAL priority (instead of IDLE) for final extraction
when all downloads are complete — matches manual extraction speed
- Add diagnostic logging for resolveArchiveItems matching
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "Download fertig: filename (size), pkg=name" log line when an item
finishes downloading, enabling precise timing analysis of when archive
parts become available for extraction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Run collectMkvFilesToLibrary in background after each hybrid extraction
round so MKVs are moved to the library as episodes are extracted, not
only after the entire package finishes
- Add timing logs to identify bottlenecks:
- Post-process slot wait time
- Per-round duration with requeue status
- Recovery loop duration
- Setup time in handlePackagePostProcessing
- findReadyArchiveSets duration when > 200ms
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After a hybrid extraction round completes, set the requeue flag so the
do-while loop immediately checks for more ready archive sets. Previously,
if all items completed before the task started processing, the single
requeue flag was consumed and no new completions triggered re-extraction,
causing 25+ second gaps until the next download completion.
Also change runHybridExtraction return type from void to number
(extracted count) to enable conditional self-requeue only when archives
were actually extracted, preventing infinite requeue loops.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
DDownload was missing from provider validation sets, preventing users
from configuring it as primary or fallback provider in settings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use PackagePriority type instead of string/any in preload and app-controller
- Add .catch() to start(), extractNow(), setPackagePriority(), updateSettings(columnOrder), openLog(), openSessionLog()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
After an archive finishes at 100%, show "Naechstes Archiv..." label
while the next archive initializes, eliminating the "dead" gap where
no activity was visible between consecutive extractions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
Update postProcessLabel during extraction with detailed progress:
- Overall percentage and archive count (e.g. "Entpacken 45% (3/6)")
- Password cracking progress when testing passwords
- Works for both hybrid and full extraction modes
Previously the label was static "Entpacken..." with no detail about
what was happening during potentially long extraction phases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DDownload's storage servers (dstorage.org) use certificates that fail
Node.js TLS verification. Add skipTlsVerify flag to UnrestrictedLink
and temporarily disable TLS verification for the download fetch when
the flag is set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DDownload is a direct file hoster, not a debrid service. DDownload URLs
are now automatically handled by the DDownload provider when configured,
before trying any debrid providers. Remove DDownload from the
primary/secondary/tertiary provider dropdowns since it only handles its
own URLs and doesn't belong in the debrid fallback chain.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DDownload (ddownload.com/ddl.to) as new hoster with web login
- Post-processing labels: Entpacken/Renaming/Aufräumen/MKVs
- Release notes shown in update confirmation dialog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When hybrid extraction finds no ready archive sets (because remaining parts
are still downloading), completed items were incorrectly labeled as
"Entpacken - Ausstehend" instead of "Entpacken - Warten auf Parts".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Migrate deprecated updateRepo value (Sucukdeluxe/) to new default (Administrator/)
- Mask sensitive fields (tokens, passwords) in backup export with ***
- Preserve current credentials when importing backup with masked values
- Remove 22 obsolete release_v*.mjs scripts, release_codeberg.mjs, set_version_node.mjs
- Remove release:codeberg script from package.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>