aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzachhide <66033020+zachhide@users.noreply.github.com>2026-06-30 01:13:51 -0400
committerzachhide <66033020+zachhide@users.noreply.github.com>2026-06-30 01:13:51 -0400
commit8ffb54603adf45975568702ca8a9d69bfe444d75 (patch)
tree2373ad8b704a03f8b10298f109bf7ee51bfa377b
parentd3ee1e84b102177e2c368426e3b5ad1dba589b44 (diff)
Fix NullReferenceException in GetStreamingState for closed live streams
When a client polls the HLS playlist (e.g. live.m3u8) after a live stream has been disposed because its consumer count dropped to zero, GetLiveStreamWithDirectStreamProvider returns a null MediaSource. The live branch of GetStreamingState then dereferenced it unconditionally, throwing a NullReferenceException and returning HTTP 500 for every poll until the client re-opens the stream. Guard against the null MediaSource and throw ResourceNotFoundException so the request returns 404 instead of crashing. Fixes #17009 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-rw-r--r--Jellyfin.Api/Helpers/StreamingHelpers.cs9
1 files changed, 9 insertions, 0 deletions
diff --git a/Jellyfin.Api/Helpers/StreamingHelpers.cs b/Jellyfin.Api/Helpers/StreamingHelpers.cs
index bae2756303..6a6aac1327 100644
--- a/Jellyfin.Api/Helpers/StreamingHelpers.cs
+++ b/Jellyfin.Api/Helpers/StreamingHelpers.cs
@@ -144,6 +144,15 @@ public static class StreamingHelpers
mediaSource = liveStreamInfo.Item1;
state.DirectStreamProvider = liveStreamInfo.Item2;
+ // The requested live stream is no longer open. This commonly happens when a client keeps
+ // polling the HLS playlist (e.g. live.m3u8) after the stream was disposed because its
+ // consumer count dropped to zero. GetLiveStreamWithDirectStreamProvider returns a null
+ // MediaSource in that case, so return 404 instead of dereferencing it below.
+ if (mediaSource is null)
+ {
+ throw new ResourceNotFoundException($"The live stream with id {streamingRequest.LiveStreamId} could not be found or is no longer available.");
+ }
+
// Cap the max bitrate when it is too high. This is usually due to ffmpeg is unable to probe the source liveTV streams' bitrate.
if (mediaSource.FallbackMaxStreamingBitrate is not null && streamingRequest.VideoBitRate is not null)
{