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