Use SharedStream for LiveTV more restrictively (#11805)
This commit is contained in:
parent
5e7514243c
commit
ef985896e2
|
@ -30,25 +30,8 @@ namespace Jellyfin.LiveTv.TunerHosts
|
|||
{
|
||||
public class M3UTunerHost : BaseTunerHost, ITunerHost, IConfigurableTunerHost
|
||||
{
|
||||
private static readonly string[] _disallowedMimeTypes =
|
||||
{
|
||||
"text/plain",
|
||||
"text/html",
|
||||
"video/x-matroska",
|
||||
"video/mp4",
|
||||
"application/vnd.apple.mpegurl",
|
||||
"application/mpegurl",
|
||||
"application/x-mpegurl",
|
||||
"video/vnd.mpeg.dash.mpd"
|
||||
};
|
||||
|
||||
private static readonly string[] _disallowedSharedStreamExtensions =
|
||||
{
|
||||
".mkv",
|
||||
".mp4",
|
||||
".m3u8",
|
||||
".mpd"
|
||||
};
|
||||
private static readonly string[] _mimeTypesCanShareHttpStream = ["video/MP2T"];
|
||||
private static readonly string[] _extensionsCanShareHttpStream = [".ts", ".tsv", ".m2t"];
|
||||
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
|
@ -112,6 +95,12 @@ namespace Jellyfin.LiveTv.TunerHosts
|
|||
var mediaSource = sources[0];
|
||||
|
||||
if (mediaSource.Protocol == MediaProtocol.Http && !mediaSource.RequiresLooping)
|
||||
{
|
||||
var extension = Path.GetExtension(new UriBuilder(mediaSource.Path).Path);
|
||||
|
||||
if (string.IsNullOrEmpty(extension))
|
||||
{
|
||||
try
|
||||
{
|
||||
using var message = new HttpRequestMessage(HttpMethod.Head, mediaSource.Path);
|
||||
using var response = await _httpClientFactory.CreateClient(NamedClient.Default)
|
||||
|
@ -120,22 +109,22 @@ namespace Jellyfin.LiveTv.TunerHosts
|
|||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
if (!_disallowedMimeTypes.Contains(response.Content.Headers.ContentType?.MediaType, StringComparison.OrdinalIgnoreCase))
|
||||
if (_mimeTypesCanShareHttpStream.Contains(response.Content.Headers.ContentType?.MediaType, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new SharedHttpStream(mediaSource, tunerHost, streamId, FileSystem, _httpClientFactory, Logger, Config, _appHost, _streamHelper);
|
||||
}
|
||||
}
|
||||
else
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// Fallback to check path extension when the server does not support HEAD method
|
||||
// Use UriBuilder to remove all query string as GetExtension will include them when used directly
|
||||
var extension = Path.GetExtension(new UriBuilder(mediaSource.Path).Path);
|
||||
if (!_disallowedSharedStreamExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
|
||||
Logger.LogWarning("HEAD request to check MIME type failed, shared stream disabled");
|
||||
}
|
||||
}
|
||||
else if (_extensionsCanShareHttpStream.Contains(extension, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new SharedHttpStream(mediaSource, tunerHost, streamId, FileSystem, _httpClientFactory, Logger, Config, _appHost, _streamHelper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new LiveStream(mediaSource, tunerHost, FileSystem, Logger, Config, _streamHelper);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user