* fix: restore Windows builds for gnu/msvc targets
memmap2::Advice and Mmap::advise are Unix-only; add a portable Advice stub
on non-Unix. Fix GetDiskFreeSpaceExW output pointer types and wrap the
current-process pseudo-handle in a Send newtype so sys_usage can spawn on
tokio.
Co-authored-by: Cursor <cursoragent@cursor.com>
* windows support
* windows support
---------
Co-authored-by: MaxPain99 <maxpain99@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: euzu <euzu@proton.me>
Co-authored-by: euzu <33094714+euzu@users.noreply.github.com>
- **New Features**
- Added configurable QoS snapshot compaction to periodically reclaim storage from expired snapshots.
- Compaction runs daily by default and can be disabled by setting the interval to `0`.
- QoS config hot-reload now recognizes compaction interval changes.
- Older saved snapshot checkpoints remain compatible with the new setting.
- **Documentation**
- Updated configuration examples and reverse-proxy QoS documentation to include `compaction_interval_secs`, its default, and disable behavior.
* **New Features**
* Added a STRM export option to control whether generated folder/file names use media metadata or the processed title.
* STRM naming now prefers the processed title by default; enabling the option switches to metadata-derived names.
* Added a UI chip/tag and editor control for the setting.
* **Documentation**
* Updated STRM configuration docs with the new option, its default, and its effect.
* Added localization text for the setting in supported languages.
* **Tests**
* Added/updated tests to verify filename behavior for videos and series with and without the option.
* **New Features**
* Catch-up streams can now auto-detect whether to serve direct video or an HLS playlist.
* Added archive-aware HLS session/identity handling and improved upstream user-agent propagation for manifests.
* Enhanced M3U timeshift/archiving, including nested handling and native Flussonic archive support; Short EPG can advertise archive availability.
* **Bug Fixes**
* Provider session headers now persist across retries and deferred-open scenarios.
* Legacy HLS routing is now cache-aware; seek detection improvements.
* Stalker errors now better redact sensitive URL details.
* Fix: Preserve VOD client range requests
* **Tests**
* Expanded coverage for probing, archive/timeshift resolution, header overlay rules, and related routing.
* **New Features**
* Added **Force MPEG-TS** / `disable_hls_streaming` for Xtream live streams, rewriting live `.m3u8` requests to `.ts`.
* Added UI controls and option indicators, with localized labels in English, Arabic, and Russian.
* **Documentation**
* Clarified MPEG-TS behavior and added an Xtream example configuration.
* **Bug Fixes**
* Improved live-stream playback routing/extension handling and related permission-failure responses.
* Refined provider allocation and grace-period handling for more consistent connection admission.
* **New Features**
* Added configurable mapping stages for `mapping.yml`: `processing` (default) and `after_epg`.
* `after_epg` mappings now run after EPG enrichment and can react to enriched EPG fields.
* **Bug Fixes**
* Stage-aware playlist mapping: if no mappings match, the source is left unconsumed.
* Mapping directory merges now reject conflicting stages for the same mapping id and report both files clearly.
* **Documentation**
* Updated mapping DSL and target `processing_order` docs to describe stage timing and guarantees.
* **Tests**
* Added coverage for stage-restricted mapping behavior, merge conflicts, and AfterEpg timing.
Bug Fixes
- Input forms now consistently update when switching between configured sources.
- Improved filter matching for captions/titles and more accurate type handling for live/video/series (including series-info variants).
New Features
- Mapping DSL now supports reading @input and @type as metadata sources, while rejecting assignments to them.
- Regex capture results are now more consistently exposed across captures (by index and name).
Tests
- Added WASM browser coverage for input switching and updated coverage for filter/mapping behavior.
Documentation
- Updated mapping DSL documentation and changelog to reflect @input/@type read-only behavior and capture access rules.
Bug Fixes
Fixed playlist counter assignments so values reset correctly during each refresh.
Corrected counter displays to consistently show their configured starting values.
Improved counter comparisons to detect changes in starting values accurately.
New Features
- Added first-class Stalker/Ministra portal support, including live, VOD, series, playback-link refresh, and bulk EPG ingestion.
- Added Stalker configuration and batch/CSV support in the Web UI.
- Added playlist preview and playback handling for Stalker inputs, with support for partial refreshes.
* BPlusTree refactoring / optimization
New Features
- Added streaming JSON/CBOR “try” array responses that stop at the first failure, with coalesced HTTP chunking for smoother delivery.
- Introduced B+Tree v3 persistence (with v2→v3 migration) including verified atomic updates, snapshots, compaction, and batch operations.
- Updated playlist/index streaming to use sorted-index acceleration with corruption-safe fallback.
Bug Fixes
- Corrupt/unreadable Library databases now surface repository errors instead of appearing empty.
- Playlist/lineup/EPG/Xtream/M3U streaming now propagates per-entry failures correctly (including improved counting/early-stop behavior).
Documentation
- Updated README and changelog to reflect the B+Tree v3 format and migration behavior.
* feat: key shared hls sessions by origin id
* feat: support hls content encoding
* fix: coderabbitai findings
* Fix: Custom headers are lost on provider://
In the manual redirect path, the abstract provider:// URL is compared against the resolved HTTP URL.
This causes the request to be marked as "scrubbed" before the first real redirect even occurs, stripping out headers like X-API-Key.
* fix(strm): name every flat/tmdb version after the folder it lands in
Under `flat: true` the movie folder is deduplicated by TMDB id, but
`final_filename` was derived from each item's own provider title before the
folder-reuse branch. Providers routinely list the same film twice with the tag
written two ways, so the second listing landed in the first listing's folder
under a name that does not start with the folder name.
That is precisely the condition Jellyfin's Emby.Naming VideoListResolver checks
in IsEligibleForMultiVersion: the file name must start with the folder name, and
the remainder must be empty or start with '-', '_', '.', or a [bracketed] token.
Any ineligible file makes GetVideosGroupedByVersion return the folder's videos
ungrouped, so *every* file in it becomes a separate movie.
The first item to claim a flat folder now also fixes the file name for every
item that follows it into that folder. The existing add_quality_to_filename
suffix, or the existing [Version id#N] collision suffix when the qualities tie,
is what keeps the versions apart. Kodi and Emby shared the same defect and are
fixed with them.
* fix(quality): classify resolution from the frame, not its height alone
VideoResolution was bucketed from ffprobe's height only. Widescreen releases keep
the full raster width but encode fewer active lines, so a 2.40:1 film mastered at
1080p (1920x796) was tagged '720p HD', and a 2.40:1 UHD master (3840x1600) was
tagged '1440p QHD'.
Classify both axes and keep the higher tier. Height still decides on its own when
the width is missing, which also keeps anamorphic frames (1440x1080) correct.
* fix(strm): drop the category from flat movie file names
The category suffix was added to flat movie file names 'to avoid collisions',
but with folder reuse now naming files after their folder, the only files that
can collide are versions of the same movie -- same TMDB folder, same quality
string -- and the existing [Version id#N] pass already separates those.
It is not free: Jellyfin and Emby render whatever follows the folder name as the
version label, so the category was showing up in the version picker next to the
quality. Removing it makes the label read as the quality alone.
Items without a TMDB id keep the category, because it is what makes their folder
unique -- but they now carry it in the file name as well. Previously the folder
got '[Category]' while the file did not, so the file name did not start with the
folder name and version detection was broken for exactly those items.
* fix(strm): keep the version label when the writer truncates a long name
The [Version id#N] suffix is the only thing separating two versions that share a
base and a quality string, but it was appended last and the writer truncates the
file stem to 250 chars -- so for a long enough title the suffix was cut off, both
versions resolved to the same path, and the second silently overwrote the first.
The collision detector could not see it either, since it compares untruncated
names.
Trim the shared base to fit instead, so the label always survives. The 250-char
limit is now a named constant used by both the naming and the writing side.
Also hoist the per-item flag lookups out of the naming loop and drop a redundant
HashSet lookup (insert already reports whether the entry was present).
* docs: scope the no-tmdb category note to jellyfin/emby