@ -5,7 +5,9 @@
using System ;
using System.Collections.Generic ;
using System.Globalization ;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Net.Http ;
using System.Threading ;
using System.Threading.Tasks ;
@ -38,6 +40,14 @@ namespace Jellyfin.LiveTv.TunerHosts
"video/vnd.mpeg.dash.mpd"
} ;
private static readonly string [ ] _disallowedSharedStreamExtensions =
{
".mkv" ,
".mp4" ,
".m3u8" ,
".mpd"
} ;
private readonly IHttpClientFactory _httpClientFactory ;
private readonly IServerApplicationHost _appHost ;
private readonly INetworkManager _networkManager ;
@ -106,11 +116,26 @@ namespace Jellyfin.LiveTv.TunerHosts
. SendAsync ( message , cancellationToken )
. ConfigureAwait ( false ) ;
response . EnsureSuccessStatusCode ( ) ;
if ( ! _disallowedMimeTypes . Contains ( response . Content . Headers . ContentType ? . ToString ( ) , StringComparison . OrdinalIgnoreCase ) )
if ( response . IsSuccessStatusCode )
{
if ( ! _disallowedMimeTypes . Contains ( response . Content . Headers . ContentType ? . ToString ( ) , StringComparison . OrdinalIgnoreCase ) )
{
return new SharedHttpStream ( mediaSource , tunerHost , streamId , FileSystem , _httpClientFactory , Logger , Config , _appHost , _streamHelper ) ;
}
}
else if ( response . StatusCode = = HttpStatusCode . MethodNotAllowed )
{
// 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 ) )
{
return new SharedHttpStream ( mediaSource , tunerHost , streamId , FileSystem , _httpClientFactory , Logger , Config , _appHost , _streamHelper ) ;
}
}
else
{
return new SharedHttpStream ( mediaSource , tunerHost , streamId , FileSystem , _httpClientFactory , Logger , Config , _appHost , _streamHelper ) ;
response . EnsureSuccessStatusCode ( ) ;
}
}