-
v26.11.0
StableBuild ErsatzTV Image / CI image pin matches docker/ci (push) Has been skippedBuild ErsatzTV Image / Docs update reminder (push) Has been skippedBuild ErsatzTV Image / decisions.md append-only (push) Has been skippedBuild ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Has been skippedBuild ErsatzTV Image / Functional E2E (curl contracts) (push) Has been skippedBuild ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Has been skippedBuild CI Toolchain Image / Build & push CI image (push) Successful in 21sBuild ErsatzTV Image / Build & test (.NET) (push) Successful in 7m13sBuild ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 19m34sBuild ErsatzTV Image / Build & push image (amd64) (push) Successful in 7m53sreleased this
2026-07-20 22:22:04 +02:00 | 637 commits to main since this releaseFixes ~50% channel cold-start failures on Intel QuickSync hardware, unifies the channel logo with the on-screen bug, and hardens the Jellyfin scanner and remote-stream playback paths. 83 commits since v26.10.0.
Upgrade note — a default changes.
QsvPreferNativeDecoderships ON, so every existing QSV FFmpeg profile switches to VA-API decoding on upgrade. This is the intended fix for #498; turn it off per-profile if you need the old strict-QSV decoder back.Hardware acceleration (#498)
- QSV profiles now decode via VA-API while still encoding with QSV, mirroring Jellyfin's "Prefer OS native decoders". The strict QSV decoder failed on imperfect H.264 — measured at 3 fatal decoder-open failures across 6 channel cold-starts on an Intel i7-10700K.
- New per-profile
QsvPreferNativeDecoderfield (default on) + a "Prefer native decoder" checkbox on QSV profiles, carried through the domain, FFmpeg pipeline, REST layer, and SPA.
Channel logo / on-screen bug (#67)
- One shared Channel Bug watermark preset drives both the channel listing logo and the on-screen bug — no more maintaining two images.
- "Use logo as on-screen bug" toggle with a live geometry preview in the channel editor; the watermarks screen shows resolved bug geometry; new channels default to the preset.
Jellyfin scanning
- Support mixed-content libraries — one Jellyfin library holding more than one media kind (#489)
- Resolve
LibraryFolderfrom the DB so music-video scans stop throwingNullReferenceException(#488) - Reconcile removed music videos (#494) and music-video metadata collections (#497) on rescan
Playback resilience
- Probe media-server remote-stream URLs before handing them to ffmpeg; only a redirected 404 fails closed (#473)
- Probe external-JSON remote-stream URLs the same way (#480)
- Cascade
FileNotFoundfrom removed shows/seasons down to their descendants (#476) - Guard media-server library sweeps against successful-but-empty fetches — an empty 200 no longer nukes a library (#477)
Scheduling & UI
- Weighted distribution in the SPA — per-source weight inputs +
WeightedShuffleplayback order (#404) - Render real channel logos in the guide grid and channels list (#464)
- Bound the schedules "Active schedule" selector so it stops overlapping the header (#463)
Performance & instrumentation
- Sub-split the HLS cold-start startup phase into honest buckets, with a stale-playlist guard (#472)
- TTL-cache health-check results;
?refresh=trueforces a fresh run (#431)
CI / tooling
- Format gate now uses
dotnet format whitespace --folder: ~480s → ~0.5s (#469) - Sample true peak-anon memory in the test job rather than cache-inflated
memory.peak(#412) - Deterministic functional-E2E for the playout-build lock 409 +
isLockedprojection (#444)
Infrastructure
- First release deployed to
jazz(192.168.1.29) — the media transcoders moved off bumblebee on 2026-07-20 (server-management#633).docs/ci-cd.mdnow opens with a Hosts table and a name-reuse warning:jazzwas an earlier name for the .99 host, so resolve hostnames by IP, not by name (#501, #507).
Release process: cut on green
main@601d855b;dotnet list package --vulnerable --include-transitiveclean across 15 projects; full local test gate green (3945 passed, 0 failed); carries a dual-provider EF migration (Add_FFmpegProfile_QsvPreferNativeDecoder, SQLite + MySQL);docs/decisions.mdhad no superseded entries to consolidate. Prod follows the floating:prodtag — promoted via KomodoDeployStack media-serversafter the immutable:26.11.0candidate passesscripts/security-scan.shon jazz.Downloads