* fix hls close revision file at reader deadline
Move the progressive revision reader onto its own task and feed the
response stream through a bounded channel. At the deadline the watchdog
aborts the reader, so the file handle and revision pin are released
even if a stalled client never polls the stream again.
Each open revision file now holds its own pin, so GC cannot retire a
revision while a handle is open, including one held by an in-flight
blocking read.
* fix hls close revision file at reader deadline
Move the progressive revision reader onto its own task and feed the
response stream through a bounded channel. At the deadline the watchdog
aborts the reader, so the file handle and revision pin are released
even if a stalled client never polls the stream again.
Each open revision file now holds its own pin, so GC cannot retire a
revision while a handle is open, including one held by an in-flight
blocking read.
---------
Co-authored-by: euzu <euzu@proton.me>
* fix(hls): keep provider affinity after reconnect lease expiry
- Remember the provider that last delivered media for reconnect-capable
playback (HLS, DASH, Catchup, VOD) beyond the lease window. The
preference holds no slot, never forces grace and falls back to the
lineup when the provider is full.
- End it on provider failure, preemption, kick, timeout or admin
terminate; stale cleanups are rejected by binding tag, request ID and
session token. Retry token claims stay bounded.
- Terminate and kick now release the HLS binding they acquired.
- Add reverse_proxy.stream.provider_affinity_ttl_secs (default 120,
max 86400) with Web UI field, docs and translations.
- Testkit: pause_millis steps, TTL overrides and the
m3u-hls-provider-affinity-after-lease-expiry scenario.
* fix(hls): keep provider affinity after reconnect lease expiry
- Remember the provider that last delivered media for reconnect-capable
playback (HLS, DASH, Catchup, VOD) beyond the lease window. The
preference holds no slot, never forces grace and falls back to the
lineup when the provider is full.
- End it on provider failure, preemption, kick, timeout or admin
terminate; stale cleanups are rejected by binding tag, request ID and
session token. Retry token claims stay bounded.
- Terminate and kick now release the HLS binding they acquired.
- Add reverse_proxy.stream.provider_affinity_ttl_secs (default 120,
max 86400) with Web UI field, docs and translations.
- Testkit: pause_millis steps, TTL overrides and the
m3u-hls-provider-affinity-after-lease-expiry scenario.
* fix(hls): keep provider affinity after reconnect lease expiry
- Remember the provider that last delivered media for reconnect-capable
playback (HLS, DASH, Catchup, VOD) beyond the lease window. The
preference holds no slot, never forces grace and falls back to the
lineup when the provider is full.
- End it on provider failure, preemption, kick, timeout or admin
terminate; stale cleanups are rejected by binding tag, request ID and
session token. Retry token claims stay bounded.
- Terminate and kick now release the HLS binding they acquired.
- Add reverse_proxy.stream.provider_affinity_ttl_secs (default 120,
max 86400) with Web UI field, docs and translations.
- Testkit: pause_millis steps, TTL overrides and the
m3u-hls-provider-affinity-after-lease-expiry scenario.
---------
Co-authored-by: euzu <euzu@proton.me>
* fix(hls): reuse stable provider lease owners across playback retries
Keep public HLS tokens unique while sharing provider leases by
client/user/channel fingerprint. Preserve request ID and binding
generation guards and scope socket cleanup to the original session.
Add regression tests for repeated retries, stale cleanup, reused
sockets and M3U alias fallback with an A=2/B=4 provider pool.
* fix(hls): reuse stable provider lease owners across playback retries
- Keep public HLS tokens unique while sharing provider leases by
client/user/channel fingerprint. Preserve request ID and binding
generation guards and scope socket cleanup to the original session.
- Add regression tests for repeated retries, stale cleanup, reused
sockets and M3U alias fallback with an A=2/B=4 provider pool.
fix: proxy external Xtream VOD sources in M3U reverse mode
- Resolve stored VOD URLs using the existing input identity.
- Use canonical movie URLs for alias accounts with the original stream ID.
- Keep redirects internal and stop forwarding upstream Referer headers.
- Add regression tests for CDN URLs, aliases, ranges, and URL leakage
* fix(hls): reuse stable provider lease owners across playback retries
- Keep public HLS tokens unique while sharing provider leases by
client/user/channel fingerprint. Preserve request ID and binding
generation guards and scope socket cleanup to the original session.
- Add regression tests for repeated retries, stale cleanup, reused
sockets and M3U alias fallback with an A=2/B=4 provider pool.
fix: proxy external Xtream VOD sources in M3U reverse mode
- Resolve stored VOD URLs using the existing input identity.
- Use canonical movie URLs for alias accounts with the original stream ID.
- Keep redirects internal and stop forwarding upstream Referer headers.
- Add regression tests for CDN URLs, aliases, ranges, and URL leakage
* **Bug Fixes**
* Playback retries can use another available provider when playback has not started, helping requests proceed if the initially selected provider is unavailable.
* Once playback has started, retries continue using the same eligible provider to preserve playback continuity.
* Provider selection follows the same rules for regular playback and forced reopens, reducing unnecessary provider pinning before media begins.
* Series episode URLs can resolve to the correct account-specific playback address.
* **New Features**
* Stalker playback resolves channel links on request, using available channel commands and falling back to the stored command when needed.
* If a portal rejects a session, playback retries once after reconnecting.
* **Bug Fixes**
* Reading playlists or resolving playback for a different portal identity no longer replaces the published catalog or clears its refresh checkpoint.
* A failed channel playback no longer prevents other published channels from remaining available.
* **Documentation**
* Updated Stalker playback guidance to describe on-demand link resolution and session recovery.
* **Bug Fixes**
* Improved live-stream session handling during instant grace periods, including when a session has not yet been created.
* Corrected connection-limit and eviction tracking so active streams remain eligible for eviction even when their session record is unavailable.
* Improved reliability when switching between live channels under connection limits.
* **Improvements**
* Updated staged M3U overlays for Xtream providers: staged groups determine selected categories and channels, while unmatched categories remain available. Provider categories with no usable staged channels are retained.
* **Documentation**
* Clarified how staged Xtream and M3U playlists affect provider categories and channels.
- **New Features**
- Added assertions for verifying which provider account handled the latest request.
- Enabled provider-affine playback to fall back to another available provider when the pinned provider is unavailable.
- **Bug Fixes**
- Improved provider fallback handling, origin request tracking, and session updates.
- Preserved session headers when fallback stream setup fails and refreshed them after successful fallback.
- **Tests**
- Added coverage for provider-pool failover, account reuse, limits, rejection handling, and eviction behavior.
* **New Features**
* Added an opt-in runtime liveness watchdog with diagnostics, health status, and optional automatic restart.
* Added configurable stream cleanup capacity and eviction re-entry protection.
* Expanded configuration and UI access for users with playlist or user permissions, with safer data sanitization.
* Added testkit scenarios and reporting for playback, admission, provider limits, sharing, and VOD behavior.
* Added support for experimental-branch Docker builds.
* **Bug Fixes**
* Improved provider prioritization, shared playback capacity, cleanup, reconnect handling, and concurrent client behavior.
* Fixed playlist parsing for declared media types.
* Release links now use the configured destination.