-
v1.7.109 Stable
released this
2026-03-23 18:04:21 +01:00 | 179 commits to main since this releaseHandle SxxSxx scene typo in episode detection (e.g. s05s01 interpreted as S05E01)
-
v1.7.108 Stable
released this
2026-03-23 12:07:11 +01:00 | 181 commits to main since this releaseSkip sample files during auto-rename to prevent (2) MKV duplicates
-
v1.7.107 Stable
released this
2026-03-23 11:54:31 +01:00 | 183 commits to main since this releaseFix auto-rename race condition: files extracted during hybrid rounds are now renamed after MKV-move
-
v1.7.106 Stable
released this
2026-03-23 11:25:48 +01:00 | 185 commits to main since this releaseFix auto-rename episode range folders (S01E01-E08) producing duplicate MKV names with (2)(3)(4) suffixes
-
v1.7.105 Stable
released this
2026-03-22 16:24:38 +01:00 | 187 commits to main since this releasev1.7.105 — Bug Fixes
Fix: Auto-Rename Episode Token Pollution
Root cause of two user-reported issues:
-
Wrong episode numbers during auto-rename — Files like
hrs-irland.krimi.hdtv.7p-101.mkvwere not renamed (or renamed to the wrong episode) because the episode detection picked upS01E07from an unrelated file in the same package (4sf-...-s01e07.mkv) instead of correctly parsing the compact episode code101→S01E01. -
Duplicate MKV files with (2)(3) suffixes — When multiple files were incorrectly renamed to the same episode number (e.g., all getting
S01E07), the MKV collection step would createfilename (2).mkv,filename (3).mkvcopies because the target already existed.
Technical details: The
packageExtraCandidatesarray inautoRenameExtractedVideoFilespreviously included ALL item filenames from the package. TheresolveEpisodeTokenForAutoRenamefunction iterated these candidates looking for episode tokens, and would return the firstSxxExxmatch from ANY file — even if it belonged to a completely different episode. This polluted the episode detection for all files that relied on compact numeric codes (e.g.,101,102,103).Fix: Only the package directory name (outputDir) is now used as an extra naming candidate. Individual item filenames are no longer included, preventing cross-file episode token leakage.
Fix: Deferred Nested Extraction Not Abortable
The nested extraction step in
runDeferredPostExtraction(which extracts archives found inside the extracted output) did not receive thedeferredController.signal. This meant that if the user stopped, cancelled, or restarted the application during nested extraction, the extraction process would continue running until it finished naturally instead of aborting immediately.Fix: The
signal: deferredController.signalparameter is now passed toextractPackageArchivesin the deferred nested extraction path, matching the behavior of both the hybrid and full extraction paths.
Test Suite Fully Green (548/548)
All 14 previously failing tests have been resolved:
- Updated extract error label expectations to match the current format (archive name + German error summaries)
- Added timeouts for tests affected by the archive settle delay
- Relaxed byte-exact assertions to account for Windows ALLOCATION_UNIT_SIZE tolerance
- Made mini-file retry assertion platform-aware (Windows pre-allocation masks detection)
-
-
v1.7.104 Stable
released this
2026-03-11 20:05:52 +01:00 | 190 commits to main since this releaseFix auto-rename for mixed package groups like idTV/GDR by preserving each episode's own release suffix
-
v1.7.103 Stable
released this
2026-03-11 14:18:29 +01:00 | 192 commits to main since this releaseFix auto-rename choosing raw archive folder names like 4sf-amilllt and scn-alco7-S03E18
-
v1.7.102 Stable
released this
2026-03-10 23:53:21 +01:00 | 194 commits to main since this releaseExtractor System
- Complete extractor reorganization: Restructured the entire extraction engine (~3,550 lines) from an unorganized monolith into 18 clearly labeled sections with
// == Sektion ==separators, making the codebase dramatically easier to navigate and maintain - Section 1 - Imports & Constants: All imports and numeric/string constants consolidated at the top (archive passwords, timeouts, limits, buffer sizes)
- Section 2 - Types & Interfaces: All exported and internal type definitions grouped together (
ExtractOptions,ExtractProgressUpdate,ExtractArchiveFailureInfo,ArchiveSignature,ExtractErrorCategory,JvmExtractResult,DaemonRequest, etc.) - Section 3 - Subst Drive Mapping: Windows long-path workaround functions (
findFreeSubstDrive,createSubstMapping,removeSubstMapping,cleanupStaleSubstDrives) - Section 4 - Archive Detection & Candidates: Signature detection via magic bytes, candidate discovery with deduplication and natural sort order
- Section 5 - Cleanup & Filesystem: Archive cleanup target collection (multipart RAR, split ZIP, 7z splits, .rev files), empty directory removal
- Section 6 - Password Management: LRU password cache (256 entries, package-scoped), filename-derived password extraction, password prioritization logic
- Section 7 - Error Classification: Extraction error text cleaning, category classification (CRC, wrong password, missing parts, disk full, timeout, etc.), serial retry and JVM fallback decision logic
- Section 8 - Backend Mode:
resolveExtractorBackendMode()and per-archive backend resolution (auto/jvm/legacy) - Section 9 - Native Extractor Resolution: 7-Zip and WinRAR discovery, extractor probing with timeout, candidate ordering per archive type
- Section 10 - CPU/Thread/Priority: JVM heap calculation, thread budget based on CPU cores, Windows process priority management
- Section 11 - Process Execution:
killProcessTree(),runExtractCommand()with progress parsing, output buffering, and monotonic percent tracking - Section 12 - JVM Backend & Daemon: JVM extractor layout resolution, persistent daemon lifecycle management (
startDaemon,waitForDaemonReady,shutdownDaemon), daemon request/response protocol - Section 13 - Legacy Extraction: External extractor argument building (7-Zip and WinRAR CLI flags), password retry loop with delay, JVM-to-legacy and legacy-to-JVM fallback chains
- Section 14 - ZIP Extraction (AdmZip): Built-in ZIP extraction with path-traversal protection, memory limit guards, external ZIP fallback for large entries
- Section 15 - Disk Space, Timeout & Memory Limits: Pre-extraction disk space validation, dynamic timeout calculation based on archive size, configurable ZIP entry memory limits via
RD_ZIP_ENTRY_MEMORY_LIMIT_MB - Section 16 - Resume State: Atomic progress file persistence (write-tmp-then-rename), case-insensitive archive name matching on Windows, state read/write/clear
- Section 17 - Progress & Conflict Helpers: Log emission, conflict mode normalization, external ZIP preference logic
- Section 18 - extractPackageArchives(): Main orchestration function - archive scanning, disk space check, resume state loading, parallel/serial extraction with concurrency control, nested archive extraction (1 level deep), cleanup, and result aggregation
- All 82 tests passing - zero behavior changes, all exports preserved 1:1
Auto-Update System
- Robust digest parsing: New
parseExpectedDigest()function supports SHA-256 and SHA-512 in both hex and base64 encodings, with and without algorithm prefix (sha256:abc...,sha512:abc..., or plain values). Handles URL-safe base64 (-_to+/) and padding normalization - Streaming file hash verification: New
hashFile()function computes SHA-256/SHA-512 digests via streaming (1 MB chunks) instead of loading entire files into memory - Binary shape validation: New
verifyBinaryShape()checks downloaded installers for minimum file size (128 KB) and valid PE/MZ header before attempting installation - Integrity error detection: New
isIntegrityError()classifier distinguishes hash mismatches from network errors, enabling smarter retry logic - Multi-pass download capability: New
MAX_DOWNLOAD_PASSESconstant (3) for re-downloading on integrity failures - Abort-aware sleep: New
sleep()helper respects the global update abort controller, preventing stale timers after shutdown - latest.yml SHA-512 extraction: Improved
extractSha512Value()handles both quoted and unquoted YAML values, validates base64 (86-88 chars) and hex (128 chars) formats - Code organization: Update module restructured with section headers (Constants, Types, Update Sources, Module State, Version Utilities, Repository Normalization, Network Utilities, Digest Parsing, latest.yml Parsing, Installer Verification, Release API, Download Candidates, Error Classification, Download Engine)
- Simplified function names:
readJsonWithTimeouttoreadJsonBody,readTextWithTimeouttoreadTextBody,safeEmitProgresstoemitProgress,fetchReleasePayloadtofetchRelease,buildDownloadCandidatestobuildCandidates,deriveUpdateFileNametoderiveFileName - Extracted helper functions:
isValidRepoPart()andextractOwnerRepo()extracted from inline closures innormalizeUpdateRepo()for better testability
Housekeeping
- Normalized line endings (CRLF to LF) across all source files for consistent cross-platform editing
- Added
docs/UNPACK-PAUSE-ANALYSIS.mddesign document for extraction pause/resume architecture
- Complete extractor reorganization: Restructured the entire extraction engine (~3,550 lines) from an unorganized monolith into 18 clearly labeled sections with
-
v1.7.101 Stable
released this
2026-03-10 20:23:00 +01:00 | 196 commits to main since this releaseRebuild download completion verification to stop premature finishes and resume truncation
-
v1.7.100 Stable
released this
2026-03-10 20:09:36 +01:00 | 198 commits to main since this releaseFix parallel extraction slots honoring configured package concurrency