All notable changes to ReScene.NET are documented here. Releases follow SemVer and this file follows Keep a Changelog.
1.2.6 — 2026-05-12
- SRS Creator gains an optional Main file input. When set, the
writer locates each track's signature inside the main file after
profiling and records the offset as
TrackInfo.MatchOffset, mirroring pyrescene's-cflag. Produces SRS files byte-equivalent to scene tooling output (matchingMatchOffsetvalues rather than 0). MKV uses the EBML walker (handles subtitle-style tracks); other containers fall back to a raw byte scan. Tracks the verifier cannot locate keepMatchOffset = 0and emit a warning instead of failing. - SRS Reconstructor and SRS Creator both show live scan progress (percent, MB scanned, throughput, ETA) during their long file-walking steps. The Reconstructor modal stays open through the "Rebuilding" and "Verifying CRC" phases — heading transitions through "Rebuilding Sample" → "Verifying CRC" → close — instead of disappearing while the EBML walker traverses the media file silently.
- RAR Reconstructor warns via
MessageBoxwhen an imported SRR carries no RAR reconstruction information (no RAR file entries, no archived files, and no detected compression method). The user is told to configure options manually instead of being left wondering why nothing auto-populated. - RAR Reconstructor surfaces timestamp-preservation failures. When the
brute-force input copy cannot apply the source file's mtime/ctime/atime
onto the working copy (denied by ACLs, read-only volume, …), a single
summary
MessageBoxlists the affected paths after the run completes, explaining that the produced RAR's File Time (DOS) may not match the original. Per-file warnings continue to flow through the system log in real time.
- MKV sample reconstruction no longer fails with "Unable to locate
track signature for track N in the media file" when the SRS was
generated from a sample containing subtitle tracks (or any track
whose individual Block payloads are smaller than the 256-byte
signature).
MKVContainerRebuilder.FindSampleStreamsnow walks the media file's EBML structure and matches each track's signature progressively across non-contiguous Block payloads — mirroring pyrescene's_mkv_block_find, including partial-match reset/re-try as a fresh match start. The previous raw byte scan inSRSRebuilder.FindSignatureis preserved as a fallback for non-MKV containers. MKVContainerRebuilder.ExtractMediaAttachmentsskips pastClusterbodies during its sweep. Attachments never live inside Clusters, and walking everySimpleBlockin a multi-GB MKV turned the attachment pass into a multi-second silent stall.- Reconstructor input copies now propagate the source file's
LastWriteTime/CreationTime/LastAccessTimeonto the destination after the stream copy. Previously the stream copy stamped destinations with "now", so when the SRR carried no archived timestamps WinRAR packedFILE_HEAD.FTIMEwith the copy time instead of the source's mtime. With SRR-driven timestamps the existingApplyFileTimestampsstep still overrides — same end result. With an empty SRR, the file's correct mtime now flows through to the produced RAR. - Compare tab's
SRSContainerChunksmatcher used to return the first matching node (usually the "Container Structure" parent, whoseDatais aList<SRSContainerChunk>rather than a single chunk), leaving the opposite-side Properties panel empty when clicking through to a Cluster / EBML / Segment / etc. node.FindMatchingNodenow special-cases the type and matches parent-to-parent and chunk-to-chunk byLabel.
1.2.5 — 2026-05-10
- RAR Reconstructor patcher gains per-file modification-time
rewriting.
PatchOptions.FileModifiedTimesmaps file names to targetDateTimes; the patcher overwrites the matching file header's 4-byte DOSFTIMEfield and, whenLHD_EXTTIMEis set and the EXT_TIME mtime nibble carries the present bit, rewrites the sub-second remainder in-place at its existing precision (0–3 bytes), updating the +1s rounding flag for odd-second targets.RAROptionsexposesNeedsMtimePatching(true when host-OS patching is enabled andFileTimestampshas entries) andManagerwires the existingRAROptions.FileTimestampsinto the patch options. Sidesteps file system / WinRAR precision quirks that prevent the source file's mtime from being faithfully captured into the produced archive.
RARProcessnow registersCodePagesEncodingProvider.Instancebefore resolving the OEM code page. Without this,Encoding.GetEncodingfor non-Unicode code pages (437, 850, 1252, …) throwsArgumentExceptionon .NET Core / .NET 5+ and the OEM-encoding path silently fell back into its catch arm.
1.2.4 — 2026-05-10
- Compare tab no longer reports two RAR files as identical when only
their block payload bytes differ.
FileComparer.CompareDetailedBlocksnow byte-compares each block's data region (StartOffset + HeaderSizethrough+ DataSize) in 64 KB chunks when both sides supply anIHexDataSource, surfacing aBlock Dataproperty difference and marking the affected file/service block as[DIFF]in the structure tree. Previously the comparator only inspected parsed RAR header fields, so two archives with identical metadata (filename, packed size, file CRC32, timestamp) but different compressed payloads — the exact case produced when reconstructing — slipped through as "identical." - The status bar can no longer disagree with the hex-view byte diff: when the structural compare finds zero differences but the byte-level hex diff reports differing ranges, the status now reads "Byte-level differences detected in current hex view but no structural differences found." instead of "Files are identical."
1.2.3 — 2026-05-08
- Compare tab now overlays a translucent red highlight on bytes that
differ between the left and right files inside the currently
selected block. The diff is computed asynchronously in 64 KB
chunks with progressive UI updates and is cancelled when the
selection changes; trailing bytes on the longer side are marked
when block lengths differ. Status text shows a
Computing byte diff… NN%progress indicator while the scan runs. - RAR Reconstructor tab gains Import / Export Config commands that
persist all user-editable fields and switches as JSON via the new
ReconstructorConfigsnapshot type. - Brute-Force Progress window gets an Auto-scroll toggle that keeps the version grid pinned to the latest entry as runs complete.
1.2.2 — 2026-05-07
- SRR Creator now prompts before overwriting an existing output file instead of silently truncating it. Cancelling leaves the previous log and progress untouched.
- Compare tab populates correctly when opening an SRR file. The
v1.2.1 acronym rename created two
SRRFileDatatypes in different namespaces; the dispatch inFileCompareViewModelwas matching the wrong sibling, leaving the tree empty. languages.dizextraction now decompresses RAR-compressed VobSub.idxfiles viaRARDecompressorinstead of writing garbage from the packed bitstream. Solid archives, split files, and decompression failures surface a precise per-file skip warning.- SRR Creator no longer silently re-adds the SFV (and any sibling
.nfofiles) after the user removes them from the Stored Files list.SRRWriter.CreateFromSFVAsyncnow treatsadditionalFilesas the sole source of stored-file blocks; the WPFReleaseFileScannerstill pre-populates the UI list when an input is selected.
- Granular per-file log lines during SRR creation:
Adding stored file …,Computing OSO hashes…,Added OSO hash …,Scanning RAR archive for VobSub .idx files…,Adding languages.diz …. - New
RARArchive/RAREntrytypes inReScene.RAR— a file-level view over a RAR volume set withOpen,Files,OpenPackedStream, andTryReadAllBytes(transparent decompression). Replaces hand-rolled header-walk code that had been duplicated across consumers. RARArchiveOpenTests(16 cases) andRARVolumeNamingTests(27 cases) covering the new abstraction and the volume-naming helper.SRRCreationResult.LanguagesDizIdxFilesexposes the discovered.idxfiles; the SRR Creator log surfaces these on the success line.
- Acronyms in identifiers and source-file names normalized to ALL
CAPS to match the dominant convention:
RAR,SRR,SRS,SFV,EBML,MP3,MP4,MKV,AVI,WMV,ASF,ISO,OSO,CRC,MHD,LHD. Mid-identifier and standalone occurrences are covered (e.g.CreateSrrCommand→CreateSRRCommand,BlockCrcMismatch→BlockCRCMismatch). Third-party namespaces and types (Force.Crc32,Crc32Algorithmfrom Crc32.NET,DiscUtils.Iso9660, BCLSystem.IO.Hashing.Crc32) are intentionally preserved. LanguagesDizGeneratorandOSOHashCalculatorrefactored ontoRARArchive, dropping their duplicated header-walk loops.RarStream's previously-private volume-naming helper extracted toRARVolumeNamingand shared withRARArchive.