• v1.7.109 672c74f98f

    v1.7.109 Stable

    Administrator released this 2026-03-23 18:04:21 +01:00 | 179 commits to main since this release

    Handle SxxSxx scene typo in episode detection (e.g. s05s01 interpreted as S05E01)

    Downloads
  • v1.7.108 f0c37bed80

    v1.7.108 Stable

    Administrator released this 2026-03-23 12:07:11 +01:00 | 181 commits to main since this release

    Skip sample files during auto-rename to prevent (2) MKV duplicates

    Downloads
  • v1.7.107 8cc08a422f

    v1.7.107 Stable

    Administrator released this 2026-03-23 11:54:31 +01:00 | 183 commits to main since this release

    Fix auto-rename race condition: files extracted during hybrid rounds are now renamed after MKV-move

    Downloads
  • v1.7.106 024e0995b5

    v1.7.106 Stable

    Administrator released this 2026-03-23 11:25:48 +01:00 | 185 commits to main since this release

    Fix auto-rename episode range folders (S01E01-E08) producing duplicate MKV names with (2)(3)(4) suffixes

    Downloads
  • v1.7.105 15ed49e783

    v1.7.105 Stable

    Administrator released this 2026-03-22 16:24:38 +01:00 | 187 commits to main since this release

    v1.7.105 — Bug Fixes

    Fix: Auto-Rename Episode Token Pollution

    Root cause of two user-reported issues:

    1. Wrong episode numbers during auto-rename — Files like hrs-irland.krimi.hdtv.7p-101.mkv were not renamed (or renamed to the wrong episode) because the episode detection picked up S01E07 from an unrelated file in the same package (4sf-...-s01e07.mkv) instead of correctly parsing the compact episode code 101S01E01.

    2. 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 create filename (2).mkv, filename (3).mkv copies because the target already existed.

    Technical details: The packageExtraCandidates array in autoRenameExtractedVideoFiles previously included ALL item filenames from the package. The resolveEpisodeTokenForAutoRename function iterated these candidates looking for episode tokens, and would return the first SxxExx match 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 the deferredController.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.signal parameter is now passed to extractPackageArchives in 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)
    Downloads
  • v1.7.104 6dcd3796e9

    v1.7.104 Stable

    Administrator released this 2026-03-11 20:05:52 +01:00 | 190 commits to main since this release

    Fix auto-rename for mixed package groups like idTV/GDR by preserving each episode's own release suffix

    Downloads
  • v1.7.103 fc9342577f

    v1.7.103 Stable

    Administrator released this 2026-03-11 14:18:29 +01:00 | 192 commits to main since this release

    Fix auto-rename choosing raw archive folder names like 4sf-amilllt and scn-alco7-S03E18

    Downloads
  • v1.7.102 f9530e015f

    v1.7.102 Stable

    Administrator released this 2026-03-10 23:53:21 +01:00 | 194 commits to main since this release

    Extractor 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_PASSES constant (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: readJsonWithTimeout to readJsonBody, readTextWithTimeout to readTextBody, safeEmitProgress to emitProgress, fetchReleasePayload to fetchRelease, buildDownloadCandidates to buildCandidates, deriveUpdateFileName to deriveFileName
    • Extracted helper functions: isValidRepoPart() and extractOwnerRepo() extracted from inline closures in normalizeUpdateRepo() for better testability

    Housekeeping

    • Normalized line endings (CRLF to LF) across all source files for consistent cross-platform editing
    • Added docs/UNPACK-PAUSE-ANALYSIS.md design document for extraction pause/resume architecture
    Downloads
  • v1.7.101 b49de16534

    v1.7.101 Stable

    Administrator released this 2026-03-10 20:23:00 +01:00 | 196 commits to main since this release

    Rebuild download completion verification to stop premature finishes and resume truncation

    Downloads
  • v1.7.100 1a076c49cb

    v1.7.100 Stable

    Administrator released this 2026-03-10 20:09:36 +01:00 | 198 commits to main since this release

    Fix parallel extraction slots honoring configured package concurrency

    Downloads