feat(dvr)!: unify live and VOD/series recording into one recoverable DVR
Merge fix/merge_live_and_vod_recording into develop.
- One recording queue for scheduled live captures and VOD/series transfers,
with a shared transition graph, provider-slot scheduling, resumable HTTP
transfers (strong ETag / Last-Modified validation) and ffmpeg live capture.
- Crash-recoverable persistence: B+Tree repository with a journal-first
recovery history; one file can be shared by several library entries.
- Admission checks quota and disk on request, at transfer start (real size)
and before an entry attaches to a finished file; idempotent requests.
- REST is command-only; state reaches clients via owner-filtered WebSocket
snapshots.
- Deleting a recording removes the file once no entry holds it; removing an
entry keeps a finished file and cleans up orphaned partials.
- User ids derive from the configured username (web:/api:); the identity
registry is gone.
- Spanish locale added; ru/ar completed; locale parity test.
BREAKING CHANGE: `video.download` is now `video.recording` (nested
`recording` keys move up, `download_priority`/`recording_priority` become
`priority`); old configs fail to load with a migration hint.
BREAKING CHANGE: `/api/v1/file/download*` and `/file/record` are removed in
favour of `/api/v1/recording/*`.
BREAKING CHANGE: `download.*` and `recording.write` permissions are replaced
by `recording.read|create|manage|delete`; tokens from before the change must
re-authenticate.
BREAKING CHANGE: the old recording queue does not migrate; existing
`identity_registry.json` is ignored.
* fix(hls): return upstream status for HLS resources
- no TS fallback for failed segments, init and keys
- bounded capacity wait on pinned account (manifest 5s, media 2s)
- reject waiting requests after session end or account switch
- per-origin provider cookie jar, read at send time
- opt-in flussonic_hls_audio_tracks input option
* fix(hls): return upstream status for HLS resources
- no TS fallback for failed segments, init and keys
- bounded capacity wait on pinned account (manifest 5s, media 2s)
- reject waiting requests after session end or account switch
- per-origin provider cookie jar, read at send time
- opt-in flussonic_hls_audio_tracks input option
* fix(hls): return upstream status for HLS resources
- no TS fallback for failed segments, init and keys
- bounded capacity wait on pinned account (manifest 5s, media 2s)
- reject waiting requests after session end or account switch
- per-origin provider cookie jar, read at send time
- opt-in flussonic_hls_audio_tracks input option
* fixing resource url problem
* fix(resources): classify resource destinations per hop and keep the proxy in the fetch path
A resource URL is classified (public / non-public / local) before it reaches a client, and every
redirect hop is classified and fetched again: non-public hops connect directly, public hops go
through the configured proxy, local hops are refused. Adds the public no-redirect resource client,
a process-wide destination memo, and regression tests for the redirect and Web UI paths.
* fix(resources): classify resource destinations per hop and keep the proxy in the fetch path
A resource URL is classified (public / non-public / local) before it reaches a client, and every
redirect hop is classified and fetched again: non-public hops connect directly, public hops go
through the configured proxy, local hops are refused. Adds the public no-redirect resource client,
a process-wide destination memo, and regression tests for the redirect and Web UI paths.
---------
Co-authored-by: euzu <euzu@proton.me>
* **New Features**
* Added a Resource Policy editor for each input, supporting trusted hostnames and private network ranges.
* Resource URLs now retain their source input and use authenticated links where supported.
* Resource caching is scoped to the policy authorizing access.
* **Bug Fixes**
* Invalid or unsupported resource values are safely discarded.
* Redirects and destination addresses are rechecked against the applicable policy.
* **Breaking Changes**
* Private DNS destinations require approved hosts and networks; private IP literals require an approved network.
* Input and alias names must be non-empty and globally unique.
* **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.