MKV library collection now filters out sample files before moving.
Files in "sample"/"samples" directories and files with "sample" in
their name are excluded. This prevents duplicate "(2)" entries in
the library folder caused by samples having the same base name as
the real episodes (just different casing from the archive).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace BrowserWindow-based login flow with Netscape cookie file import
for BestDebrid authentication. Cloudflare Turnstile captcha cannot be
solved in Electron's embedded browser, so users export cookies from
their real browser and import them here.
- Rewrite bestdebrid-web.ts: remove BrowserWindow/CDP code, add
parseNetscapeCookieFile() and importCookiesFromFile()
- Add file picker dialog for .txt cookie files in main IPC handler
- Update IPC channel from OPEN_BESTDEBRID_LOGIN to IMPORT_BESTDEBRID_COOKIES
- Update preload bridge and renderer UI with cookie import button
- Fix pLabel scope in downloadToFile (pass as parameter from processItem)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The running download status (e.g. "Download läuft", "Warte auf
Festplatte") now shows the full provider label including the source
mode, e.g. "Mega-Debrid (API)" instead of just "Mega-Debrid".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When hybrid extraction handled all archives, extractedCount stayed 0
causing all cleanup steps (archive deletion, resume state, link/sample
removal, empty dir pruning, auto-rename, nested extraction) to be
bypassed. Extended conditions to also trigger on alreadyMarkedExtracted.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
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 (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>