Browse Source

Merge pull request #2798 from JustAMan/fix-livetv-again

Make localhost LiveTV restreams always use plain HTTP port

(cherry picked from commit f502c893315ce0f130a22d1a30394218ae3ed511)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
Joshua M. Boniface 5 years ago
parent
commit
a0b053e4a1

+ 9 - 8
Emby.Server.Implementations/ApplicationHost.cs

@@ -1422,7 +1422,7 @@ namespace Emby.Server.Implementations
 
         public bool SupportsHttps => Certificate != null || ServerConfigurationManager.Configuration.IsBehindProxy;
 
-        public async Task<string> GetLocalApiUrl(CancellationToken cancellationToken)
+        public async Task<string> GetLocalApiUrl(CancellationToken cancellationToken, bool forceHttp = false)
         {
             try
             {
@@ -1431,7 +1431,7 @@ namespace Emby.Server.Implementations
 
                 foreach (var address in addresses)
                 {
-                    return GetLocalApiUrl(address);
+                    return GetLocalApiUrl(address, forceHttp);
                 }
 
                 return null;
@@ -1461,7 +1461,7 @@ namespace Emby.Server.Implementations
         }
 
         /// <inheritdoc />
-        public string GetLocalApiUrl(IPAddress ipAddress)
+        public string GetLocalApiUrl(IPAddress ipAddress, bool forceHttp = false)
         {
             if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
             {
@@ -1471,20 +1471,21 @@ namespace Emby.Server.Implementations
                 str.CopyTo(span.Slice(1));
                 span[^1] = ']';
 
-                return GetLocalApiUrl(span);
+                return GetLocalApiUrl(span, forceHttp);
             }
 
-            return GetLocalApiUrl(ipAddress.ToString());
+            return GetLocalApiUrl(ipAddress.ToString(), forceHttp);
         }
 
         /// <inheritdoc />
-        public string GetLocalApiUrl(ReadOnlySpan<char> host)
+        public string GetLocalApiUrl(ReadOnlySpan<char> host, bool forceHttp = false)
         {
             var url = new StringBuilder(64);
-            url.Append(EnableHttps ? "https://" : "http://")
+            bool useHttps = EnableHttps && !forceHttp;
+            url.Append(useHttps ? "https://" : "http://")
                 .Append(host)
                 .Append(':')
-                .Append(EnableHttps ? HttpsPort : HttpPort);
+                .Append(useHttps ? HttpsPort : HttpPort);
 
             string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
             if (baseUrl.Length != 0)

+ 1 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -1063,7 +1063,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             var stream = new MediaSourceInfo
             {
-                EncoderPath = _appHost.GetLocalApiUrl("127.0.0.1") + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
+                EncoderPath = _appHost.GetLocalApiUrl("127.0.0.1", true) + "/LiveTv/LiveRecordings/" + info.Id + "/stream",
                 EncoderProtocol = MediaProtocol.Http,
                 Path = info.Path,
                 Protocol = MediaProtocol.File,

+ 1 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -122,7 +122,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
             //OpenedMediaSource.Path = tempFile;
             //OpenedMediaSource.ReadAtNativeFramerate = true;
 
-            MediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1") + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
+            MediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1", true) + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
             MediaSource.Protocol = MediaProtocol.Http;
             //OpenedMediaSource.SupportsDirectPlay = false;
             //OpenedMediaSource.SupportsDirectStream = true;

+ 1 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs

@@ -107,7 +107,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
             //OpenedMediaSource.Path = tempFile;
             //OpenedMediaSource.ReadAtNativeFramerate = true;
 
-            MediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1") + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
+            MediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1", true) + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
             MediaSource.Protocol = MediaProtocol.Http;
 
             //OpenedMediaSource.Path = TempFilePath;

+ 8 - 2
Jellyfin.Server/Program.cs

@@ -242,9 +242,15 @@ namespace Jellyfin.Server
                         .LocalNetworkAddresses
                         .Select(appHost.NormalizeConfiguredLocalAddress)
                         .Where(i => i != null)
-                        .ToList();
-                    if (addresses.Any())
+                        .ToHashSet();
+                    if (addresses.Any() && !addresses.Contains(IPAddress.Any))
                     {
+                        if (!addresses.Contains(IPAddress.Loopback))
+                        {
+                            // we must listen on loopback for LiveTV to function regardless of the settings
+                            addresses.Add(IPAddress.Loopback);
+                        }
+
                         foreach (var address in addresses)
                         {
                             _logger.LogInformation("Kestrel listening on {IpAddress}", address);

+ 7 - 3
MediaBrowser.Controller/IServerApplicationHost.cs

@@ -65,22 +65,26 @@ namespace MediaBrowser.Controller
         /// <summary>
         /// Gets the local API URL.
         /// </summary>
+        /// <param name="cancellationToken">Token to cancel the request if needed.</param>
+        /// <param name="forceHttp">Whether to force usage of plain HTTP protocol.</param>
         /// <value>The local API URL.</value>
-        Task<string> GetLocalApiUrl(CancellationToken cancellationToken);
+        Task<string> GetLocalApiUrl(CancellationToken cancellationToken, bool forceHttp = false);
 
         /// <summary>
         /// Gets the local API URL.
         /// </summary>
         /// <param name="hostname">The hostname.</param>
+        /// <param name="forceHttp">Whether to force usage of plain HTTP protocol.</param>
         /// <returns>The local API URL.</returns>
-        string GetLocalApiUrl(ReadOnlySpan<char> hostname);
+        string GetLocalApiUrl(ReadOnlySpan<char> hostname, bool forceHttp = false);
 
         /// <summary>
         /// Gets the local API URL.
         /// </summary>
         /// <param name="address">The IP address.</param>
+        /// <param name="forceHttp">Whether to force usage of plain HTTP protocol.</param>
         /// <returns>The local API URL.</returns>
-        string GetLocalApiUrl(IPAddress address);
+        string GetLocalApiUrl(IPAddress address, bool forceHttp = false);
 
         void LaunchUrl(string url);