Force-close each /stream/{channel_id} response instead of allowing
keep-alive reuse. Jellyfin's SharedHttpStream tuner client was reusing
a pooled keep-alive connection mid-stream from an earlier request and
reading raw MPEG-TS bytes as an HTTP status line, failing with
'Received an invalid status line'.
Also broaden the disconnect exception handling to ConnectionAbortedError
alongside ConnectionResetError.
1.5 KiB
1.5 KiB
Changelog
All notable changes to this project are documented in this file.
[0.1.0] - Unreleased
Added
- Initial implementation: yt-dlp based resolver (merging separate video/audio renditions when YouTube serves a live stream split that way), ffmpeg restreaming, per-channel supervisor worker with proactive URL-expiry refresh and reactive restart-with-backoff, broadcast fan-out to multiple HTTP clients, aiohttp server exposing an M3U playlist and per-channel MPEG-TS streams for Jellyfin Live TV.
- Docker Compose deployment (
Dockerfile,docker-compose.yml) and configuration templates (channels.example.yaml,.env.example). - Unit test suite covering config parsing, URL expiry parsing, ffmpeg argument building, playlist generation, and broadcast fan-out.
Fixed
/stream/{channel_id}now forces the connection closed after each response (Connection: close) instead of allowing keep-alive. Jellyfin's M3U tuner client (SharedHttpStream) was reusing a pooled keep-alive connection still mid-stream from an earlier request and reading raw MPEG-TS bytes as if they were a fresh HTTP response, failing with "Received an invalid status line".- The yt-dlp resolver now correctly classifies which of the two
requested_formatsentries is audio when a live stream is split into separate video-only and audio-only renditions; it previously relied onacodecbeing set, which yt-dlp does not consistently do for audio-only formats, causing every resolve to fail.