Repository navigation
Lineup v2.2.0
Lineup 2.2.0 delivers a major upgrade to live TV playback, guide storage, XMLTV fidelity, stream reliability, and development packaging. Watch now uses a shared CMAF presentation with Shaka Player, browser-tested codec selection, bounded compatibility fallbacks, richer audio and subtitle controls, and improved lifecycle cleanup. Channel and guide state now use authoritative SQLite storage, with XMLTV regenerated from normalized data while retaining supplemental provider metadata.
Highlights
New CMAF and Shaka Watch experience
- Replaced the legacy Watch playback path with Shaka Player and shared CMAF presentations.
- Serves the same fragmented MP4 presentation through both DASH and HLS.
- Shares tuner input and generated media across compatible consumers instead of opening redundant tuner sessions.
- Adds browser compatibility profiles that measure actual DASH, HLS, video, audio, WebVTT, and subtitle burn-in playback.
- Uses measured browser capabilities to prefer source-copy playback and select a compatible fallback only when needed.
- Recovers from source-video decoder failures with one bounded H.264 restart.
- Recovers from unsupported source-audio packaging or playback with a configured AAC, AC-3, or E-AC-3 fallback.
- Adds explicit protocol, quality, video, audio, and fallback-audio overrides without modifying the saved browser profile.
- Improves channel-change, navigation, cancellation, stale callback, disconnected-client, and startup-race handling.
Audio, subtitles, captions, and interlaced video
- Adds in-player audio-track selection for available source and fallback renditions.
- Supports copy-first source audio with configurable fallbacks ranging from E-AC-3 5.1 to AAC Stereo.
- Adds Shaka text-track selection for standalone subtitles and detected embedded captions.
- Generates synchronized transient WebVTT sidecars without forcing H.264 video encoding.
- Keeps bitmap subtitles as explicit burn-in choices when browser rendering is not possible.
- Adds shared source deinterlacing and per-Watch fallback deinterlacing options.
- Supports source-frame-rate and source-field-rate deinterlacing while preserving progressive sources by default.
Browser compatibility testing
- Adds a dedicated Watch Test page at
/watch-test. - Tests DASH and HLS, H.264, HEVC Main/Main 10, multichannel AAC, AC-3, E-AC-3, WebVTT, and subtitle burn-in as independent cases.
- Stores completed, versioned compatibility profiles in browser-local storage.
- Separates browser Media Source claims from observed playback results.
- Preserves the previous completed profile when a test is cancelled or incomplete.
- Invalidates stale or contradicted profiles so compatibility can be measured again.
Authoritative guide and channel storage
- Replaces file-based lineup and guide state with authoritative SQLite-backed storage.
- Persists physical channels and channel enablement preferences.
- Reconciles removed channels and stale future programmes during authoritative guide imports.
- Generates published XMLTV from normalized database records.
- Preserves supplemental root, channel, and programme metadata not represented by Lineup's typed fields.
- Retains XMLTV credits, ratings, languages, countries, alternate episode identifiers, technical details, reviews, images, scheduling attributes, namespaced extensions, and provider-specific attributes.
- Reconstructs XMLTV in canonical DTD order without storing duplicate source programme documents.
- Preserves channel metadata when synthetic Not Available programmes are generated.
Richer guide details
- Adds a typed internal read model for supplemental programme metadata.
- Displays ratings, cast, directors, languages, countries, alternate episode identifiers, and programme status.
- Adds a collapsed More details section for technical, scheduling, review, image, and other less-common metadata.
- Keeps supplemental XML and its derived internal model out of public JSON responses.
Stream lifecycle and diagnostics
- Improves active-stream tracking, source/output codec reporting, bitrate diagnostics, and dashboard stop controls.
- Shares tuner input between probes and stream consumers.
- Tracks physical tuner capacity by device and upstream source.
- Preserves HTTP tuner status when native control requests fail.
- Improves ATSC 3.0 bitrate diagnostics.
- Distinguishes confirmed DRM failures from inferred startup failures.
- Clears stale tune errors and shuts down unavailable sessions cleanly.
- Adds deterministic stream shutdown and stale transient-directory cleanup.
- Improves errors for disabled channels, protected content, exhausted tuners, startup failures, and disconnected clients.
Application data, reset, and notifications
- Introduces explicit application-data and transient-data storage boundaries.
- Stores settings, SQLite data, logs, and data-protection keys beneath the application-data root.
- Stores CMAF fragments and subtitle sidecars beneath the transient-data root.
- Expands Factory Reset to remove all Lineup-managed application and transient data safely.
- Removes Lineup-owned XMLTV output while protecting unrelated external files.
- Preserves managed root directories so a supervisor can restart the application cleanly.
- Adds application-wide success and error notifications.
- Refreshes navigation immediately after initial setup.
- Improves settings validation, directory selection, logging controls, and restart/reset feedback.
Packaging and development builds
- Adds a manually triggered development publication workflow.
- Tests each development revision before publishing.
- Publishes moving
devimages to Docker Hub and GitHub Container Registry plus a traceable per-run Docker tag. - Produces Windows x64 and ARM64 development packages with checksums.
- Creates or updates a moving GitHub Lineup Dev prerelease with traceable source metadata.
- Cancels older in-progress development publications to prevent stale builds from replacing newer ones.
- Supports explicit semantic-version overrides in Docker and Windows package builds.
- Adds a dedicated persistent
/transientvolume to Docker Compose configurations. - Installs and verifies the Jellyfin FFmpeg capabilities required for CMAF, AAC, AC-3, E-AC-3, and AC-4 decoding.
- Moves source-build FFmpeg installation to the repository-root
.ffmpegdirectory.
Breaking changes and upgrade notes
- Channel preferences: Existing file-based lineup preferences are not migrated to the new SQLite-backed lineup store. After upgrading, refresh the channel lineup and verify or reapply channel enablement preferences.
- Transient storage: Docker Compose users receive a new
transientvolume automatically after recreating the service. Other deployments should ensureLineup__TransientPathpoints to a writable location. The default container path is/transient. - Factory Reset: Factory Reset now removes all Lineup-managed application and transient data, rather than only a subset. Review the confirmation carefully before proceeding.
- Pre-release CMAF endpoints: The unreleased
/api/stream/hls/*aliases were removed. Integrations developed against pre-release builds must use the canonical/api/stream/cmaf/*endpoints. - Browser profile: Run Watch Test after upgrading to let Lineup select source-copy and fallback formats using observed browser playback results. Without a completed profile, Watch retains DASH-first and explicitly configured behavior.
- Container deployment: Recreate the container after pulling 2.2.0 so the updated FFmpeg runtime, fonts, environment, and transient volume configuration take effect.
Validation
Validation recorded for the final 2.2.0 merge included:
- Full live Watch sweeps across all available channels.
- Browser codec fallback, synchronization, subtitle, closed-caption, DRM, and cleanup verification.
- Release build completed successfully.
- Full test suite: 647 tests passed.
dotnet format Lineup.slnx --verify-no-changes --no-restorepassed.git diff --checkpassed.
Contributors
Included pull requests
- #3 — Dev Build Pipeline
- #4 — Improve Watch playback and modernize guide storage
- #5 — Leverage CMAF and Shaka for Watch page streaming
Full changelog
Full comparison: v2.1.0...v2.2.0