* **Performance**
* Improved memory usage and persistence speed for large playlists and electronic programme guides.
* Large EPG datasets now process more reliably while preserving channel priorities and cleaning up temporary data.
* Reduced allocation overhead during parsing and playlist processing.
* **Bug Fixes**
* Prevented programme descriptions from being truncated during XMLTV imports.
* Improved handling of empty or single-source EPG data.
* **Network**
* Optimized response compression by avoiding compression for small or already-compressed media files.
* **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 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
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.
* 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.
Shared HLS cache session feature and aligns the runtime, cache, provisioning, recovery, custom-response, and documentation paths with the new shared-session model.
* perf: binary-search EPG programme lookup
Replaces the linear position() scan with a binary search via partition_point for EPG programmes. Reduces complexity to O(log p).
* perf: cache interned PlaylistItemType label
Avoids repetitive hash-map lookups during sorting and filtering. The five fixed labels are now interned once via OnceLock and returned as a cheap Arc clone.
* perf: avoid per-event String allocation in web-UI XMLTV parser
Uses borrowed Cow types instead of allocating a new String for every element name. Tracks the active text state using a small TextTag enum.
* perf: throttle per-chunk download control poll
Throttles the control_signal lock polling to a 200ms interval on multi-GB downloads to prevent CPU thrashing. Immediate actions (pause/cancel) remain guaranteed via control_notify.
* perf: pre-size filtered channel buffers in apply_filter_to_playlist
Pre-allocates the filtered channel vector based on the source group length. Eliminates step-by-step reallocations on large playlists.
* fix: surface playlist cache load failures instead of silent empty fallback
Replaces silent error swallowing with real error logging (distinguishing missing files from corruption) while preserving the empty fallback behavior.
* perf: remove redundant first drain loop in get_remote_content_as_file
Removes a dead, redundant loop. The stream body is now consumed only once, allowing the idle timeout to protect the transfer correctly.
* perf: back off instead of busy-spinning on empty client-stream chunks
Introduces a short Sleep backoff (Poll::Pending) when a provider sends continuous empty keep-alive chunks. Prevents the CPU from spinning hot.
* perf: make library orphan cleanup linear instead of O(n^2)
Reduces the complexity of cleaning up orphaned entries from O(n^2) to linear O(n). Loads the metadata library only once and pre-computes partitions.
* perf: indexed batched merge for series expansion instead of O(n^2) scans
Replaces expensive O(n^2) scans during series expansion with index-based batch processing. Builds temporary lookup indexes and merges groups linearly.
* perf: pre-size group flatten buffers to reduce reallocation churn
Pre-allocates target merge vectors and category indexes to eliminate repeated memory reallocations when flattening large target playlists.
* perf: stream custom provider playlist endpoint instead of materializing it
Switches from full in-memory materialization to lazy conversion and streaming of JSON/binary responses. Massively reduces the memory footprint.
* refactor: centralize InputType batch/family checks behind enum helpers
Moves scattered matches! checks for M3u/Xtream types into centralized enum helpers (is_batch(), etc.) to prevent logic drift.
* refactor: centralize XMLTV tag/attribute literals into named constants
Replaces hardcoded inline strings in the XMLTV parser with named constants (EPG_TAG_TITLE, etc.) as a single source of truth.
* refactor: derive GeoIpUpdateError Display/Error via thiserror
Replaces manual Display and Error implementations with the thiserror macro, allowing new error variants to self-document their formatting.
* refactor: attach per-cluster facts to XtreamCluster instead of scattered matches
Centralizes redundant API actions and collection name mappings directly onto the XtreamCluster struct instead of using scattered match blocks.
* refactor: centralize PlaylistItemType video/series classification
Introduces is_video() / is_series() on the enum to unify duplicate matches! checks across filters, probes, and tracking modules.
* feat: add per-stage summary logs to VOD/series resolve queueing
Adds a concise debug summary per processing stage (total counters and elapsed time) to make hot-path diagnostics easier without raising the log level.
* refactor: generate ItemField get/set from a single direct-field list
Uses a callback macro to synchronously generate both getter and setter blocks for directly-bound fields (Name, Url, etc.) from a single master list.
* refactor: derive input-type routing from a single capability descriptor
Bundles InputType behaviors (backends, connection rules) into a single capabilities() descriptor to prevent bugs when adding new variants.
* refactor: derive output-format routing from a single capability descriptor
Centralizes output format features (filter, EPG, and cache support) into a single TargetCapabilities descriptor instead of spreading logic across no-op match arms.
* feat(ui): toast progress bar, pause-on-hover, and copy-details for errors
Add a countdown progress bar to auto-dismiss toasts, pause both the timer and bar on hover (resuming with remaining time), and a 'copy details' action on error toasts. Respects prefers-reduced-motion.
* feat(ui): confirm destructive download/recording cancel and remove
Route the download/recording cancel and remove actions through the shared ConfirmDialog (which focuses the safe Cancel button by default), matching the existing confirmation flow for user/target/RBAC deletes.
* feat(ui): runtime-discovered languages with manifest and RTL support
Load available UI languages at runtime from assets/i18n/index.json, add a toolbar language picker (shown when >1 language), persist the choice, and set document dir/lang for RTL languages such as Arabic.
* feat(ui): recoverable error boundary with per-view retry fallback
Add an ErrorBoundary component (context handle + use_error_boundary hook) that shows a recoverable fallback with a retry button instead of blanking a section. Wrap each main view and the API-user playlist individually so a failure in one view stays contained and the rest of the UI keeps working.
* fix(api): use async canonicalize in local file stream handler
Replace the blocking std path.canonicalize() in local_stream_response with tokio::fs::canonicalize().await so the async runtime is not blocked while resolving the local media file path.
* Add Escape-to-close keyboard support for popup menus
Popup menus now close on Escape in addition to outside mouse-down, improving keyboard accessibility.
* Use descriptive alt text for logo and channel logo images
Login and sidebar logo images now use the configured app title, and playlist channel logos use the channel title, improving screen-reader accessibility.
* Add explicit type=button to shared button primitives
IconButton and TextButton now render with type=button to prevent accidental form submission when used inside forms.
* Persist sidebar collapsed state and table page size
The sidebar collapsed/expanded state and the stream-history table page size are now saved to localStorage and restored on reload, matching the already-persisted theme preference.
* Debounce filter editor input parsing
The filter editor textarea no longer re-parses, previews, and emits the filter on every keystroke. The textarea stays responsive via an immediate value while parsing and change notifications are debounced (300ms).
* Show localized message in table empty state
Data/paged tables now render the No content label in their empty state instead of an icon with no text. Sticky headers were already present.
* feat(frontend): improve screen-reader support for sidebar and toasts
* fix(frontend): handle missing window gracefully in sidebar
* feat(frontend): cross-dissolve colors on theme switch
* feat(frontend): add card hover lift, button press feedback, animated chevrons
* Removed code duplicates
* fix: video and audio deserialization for db dump
* fix: resolve proivder feature for redirect mode
* fix: enable seek feature for ffprobe on large vod and series elements
* fix: keep seekable ffprobe probes bounded
* Sorce ordinal by category and channel index
* Parsing UserApiRequest from request body or query
* CSS stylings
* media tools refactoring
* xtream info parsing now number/string fields
* fix: Scheduler preserve forced_targets across config reloads.
hot reload could cause loosing scheduler task targets.
warn logs for:
- process_source: warns when all inputs are disabled for given targets
- process_sources: warns when no sources were processed at all
* Fix: Logger initialization
* Fix: TCP USER TIMEOUT for linux. If a client disrupts the connection, the tcp layer will hold it approx for 5-15 minutes. With this setting we can close in 30 seconds under linux
- Fix: resolve task database problem
- Fix: m3u parsing when staged input delivers virtual id
- provider id extraction from url refactored
- some optimizations for hashutils
* Fix HLS session handling and disable retry for adaptive segment requests
* Resolve / probe vod task uses last modified date
* Resolve expiration date in input form
* fixed m3u parsing
* fixed wasm opt for frontend build
* Fixed issues with probe and resolve tasks
* hls and catchup session fixes
* fixed problem with grace and shared stream
- added fix for missing episode title