diff --git a/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs b/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
index 00cfa0c9a9..f67a09daa3 100644
--- a/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
+++ b/Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
@@ -10,6 +10,8 @@ namespace Emby.Server.Implementations.AppBase
///
public abstract class BaseApplicationPaths : IApplicationPaths
{
+ private string _dataPath;
+
///
/// Initializes a new instance of the class.
///
@@ -30,27 +32,27 @@ namespace Emby.Server.Implementations.AppBase
}
///
- /// Gets the path to the program data folder
+ /// Gets the path to the program data folder.
///
/// The program data path.
- public string ProgramDataPath { get; private set; }
+ public string ProgramDataPath { get; }
///
- /// Gets the path to the web UI resources folder
+ /// Gets the path to the web UI resources folder.
///
/// The web UI resources path.
- public string WebPath { get; set; }
+ public string WebPath { get; }
///
- /// Gets the path to the system folder
+ /// Gets the path to the system folder.
///
+ /// The path to the system folder.
public string ProgramSystemPath { get; } = AppContext.BaseDirectory;
///
- /// Gets the folder path to the data directory
+ /// Gets the folder path to the data directory.
///
/// The data directory.
- private string _dataPath;
public string DataPath
{
get => _dataPath;
@@ -58,8 +60,9 @@ namespace Emby.Server.Implementations.AppBase
}
///
- /// Gets the magic strings used for virtual path manipulation.
+ /// Gets the magic string used for virtual path manipulation.
///
+ /// The magic string used for virtual path manipulation.
public string VirtualDataPath { get; } = "%AppDataPath%";
///
@@ -69,43 +72,43 @@ namespace Emby.Server.Implementations.AppBase
public string ImageCachePath => Path.Combine(CachePath, "images");
///
- /// Gets the path to the plugin directory
+ /// Gets the path to the plugin directory.
///
/// The plugins path.
public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
///
- /// Gets the path to the plugin configurations directory
+ /// Gets the path to the plugin configurations directory.
///
/// The plugin configurations path.
public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
///
- /// Gets the path to the log directory
+ /// Gets the path to the log directory.
///
/// The log directory path.
- public string LogDirectoryPath { get; private set; }
+ public string LogDirectoryPath { get; }
///
- /// Gets the path to the application configuration root directory
+ /// Gets the path to the application configuration root directory.
///
/// The configuration directory path.
- public string ConfigurationDirectoryPath { get; private set; }
+ public string ConfigurationDirectoryPath { get; }
///
- /// Gets the path to the system configuration file
+ /// Gets the path to the system configuration file.
///
/// The system configuration file path.
public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
///
- /// Gets the folder path to the cache directory
+ /// Gets or sets the folder path to the cache directory.
///
/// The cache directory.
public string CachePath { get; set; }
///
- /// Gets the folder path to the temp directory within the cache folder
+ /// Gets the folder path to the temp directory within the cache folder.
///
/// The temp directory.
public string TempDirectory => Path.Combine(CachePath, "temp");
diff --git a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
index af60a8dce4..4832c19c4e 100644
--- a/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
+++ b/Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
@@ -19,11 +20,44 @@ namespace Emby.Server.Implementations.AppBase
///
public abstract class BaseConfigurationManager : IConfigurationManager
{
+ private readonly IFileSystem _fileSystem;
+
+ private readonly ConcurrentDictionary _configurations = new ConcurrentDictionary();
+
+ private ConfigurationStore[] _configurationStores = Array.Empty();
+ private IConfigurationFactory[] _configurationFactories = Array.Empty();
+
///
- /// Gets the type of the configuration.
+ /// The _configuration loaded.
///
- /// The type of the configuration.
- protected abstract Type ConfigurationType { get; }
+ private bool _configurationLoaded;
+
+ ///
+ /// The _configuration sync lock.
+ ///
+ private object _configurationSyncLock = new object();
+
+ ///
+ /// The _configuration.
+ ///
+ private BaseApplicationConfiguration _configuration;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The application paths.
+ /// The logger factory.
+ /// The XML serializer.
+ /// The file system
+ protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILoggerFactory loggerFactory, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
+ {
+ CommonApplicationPaths = applicationPaths;
+ XmlSerializer = xmlSerializer;
+ _fileSystem = fileSystem;
+ Logger = loggerFactory.CreateLogger(GetType().Name);
+
+ UpdateCachePath();
+ }
///
/// Occurs when [configuration updated].
@@ -40,6 +74,12 @@ namespace Emby.Server.Implementations.AppBase
///
public event EventHandler NamedConfigurationUpdated;
+ ///
+ /// Gets the type of the configuration.
+ ///
+ /// The type of the configuration.
+ protected abstract Type ConfigurationType { get; }
+
///
/// Gets the logger.
///
@@ -56,20 +96,7 @@ namespace Emby.Server.Implementations.AppBase
///
/// The application paths.
public IApplicationPaths CommonApplicationPaths { get; private set; }
- public readonly IFileSystem FileSystem;
- ///
- /// The _configuration loaded
- ///
- private bool _configurationLoaded;
- ///
- /// The _configuration sync lock
- ///
- private object _configurationSyncLock = new object();
- ///
- /// The _configuration
- ///
- private BaseApplicationConfiguration _configuration;
///
/// Gets the system configuration
///
@@ -90,26 +117,6 @@ namespace Emby.Server.Implementations.AppBase
}
}
- private ConfigurationStore[] _configurationStores = { };
- private IConfigurationFactory[] _configurationFactories = { };
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The application paths.
- /// The logger factory.
- /// The XML serializer.
- /// The file system
- protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILoggerFactory loggerFactory, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
- {
- CommonApplicationPaths = applicationPaths;
- XmlSerializer = xmlSerializer;
- FileSystem = fileSystem;
- Logger = loggerFactory.CreateLogger(GetType().Name);
-
- UpdateCachePath();
- }
-
public virtual void AddParts(IEnumerable factories)
{
_configurationFactories = factories.ToArray();
@@ -171,6 +178,7 @@ namespace Emby.Server.Implementations.AppBase
private void UpdateCachePath()
{
string cachePath;
+
// If the configuration file has no entry (i.e. not set in UI)
if (string.IsNullOrWhiteSpace(CommonConfiguration.CachePath))
{
@@ -207,12 +215,16 @@ namespace Emby.Server.Implementations.AppBase
var newPath = newConfig.CachePath;
if (!string.IsNullOrWhiteSpace(newPath)
- && !string.Equals(CommonConfiguration.CachePath ?? string.Empty, newPath))
+ && !string.Equals(CommonConfiguration.CachePath ?? string.Empty, newPath, StringComparison.Ordinal))
{
// Validate
if (!Directory.Exists(newPath))
{
- throw new FileNotFoundException(string.Format("{0} does not exist.", newPath));
+ throw new FileNotFoundException(
+ string.Format(
+ CultureInfo.InvariantCulture,
+ "{0} does not exist.",
+ newPath));
}
EnsureWriteAccess(newPath);
@@ -223,11 +235,9 @@ namespace Emby.Server.Implementations.AppBase
{
var file = Path.Combine(path, Guid.NewGuid().ToString());
File.WriteAllText(file, string.Empty);
- FileSystem.DeleteFile(file);
+ _fileSystem.DeleteFile(file);
}
- private readonly ConcurrentDictionary _configurations = new ConcurrentDictionary();
-
private string GetConfigurationFile(string key)
{
return Path.Combine(CommonApplicationPaths.ConfigurationDirectoryPath, key.ToLowerInvariant() + ".xml");
diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index f0aa60428b..0493fd9f5a 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -418,7 +418,7 @@ namespace Emby.Server.Implementations
public string ApplicationVersion { get; } = typeof(ApplicationHost).Assembly.GetName().Version.ToString(3);
///
- /// Gets the current application user agent
+ /// Gets the current application user agent.
///
/// The application user agent.
public string ApplicationUserAgent => Name.Replace(' ', '-') + "/" + ApplicationVersion;
@@ -467,8 +467,8 @@ namespace Emby.Server.Implementations
///
/// Creates an instance of type and resolves all constructor dependencies
///
- /// /// The type
- /// T
+ /// /// The type.
+ /// T.
public T CreateInstance()
=> ActivatorUtilities.CreateInstance(_serviceProvider);
diff --git a/Emby.Server.Implementations/ConfigurationOptions.cs b/Emby.Server.Implementations/ConfigurationOptions.cs
index 9bc60972a1..62408ee703 100644
--- a/Emby.Server.Implementations/ConfigurationOptions.cs
+++ b/Emby.Server.Implementations/ConfigurationOptions.cs
@@ -6,8 +6,8 @@ namespace Emby.Server.Implementations
{
public static readonly Dictionary Configuration = new Dictionary
{
- {"HttpListenerHost:DefaultRedirectPath", "web/index.html"},
- {"MusicBrainz:BaseUrl", "https://www.musicbrainz.org"}
+ { "HttpListenerHost:DefaultRedirectPath", "web/index.html" },
+ { "MusicBrainz:BaseUrl", "https://www.musicbrainz.org" }
};
}
}
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index abbaef26b8..f07f8e3bfd 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -44,6 +44,7 @@
netstandard2.0
false
+ true
diff --git a/Emby.Server.Implementations/ServerApplicationPaths.cs b/Emby.Server.Implementations/ServerApplicationPaths.cs
index adaf23234f..2f5a8af802 100644
--- a/Emby.Server.Implementations/ServerApplicationPaths.cs
+++ b/Emby.Server.Implementations/ServerApplicationPaths.cs
@@ -10,8 +10,12 @@ namespace Emby.Server.Implementations
///
public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
{
+ private string _defaultTranscodingTempPath;
+ private string _transcodingTempPath;
+ private string _internalMetadataPath;
+
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
public ServerApplicationPaths(
string programDataPath,
@@ -30,7 +34,7 @@ namespace Emby.Server.Implementations
public string ApplicationResourcesPath { get; } = AppContext.BaseDirectory;
///
- /// Gets the path to the base root media directory
+ /// Gets the path to the base root media directory.
///
/// The root folder path.
public string RootFolderPath => Path.Combine(ProgramDataPath, "root");
@@ -48,7 +52,7 @@ namespace Emby.Server.Implementations
public string LocalizationPath => Path.Combine(ProgramDataPath, "localization");
///
- /// Gets the path to the People directory
+ /// Gets the path to the People directory.
///
/// The people path.
public string PeoplePath => Path.Combine(InternalMetadataPath, "People");
@@ -56,37 +60,37 @@ namespace Emby.Server.Implementations
public string ArtistsPath => Path.Combine(InternalMetadataPath, "artists");
///
- /// Gets the path to the Genre directory
+ /// Gets the path to the Genre directory.
///
/// The genre path.
public string GenrePath => Path.Combine(InternalMetadataPath, "Genre");
///
- /// Gets the path to the Genre directory
+ /// Gets the path to the Genre directory.
///
/// The genre path.
public string MusicGenrePath => Path.Combine(InternalMetadataPath, "MusicGenre");
///
- /// Gets the path to the Studio directory
+ /// Gets the path to the Studio directory.
///
/// The studio path.
public string StudioPath => Path.Combine(InternalMetadataPath, "Studio");
///
- /// Gets the path to the Year directory
+ /// Gets the path to the Year directory.
///
/// The year path.
public string YearPath => Path.Combine(InternalMetadataPath, "Year");
///
- /// Gets the path to the General IBN directory
+ /// Gets the path to the General IBN directory.
///
/// The general path.
public string GeneralPath => Path.Combine(InternalMetadataPath, "general");
///
- /// Gets the path to the Ratings IBN directory
+ /// Gets the path to the Ratings IBN directory.
///
/// The ratings path.
public string RatingsPath => Path.Combine(InternalMetadataPath, "ratings");
@@ -98,15 +102,13 @@ namespace Emby.Server.Implementations
public string MediaInfoImagesPath => Path.Combine(InternalMetadataPath, "mediainfo");
///
- /// Gets the path to the user configuration directory
+ /// Gets the path to the user configuration directory.
///
/// The user configuration directory path.
public string UserConfigurationDirectoryPath => Path.Combine(ConfigurationDirectoryPath, "users");
- private string _defaultTranscodingTempPath;
public string DefaultTranscodingTempPath => _defaultTranscodingTempPath ?? (_defaultTranscodingTempPath = Path.Combine(ProgramDataPath, "transcoding-temp"));
- private string _transcodingTempPath;
public string TranscodingTempPath
{
get => _transcodingTempPath ?? (_transcodingTempPath = DefaultTranscodingTempPath);
@@ -139,7 +141,6 @@ namespace Emby.Server.Implementations
return path;
}
- private string _internalMetadataPath;
public string InternalMetadataPath
{
get => _internalMetadataPath ?? (_internalMetadataPath = Path.Combine(DataPath, "metadata"));