|  | @@ -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();
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 |