* fix (hls): preserve playback reserve across cache eviction
keep a stable session media clock and completed segment timings so cache
eviction and origin rollovers cannot reset playback reserve.
update segment fixtures and cover reserve stability after collection.
* fix (hls): prevent playback stalls during origin manifest retries
mark the origin as degraded on the first retryable manifest failure, cap
retry-after delays, and reevaluate reserve independently of client polling.
use a bounded state commit after an expired splice deadline instead of
leaving the lease live when terminal media cannot be published safely.
* fix (hls): serve custom responses after the live splice deadline
publish a finite lease-bound channel_unavailable playlist on the existing
manifest route when a safe live splice is no longer possible.
renew lease and session activity on successful custom-segment requests
and retain concrete preparation failure diagnostics.
* fix(hls): persist origin qualification for short playlists
Share qualification and retry receipts across leases, preserve them while media publication is pending, and allow controlled recovery after expired acceptance episodes. Prefer eligible regular candidates before short fallbacks.
Add startup, revalidation, replay, cookie and endpoint regression coverage, and document short-window behavior.
Validation during implementation: Linux make test (7009 passed, 23 ignored), focused HLS and endpoint suites, format checks, Clippy and Markdown lint. Offline production library and backend checks passed after the import fix.
* fix(hls): reconcile cache write budgets and revision reclamation
Transfer reserved bytes atomically through staging and publication, preserve cleanup ownership across cancellation, and retire unpinned revisions during local and global reclamation.
Version temp registrations during inventory scans, remove production panic calls, and isolate debug diagnostics from admission results.
Validation: 1,162 HLS tests and 7,038 workspace tests passed; fmt-check, lint, test, markdown-lint and isolated production Clippy passed with dev-slim.
* feat (ai): add local codex files
* fix (hls): replace invalid origin accounts in shared HLS sessions
* fix (hls): synchronize origin account handovers across WebUI viewers
* fix (hls): preserve same-account resume work and backpressure
* fix (hls): resume reduced retries without crossing generations
Allow eligible exhausted acceptance episodes to select reduced retry candidates
while preserving generation, candidate, workload and timing guards. Keep
recovery chains bound to their generation, including changes between selection
and commit.
Add regressions for repaired and persistent resource conflicts, generation
isolation and media delivery through the app's local HTTP origin. Keep shared
manifest fixtures under test/fixtures/hls/reduced-retry.
* 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>
- Actively drop the hyper connection future (`drop(conn)`) on forced socket close to abort active stream bodies immediately.
- Introduce `SocketCloseState` (Open / Closing) in `ConnectionManager with per-socket oneshot channels to ensure targeted signal delivery and prevent premature provider release on repeated kicks.
- Remove user entries atomically under a single write lock in `ActiveUserManager`.
- Explicitly drop shared stream register locks before async teardown.
- Remove duplicate provider cleanup on serve loop termination.
- Add lifecycle integration tests and unit tests for kick idempotency, dropped receivers, and Closing-state provider retention.
Co-authored-by: euzu <euzu@proton.me>
- **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.