|  | @@ -210,7 +210,7 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          /// Gets or sets the configuration manager.
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <value>The configuration manager.</value>
 | 
	
		
			
				|  |  | -        protected IConfigurationManager ConfigurationManager { get; set; }
 | 
	
		
			
				|  |  | +        public ServerConfigurationManager ConfigurationManager { get; set; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Gets or sets the service provider.
 | 
	
	
		
			
				|  | @@ -232,12 +232,6 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          public string PublishedServerUrl => _startupOptions.PublishedServerUrl ?? _startupConfig[UdpServer.AddressOverrideConfigKey];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// Gets the server configuration manager.
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        /// <value>The server configuration manager.</value>
 | 
	
		
			
				|  |  | -        public IServerConfigurationManager ServerConfigurationManager => (IServerConfigurationManager)ConfigurationManager;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Initializes a new instance of the <see cref="ApplicationHost"/> class.
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -255,43 +249,26 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |              IFileSystem fileSystem,
 | 
	
		
			
				|  |  |              IServiceCollection serviceCollection)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            _xmlSerializer = new MyXmlSerializer();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            ServiceCollection = serviceCollection;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              ApplicationPaths = applicationPaths;
 | 
	
		
			
				|  |  |              LoggerFactory = loggerFactory;
 | 
	
		
			
				|  |  | -            _fileSystemManager = fileSystem;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            ConfigurationManager = new ServerConfigurationManager(ApplicationPaths, LoggerFactory, _xmlSerializer, _fileSystemManager);
 | 
	
		
			
				|  |  | -            // Have to migrate settings here as migration subsystem not yet initialised.
 | 
	
		
			
				|  |  | -            MigrateNetworkConfiguration();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // Have to pre-register the NetworkConfigurationFactory, as the configuration sub-system is not yet initialised.
 | 
	
		
			
				|  |  | -            ConfigurationManager.RegisterConfiguration<NetworkConfigurationFactory>();
 | 
	
		
			
				|  |  | -            NetManager = new NetworkManager((IServerConfigurationManager)ConfigurationManager, LoggerFactory.CreateLogger<NetworkManager>());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            Logger = LoggerFactory.CreateLogger<ApplicationHost>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              _startupOptions = options;
 | 
	
		
			
				|  |  |              _startupConfig = startupConfig;
 | 
	
		
			
				|  |  | +            _fileSystemManager = fileSystem;
 | 
	
		
			
				|  |  | +            ServiceCollection = serviceCollection;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            // Initialize runtime stat collection
 | 
	
		
			
				|  |  | -            if (ServerConfigurationManager.Configuration.EnableMetrics)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                DotNetRuntimeStatsBuilder.Default().StartCollecting();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            Logger = LoggerFactory.CreateLogger<ApplicationHost>();
 | 
	
		
			
				|  |  |              fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              ApplicationVersion = typeof(ApplicationHost).Assembly.GetName().Version;
 | 
	
		
			
				|  |  |              ApplicationVersionString = ApplicationVersion.ToString(3);
 | 
	
		
			
				|  |  |              ApplicationUserAgent = Name.Replace(' ', '-') + "/" + ApplicationVersionString;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            _xmlSerializer = new MyXmlSerializer();
 | 
	
		
			
				|  |  | +            ConfigurationManager = new ServerConfigurationManager(ApplicationPaths, LoggerFactory, _xmlSerializer, _fileSystemManager);
 | 
	
		
			
				|  |  |              _pluginManager = new PluginManager(
 | 
	
		
			
				|  |  |                  LoggerFactory.CreateLogger<PluginManager>(),
 | 
	
		
			
				|  |  |                  this,
 | 
	
		
			
				|  |  | -                ServerConfigurationManager.Configuration,
 | 
	
		
			
				|  |  | +                ConfigurationManager.Configuration,
 | 
	
		
			
				|  |  |                  ApplicationPaths.PluginsPath,
 | 
	
		
			
				|  |  |                  ApplicationVersion);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -306,9 +283,9 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |              if (!File.Exists(path))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  var networkSettings = new NetworkConfiguration();
 | 
	
		
			
				|  |  | -                ClassMigrationHelper.CopyProperties(ServerConfigurationManager.Configuration, networkSettings);
 | 
	
		
			
				|  |  | +                ClassMigrationHelper.CopyProperties(ConfigurationManager.Configuration, networkSettings);
 | 
	
		
			
				|  |  |                  _xmlSerializer.SerializeToFile(networkSettings, path);
 | 
	
		
			
				|  |  | -                Logger?.LogDebug("Successfully migrated network settings.");
 | 
	
		
			
				|  |  | +                Logger.LogDebug("Successfully migrated network settings.");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -545,7 +522,21 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          /// <inheritdoc/>
 | 
	
		
			
				|  |  |          public void Init()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var networkConfiguration = ServerConfigurationManager.GetNetworkConfiguration();
 | 
	
		
			
				|  |  | +            DiscoverTypes();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            ConfigurationManager.AddParts(GetExports<IConfigurationFactory>());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Have to migrate settings here as migration subsystem not yet initialised.
 | 
	
		
			
				|  |  | +            MigrateNetworkConfiguration();
 | 
	
		
			
				|  |  | +            NetManager = new NetworkManager(ConfigurationManager, LoggerFactory.CreateLogger<NetworkManager>());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Initialize runtime stat collection
 | 
	
		
			
				|  |  | +            if (ConfigurationManager.Configuration.EnableMetrics)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                DotNetRuntimeStatsBuilder.Default().StartCollecting();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var networkConfiguration = ConfigurationManager.GetNetworkConfiguration();
 | 
	
		
			
				|  |  |              HttpPort = networkConfiguration.HttpServerPortNumber;
 | 
	
		
			
				|  |  |              HttpsPort = networkConfiguration.HttpsPortNumber;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -563,8 +554,6 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |              Certificate = GetCertificate(CertificateInfo);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            DiscoverTypes();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              RegisterServices();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              _pluginManager.RegisterServices(ServiceCollection);
 | 
	
	
		
			
				|  | @@ -579,7 +568,8 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              ServiceCollection.AddMemoryCache();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            ServiceCollection.AddSingleton(ConfigurationManager);
 | 
	
		
			
				|  |  | +            ServiceCollection.AddSingleton<IServerConfigurationManager>(ConfigurationManager);
 | 
	
		
			
				|  |  | +            ServiceCollection.AddSingleton<IConfigurationManager>(ConfigurationManager);
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IApplicationHost>(this);
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IPluginManager>(_pluginManager);
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IApplicationPaths>(ApplicationPaths);
 | 
	
	
		
			
				|  | @@ -606,8 +596,6 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IServerApplicationHost>(this);
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IServerApplicationPaths>(ApplicationPaths);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            ServiceCollection.AddSingleton(ServerConfigurationManager);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<ILocalizationManager, LocalizationManager>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              ServiceCollection.AddSingleton<IBlurayExaminer, BdInfoExaminer>();
 | 
	
	
		
			
				|  | @@ -796,7 +784,7 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              // For now there's no real way to inject these properly
 | 
	
		
			
				|  |  |              BaseItem.Logger = Resolve<ILogger<BaseItem>>();
 | 
	
		
			
				|  |  | -            BaseItem.ConfigurationManager = ServerConfigurationManager;
 | 
	
		
			
				|  |  | +            BaseItem.ConfigurationManager = ConfigurationManager;
 | 
	
		
			
				|  |  |              BaseItem.LibraryManager = Resolve<ILibraryManager>();
 | 
	
		
			
				|  |  |              BaseItem.ProviderManager = Resolve<IProviderManager>();
 | 
	
		
			
				|  |  |              BaseItem.LocalizationManager = Resolve<ILocalizationManager>();
 | 
	
	
		
			
				|  | @@ -818,13 +806,12 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          private void FindParts()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (!ServerConfigurationManager.Configuration.IsPortAuthorized)
 | 
	
		
			
				|  |  | +            if (!ConfigurationManager.Configuration.IsPortAuthorized)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                ServerConfigurationManager.Configuration.IsPortAuthorized = true;
 | 
	
		
			
				|  |  | +                ConfigurationManager.Configuration.IsPortAuthorized = true;
 | 
	
		
			
				|  |  |                  ConfigurationManager.SaveConfiguration();
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            ConfigurationManager.AddParts(GetExports<IConfigurationFactory>());
 | 
	
		
			
				|  |  |              _pluginManager.CreatePlugins();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              _urlPrefixes = GetUrlPrefixes().ToArray();
 | 
	
	
		
			
				|  | @@ -928,7 +915,7 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          protected void OnConfigurationUpdated(object sender, EventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var requiresRestart = false;
 | 
	
		
			
				|  |  | -            var networkConfiguration = ServerConfigurationManager.GetNetworkConfiguration();
 | 
	
		
			
				|  |  | +            var networkConfiguration = ConfigurationManager.GetNetworkConfiguration();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Don't do anything if these haven't been set yet
 | 
	
		
			
				|  |  |              if (HttpPort != 0 && HttpsPort != 0)
 | 
	
	
		
			
				|  | @@ -937,10 +924,10 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |                  if (networkConfiguration.HttpServerPortNumber != HttpPort ||
 | 
	
		
			
				|  |  |                      networkConfiguration.HttpsPortNumber != HttpsPort)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    if (ServerConfigurationManager.Configuration.IsPortAuthorized)
 | 
	
		
			
				|  |  | +                    if (ConfigurationManager.Configuration.IsPortAuthorized)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        ServerConfigurationManager.Configuration.IsPortAuthorized = false;
 | 
	
		
			
				|  |  | -                        ServerConfigurationManager.SaveConfiguration();
 | 
	
		
			
				|  |  | +                        ConfigurationManager.Configuration.IsPortAuthorized = false;
 | 
	
		
			
				|  |  | +                        ConfigurationManager.SaveConfiguration();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                          requiresRestart = true;
 | 
	
		
			
				|  |  |                      }
 | 
	
	
		
			
				|  | @@ -1156,7 +1143,7 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <inheritdoc/>
 | 
	
		
			
				|  |  | -        public bool ListenWithHttps => Certificate != null && ServerConfigurationManager.GetNetworkConfiguration().EnableHttps;
 | 
	
		
			
				|  |  | +        public bool ListenWithHttps => Certificate != null && ConfigurationManager.GetNetworkConfiguration().EnableHttps;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <inheritdoc/>
 | 
	
		
			
				|  |  |          public string GetSmartApiUrl(IPAddress ipAddress, int? port = null)
 | 
	
	
		
			
				|  | @@ -1240,14 +1227,14 @@ namespace Emby.Server.Implementations
 | 
	
		
			
				|  |  |                  Scheme = scheme ?? (ListenWithHttps ? Uri.UriSchemeHttps : Uri.UriSchemeHttp),
 | 
	
		
			
				|  |  |                  Host = host,
 | 
	
		
			
				|  |  |                  Port = port ?? (ListenWithHttps ? HttpsPort : HttpPort),
 | 
	
		
			
				|  |  | -                Path = ServerConfigurationManager.GetNetworkConfiguration().BaseUrl
 | 
	
		
			
				|  |  | +                Path = ConfigurationManager.GetNetworkConfiguration().BaseUrl
 | 
	
		
			
				|  |  |              }.ToString().TrimEnd('/');
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public string FriendlyName =>
 | 
	
		
			
				|  |  | -            string.IsNullOrEmpty(ServerConfigurationManager.Configuration.ServerName)
 | 
	
		
			
				|  |  | +            string.IsNullOrEmpty(ConfigurationManager.Configuration.ServerName)
 | 
	
		
			
				|  |  |                  ? Environment.MachineName
 | 
	
		
			
				|  |  | -                : ServerConfigurationManager.Configuration.ServerName;
 | 
	
		
			
				|  |  | +                : ConfigurationManager.Configuration.ServerName;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Shuts down.
 |