Bladeren bron

Merge pull request #5315 from BaronGreenback/FixFor5280Part2

(cherry picked from commit 3c46f10e3d120dd76f5d3455dae710a900d68bc1)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
Joshua M. Boniface 4 jaren geleden
bovenliggende
commit
b01290013e

+ 1 - 1
Emby.Dlna/Main/DlnaEntryPoint.cs

@@ -316,7 +316,7 @@ namespace Emby.Dlna.Main
                 _logger.LogInformation("Registering publisher for {0} on {1}", fullService, address);
 
                 var uri = new UriBuilder(_appHost.GetSmartApiUrl(address.Address) + descriptorUri);
-                if (_appHost.PublishedServerUrl == null)
+                if (!string.IsNullOrEmpty(_appHost.PublishedServerUrl))
                 {
                     // DLNA will only work over http, so we must reset to http:// : {port}.
                     uri.Scheme = "http";

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

@@ -43,6 +43,7 @@ using Emby.Server.Implementations.Serialization;
 using Emby.Server.Implementations.Session;
 using Emby.Server.Implementations.SyncPlay;
 using Emby.Server.Implementations.TV;
+using Emby.Server.Implementations.Udp;
 using Emby.Server.Implementations.Updates;
 using Jellyfin.Api.Helpers;
 using Jellyfin.Networking.Configuration;
@@ -98,6 +99,7 @@ using MediaBrowser.Providers.Subtitles;
 using MediaBrowser.XbmcMetadata.Providers;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Prometheus.DotNetRuntime;
@@ -117,6 +119,7 @@ namespace Emby.Server.Implementations
         private static readonly string[] _relevantEnvVarPrefixes = { "JELLYFIN_", "DOTNET_", "ASPNETCORE_" };
 
         private readonly IFileSystem _fileSystemManager;
+        private readonly IConfiguration _startupConfig;
         private readonly IXmlSerializer _xmlSerializer;
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IStartupOptions _startupOptions;
@@ -134,9 +137,6 @@ namespace Emby.Server.Implementations
 
         public bool CoreStartupHasCompleted { get; private set; }
 
-        /// <inheritdoc />
-        public Uri PublishedServerUrl => _startupOptions.PublishedServerUrl;
-
         public virtual bool CanLaunchWebBrowser
         {
             get
@@ -230,6 +230,11 @@ namespace Emby.Server.Implementations
         /// </summary>
         public int HttpsPort { get; private set; }
 
+        /// <summary>
+        /// Gets the value of the PublishedServerUrl setting.
+        /// </summary>
+        public string PublishedServerUrl => _startupOptions.PublishedServerUrl ?? _startupConfig[UdpServer.AddressOverrideConfigKey];
+
         /// <summary>
         /// Gets the server configuration manager.
         /// </summary>
@@ -242,12 +247,14 @@ namespace Emby.Server.Implementations
         /// <param name="applicationPaths">Instance of the <see cref="IServerApplicationPaths"/> interface.</param>
         /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
         /// <param name="options">Instance of the <see cref="IStartupOptions"/> interface.</param>
+        /// <param name="startupConfig">The <see cref="IConfiguration" /> interface.</param>
         /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
         /// <param name="serviceCollection">Instance of the <see cref="IServiceCollection"/> interface.</param>
         public ApplicationHost(
             IServerApplicationPaths applicationPaths,
             ILoggerFactory loggerFactory,
             IStartupOptions options,
+            IConfiguration startupConfig,
             IFileSystem fileSystem,
             IServiceCollection serviceCollection)
         {
@@ -271,6 +278,7 @@ namespace Emby.Server.Implementations
             Logger = LoggerFactory.CreateLogger<ApplicationHost>();
 
             _startupOptions = options;
+            _startupConfig = startupConfig;
 
             // Initialize runtime stat collection
             if (ServerConfigurationManager.Configuration.EnableMetrics)
@@ -1151,10 +1159,10 @@ namespace Emby.Server.Implementations
         public string GetSmartApiUrl(IPAddress ipAddress, int? port = null)
         {
             // Published server ends with a /
-            if (_startupOptions.PublishedServerUrl != null)
+            if (!string.IsNullOrEmpty(PublishedServerUrl))
             {
                 // Published server ends with a '/', so we need to remove it.
-                return _startupOptions.PublishedServerUrl.ToString().Trim('/');
+                return PublishedServerUrl.Trim('/');
             }
 
             string smart = NetManager.GetBindInterface(ipAddress, out port);
@@ -1171,10 +1179,10 @@ namespace Emby.Server.Implementations
         public string GetSmartApiUrl(HttpRequest request, int? port = null)
         {
             // Published server ends with a /
-            if (_startupOptions.PublishedServerUrl != null)
+            if (!string.IsNullOrEmpty(PublishedServerUrl))
             {
                 // Published server ends with a '/', so we need to remove it.
-                return _startupOptions.PublishedServerUrl.ToString().Trim('/');
+                return PublishedServerUrl.Trim('/');
             }
 
             string smart = NetManager.GetBindInterface(request, out port);
@@ -1191,10 +1199,10 @@ namespace Emby.Server.Implementations
         public string GetSmartApiUrl(string hostname, int? port = null)
         {
             // Published server ends with a /
-            if (_startupOptions.PublishedServerUrl != null)
+            if (!string.IsNullOrEmpty(PublishedServerUrl))
             {
                 // Published server ends with a '/', so we need to remove it.
-                return _startupOptions.PublishedServerUrl.ToString().Trim('/');
+                return PublishedServerUrl.Trim('/');
             }
 
             string smart = NetManager.GetBindInterface(hostname, out port);

+ 6 - 6
Emby.Server.Implementations/IStartupOptions.cs

@@ -1,5 +1,5 @@
 #pragma warning disable CS1591
-
+#nullable enable
 using System;
 
 namespace Emby.Server.Implementations
@@ -9,7 +9,7 @@ namespace Emby.Server.Implementations
         /// <summary>
         /// Gets the value of the --ffmpeg command line option.
         /// </summary>
-        string FFmpegPath { get; }
+        string? FFmpegPath { get; }
 
         /// <summary>
         /// Gets the value of the --service command line option.
@@ -19,21 +19,21 @@ namespace Emby.Server.Implementations
         /// <summary>
         /// Gets the value of the --package-name command line option.
         /// </summary>
-        string PackageName { get; }
+        string? PackageName { get; }
 
         /// <summary>
         /// Gets the value of the --restartpath command line option.
         /// </summary>
-        string RestartPath { get; }
+        string? RestartPath { get; }
 
         /// <summary>
         /// Gets the value of the --restartargs command line option.
         /// </summary>
-        string RestartArgs { get; }
+        string? RestartArgs { get; }
 
         /// <summary>
         /// Gets the value of the --published-server-url command line option.
         /// </summary>
-        Uri PublishedServerUrl { get; }
+        string? PublishedServerUrl { get; }
     }
 }

+ 4 - 0
Jellyfin.Server/CoreAppHost.cs

@@ -21,6 +21,7 @@ using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.IO;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 
@@ -37,18 +38,21 @@ namespace Jellyfin.Server
         /// <param name="applicationPaths">The <see cref="ServerApplicationPaths" /> to be used by the <see cref="CoreAppHost" />.</param>
         /// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
         /// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="startupConfig">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
         /// <param name="fileSystem">The <see cref="IFileSystem" /> to be used by the <see cref="CoreAppHost" />.</param>
         /// <param name="collection">The <see cref="IServiceCollection"/> to be used by the <see cref="CoreAppHost"/>.</param>
         public CoreAppHost(
             IServerApplicationPaths applicationPaths,
             ILoggerFactory loggerFactory,
             IStartupOptions options,
+            IConfiguration startupConfig,
             IFileSystem fileSystem,
             IServiceCollection collection)
             : base(
                 applicationPaths,
                 loggerFactory,
                 options,
+                startupConfig,
                 fileSystem,
                 collection)
         {

+ 1 - 0
Jellyfin.Server/Program.cs

@@ -164,6 +164,7 @@ namespace Jellyfin.Server
                 appPaths,
                 _loggerFactory,
                 options,
+                startupConfig,
                 new ManagedFileSystem(_loggerFactory.CreateLogger<ManagedFileSystem>(), appPaths),
                 serviceCollection);
 

+ 2 - 2
Jellyfin.Server/StartupOptions.cs

@@ -77,7 +77,7 @@ namespace Jellyfin.Server
 
         /// <inheritdoc />
         [Option("published-server-url", Required = false, HelpText = "Jellyfin Server URL to publish via auto discover process")]
-        public Uri? PublishedServerUrl { get; set; }
+        public string? PublishedServerUrl { get; set; }
 
         /// <summary>
         /// Gets the command line options as a dictionary that can be used in the .NET configuration system.
@@ -94,7 +94,7 @@ namespace Jellyfin.Server
 
             if (PublishedServerUrl != null)
             {
-                config.Add(UdpServer.AddressOverrideConfigKey, PublishedServerUrl.ToString());
+                config.Add(UdpServer.AddressOverrideConfigKey, PublishedServerUrl);
             }
 
             if (FFmpegPath != null)

+ 1 - 1
MediaBrowser.Controller/IServerApplicationHost.cs

@@ -55,7 +55,7 @@ namespace MediaBrowser.Controller
         /// <summary>
         /// Gets the configured published server url.
         /// </summary>
-        Uri PublishedServerUrl { get; }
+        string PublishedServerUrl { get; }
 
         /// <summary>
         /// Gets the system info.

+ 2 - 0
tests/Jellyfin.Api.Tests/JellyfinApplicationFactory.cs

@@ -8,6 +8,7 @@ using MediaBrowser.Common;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc.Testing;
 using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Serilog;
@@ -77,6 +78,7 @@ namespace Jellyfin.Api.Tests
                 appPaths,
                 loggerFactory,
                 commandLineOpts,
+                new ConfigurationBuilder().Build(),
                 new ManagedFileSystem(loggerFactory.CreateLogger<ManagedFileSystem>(), appPaths),
                 serviceCollection);
             _disposableComponents.Add(appHost);

+ 55 - 0
tests/Jellyfin.Api.Tests/TestAppHost.cs

@@ -0,0 +1,55 @@
+using System.Collections.Generic;
+using System.Reflection;
+using Emby.Server.Implementations;
+using Jellyfin.Server;
+using MediaBrowser.Controller;
+using MediaBrowser.Model.IO;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.Api.Tests
+{
+    /// <summary>
+    /// Implementation of the abstract <see cref="ApplicationHost" /> class.
+    /// </summary>
+    public class TestAppHost : CoreAppHost
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestAppHost" /> class.
+        /// </summary>
+        /// <param name="applicationPaths">The <see cref="ServerApplicationPaths" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="startup">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="fileSystem">The <see cref="IFileSystem" /> to be used by the <see cref="CoreAppHost" />.</param>
+        /// <param name="collection">The <see cref="IServiceCollection"/> to be used by the <see cref="CoreAppHost"/>.</param>
+        public TestAppHost(
+            IServerApplicationPaths applicationPaths,
+            ILoggerFactory loggerFactory,
+            IStartupOptions options,
+            IConfiguration startup,
+            IFileSystem fileSystem,
+            IServiceCollection collection)
+            : base(
+                applicationPaths,
+                loggerFactory,
+                options,
+                startup,
+                fileSystem,
+                collection)
+        {
+        }
+
+        /// <inheritdoc />
+        protected override IEnumerable<Assembly> GetAssembliesWithPartsInternal()
+        {
+            foreach (var a in base.GetAssembliesWithPartsInternal())
+            {
+                yield return a;
+            }
+
+            yield return typeof(TestPlugin).Assembly;
+        }
+    }
+}