commit
5c366e4697
|
@ -10,6 +10,8 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class BaseApplicationPaths : IApplicationPaths
|
public abstract class BaseApplicationPaths : IApplicationPaths
|
||||||
{
|
{
|
||||||
|
private string _dataPath;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="BaseApplicationPaths"/> class.
|
/// Initializes a new instance of the <see cref="BaseApplicationPaths"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -30,27 +32,27 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the program data folder
|
/// Gets the path to the program data folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The program data path.</value>
|
/// <value>The program data path.</value>
|
||||||
public string ProgramDataPath { get; private set; }
|
public string ProgramDataPath { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the web UI resources folder
|
/// Gets the path to the web UI resources folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The web UI resources path.</value>
|
/// <value>The web UI resources path.</value>
|
||||||
public string WebPath { get; set; }
|
public string WebPath { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the system folder
|
/// Gets the path to the system folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <value>The path to the system folder.</value>
|
||||||
public string ProgramSystemPath { get; } = AppContext.BaseDirectory;
|
public string ProgramSystemPath { get; } = AppContext.BaseDirectory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the folder path to the data directory
|
/// Gets the folder path to the data directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The data directory.</value>
|
/// <value>The data directory.</value>
|
||||||
private string _dataPath;
|
|
||||||
public string DataPath
|
public string DataPath
|
||||||
{
|
{
|
||||||
get => _dataPath;
|
get => _dataPath;
|
||||||
|
@ -58,8 +60,9 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the magic strings used for virtual path manipulation.
|
/// Gets the magic string used for virtual path manipulation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <value>The magic string used for virtual path manipulation.</value>
|
||||||
public string VirtualDataPath { get; } = "%AppDataPath%";
|
public string VirtualDataPath { get; } = "%AppDataPath%";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -69,43 +72,43 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
public string ImageCachePath => Path.Combine(CachePath, "images");
|
public string ImageCachePath => Path.Combine(CachePath, "images");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the plugin directory
|
/// Gets the path to the plugin directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The plugins path.</value>
|
/// <value>The plugins path.</value>
|
||||||
public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
|
public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the plugin configurations directory
|
/// Gets the path to the plugin configurations directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The plugin configurations path.</value>
|
/// <value>The plugin configurations path.</value>
|
||||||
public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
|
public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the log directory
|
/// Gets the path to the log directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The log directory path.</value>
|
/// <value>The log directory path.</value>
|
||||||
public string LogDirectoryPath { get; private set; }
|
public string LogDirectoryPath { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the application configuration root directory
|
/// Gets the path to the application configuration root directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The configuration directory path.</value>
|
/// <value>The configuration directory path.</value>
|
||||||
public string ConfigurationDirectoryPath { get; private set; }
|
public string ConfigurationDirectoryPath { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the system configuration file
|
/// Gets the path to the system configuration file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The system configuration file path.</value>
|
/// <value>The system configuration file path.</value>
|
||||||
public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
|
public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the folder path to the cache directory
|
/// Gets or sets the folder path to the cache directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The cache directory.</value>
|
/// <value>The cache directory.</value>
|
||||||
public string CachePath { get; set; }
|
public string CachePath { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the folder path to the temp directory within the cache folder
|
/// Gets the folder path to the temp directory within the cache folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The temp directory.</value>
|
/// <value>The temp directory.</value>
|
||||||
public string TempDirectory => Path.Combine(CachePath, "temp");
|
public string TempDirectory => Path.Combine(CachePath, "temp");
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
@ -19,11 +20,44 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class BaseConfigurationManager : IConfigurationManager
|
public abstract class BaseConfigurationManager : IConfigurationManager
|
||||||
{
|
{
|
||||||
|
private readonly IFileSystem _fileSystem;
|
||||||
|
|
||||||
|
private readonly ConcurrentDictionary<string, object> _configurations = new ConcurrentDictionary<string, object>();
|
||||||
|
|
||||||
|
private ConfigurationStore[] _configurationStores = Array.Empty<ConfigurationStore>();
|
||||||
|
private IConfigurationFactory[] _configurationFactories = Array.Empty<IConfigurationFactory>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the type of the configuration.
|
/// The _configuration loaded.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The type of the configuration.</value>
|
private bool _configurationLoaded;
|
||||||
protected abstract Type ConfigurationType { get; }
|
|
||||||
|
/// <summary>
|
||||||
|
/// The _configuration sync lock.
|
||||||
|
/// </summary>
|
||||||
|
private object _configurationSyncLock = new object();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The _configuration.
|
||||||
|
/// </summary>
|
||||||
|
private BaseApplicationConfiguration _configuration;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="BaseConfigurationManager" /> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="applicationPaths">The application paths.</param>
|
||||||
|
/// <param name="loggerFactory">The logger factory.</param>
|
||||||
|
/// <param name="xmlSerializer">The XML serializer.</param>
|
||||||
|
/// <param name="fileSystem">The file system</param>
|
||||||
|
protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILoggerFactory loggerFactory, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
|
||||||
|
{
|
||||||
|
CommonApplicationPaths = applicationPaths;
|
||||||
|
XmlSerializer = xmlSerializer;
|
||||||
|
_fileSystem = fileSystem;
|
||||||
|
Logger = loggerFactory.CreateLogger(GetType().Name);
|
||||||
|
|
||||||
|
UpdateCachePath();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs when [configuration updated].
|
/// Occurs when [configuration updated].
|
||||||
|
@ -40,6 +74,12 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<ConfigurationUpdateEventArgs> NamedConfigurationUpdated;
|
public event EventHandler<ConfigurationUpdateEventArgs> NamedConfigurationUpdated;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the type of the configuration.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The type of the configuration.</value>
|
||||||
|
protected abstract Type ConfigurationType { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the logger.
|
/// Gets the logger.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -56,20 +96,7 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The application paths.</value>
|
/// <value>The application paths.</value>
|
||||||
public IApplicationPaths CommonApplicationPaths { get; private set; }
|
public IApplicationPaths CommonApplicationPaths { get; private set; }
|
||||||
public readonly IFileSystem FileSystem;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The _configuration loaded
|
|
||||||
/// </summary>
|
|
||||||
private bool _configurationLoaded;
|
|
||||||
/// <summary>
|
|
||||||
/// The _configuration sync lock
|
|
||||||
/// </summary>
|
|
||||||
private object _configurationSyncLock = new object();
|
|
||||||
/// <summary>
|
|
||||||
/// The _configuration
|
|
||||||
/// </summary>
|
|
||||||
private BaseApplicationConfiguration _configuration;
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the system configuration
|
/// Gets the system configuration
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -90,26 +117,6 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConfigurationStore[] _configurationStores = { };
|
|
||||||
private IConfigurationFactory[] _configurationFactories = { };
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="BaseConfigurationManager" /> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="applicationPaths">The application paths.</param>
|
|
||||||
/// <param name="loggerFactory">The logger factory.</param>
|
|
||||||
/// <param name="xmlSerializer">The XML serializer.</param>
|
|
||||||
/// <param name="fileSystem">The file system</param>
|
|
||||||
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<IConfigurationFactory> factories)
|
public virtual void AddParts(IEnumerable<IConfigurationFactory> factories)
|
||||||
{
|
{
|
||||||
_configurationFactories = factories.ToArray();
|
_configurationFactories = factories.ToArray();
|
||||||
|
@ -171,6 +178,7 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
private void UpdateCachePath()
|
private void UpdateCachePath()
|
||||||
{
|
{
|
||||||
string cachePath;
|
string cachePath;
|
||||||
|
|
||||||
// If the configuration file has no entry (i.e. not set in UI)
|
// If the configuration file has no entry (i.e. not set in UI)
|
||||||
if (string.IsNullOrWhiteSpace(CommonConfiguration.CachePath))
|
if (string.IsNullOrWhiteSpace(CommonConfiguration.CachePath))
|
||||||
{
|
{
|
||||||
|
@ -207,12 +215,16 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
var newPath = newConfig.CachePath;
|
var newPath = newConfig.CachePath;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(newPath)
|
if (!string.IsNullOrWhiteSpace(newPath)
|
||||||
&& !string.Equals(CommonConfiguration.CachePath ?? string.Empty, newPath))
|
&& !string.Equals(CommonConfiguration.CachePath ?? string.Empty, newPath, StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
// Validate
|
// Validate
|
||||||
if (!Directory.Exists(newPath))
|
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);
|
EnsureWriteAccess(newPath);
|
||||||
|
@ -223,11 +235,9 @@ namespace Emby.Server.Implementations.AppBase
|
||||||
{
|
{
|
||||||
var file = Path.Combine(path, Guid.NewGuid().ToString());
|
var file = Path.Combine(path, Guid.NewGuid().ToString());
|
||||||
File.WriteAllText(file, string.Empty);
|
File.WriteAllText(file, string.Empty);
|
||||||
FileSystem.DeleteFile(file);
|
_fileSystem.DeleteFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<string, object> _configurations = new ConcurrentDictionary<string, object>();
|
|
||||||
|
|
||||||
private string GetConfigurationFile(string key)
|
private string GetConfigurationFile(string key)
|
||||||
{
|
{
|
||||||
return Path.Combine(CommonApplicationPaths.ConfigurationDirectoryPath, key.ToLowerInvariant() + ".xml");
|
return Path.Combine(CommonApplicationPaths.ConfigurationDirectoryPath, key.ToLowerInvariant() + ".xml");
|
||||||
|
|
|
@ -108,9 +108,9 @@ using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Http.Extensions;
|
using Microsoft.AspNetCore.Http.Extensions;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using ServiceStack;
|
using ServiceStack;
|
||||||
using OperatingSystem = MediaBrowser.Common.System.OperatingSystem;
|
using OperatingSystem = MediaBrowser.Common.System.OperatingSystem;
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ namespace Emby.Server.Implementations
|
||||||
|
|
||||||
fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
|
fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
|
||||||
|
|
||||||
NetworkManager.NetworkChanged += NetworkManager_NetworkChanged;
|
NetworkManager.NetworkChanged += OnNetworkChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ExpandVirtualPath(string path)
|
public string ExpandVirtualPath(string path)
|
||||||
|
@ -410,7 +410,7 @@ namespace Emby.Server.Implementations
|
||||||
return ServerConfigurationManager.Configuration.LocalNetworkSubnets;
|
return ServerConfigurationManager.Configuration.LocalNetworkSubnets;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void NetworkManager_NetworkChanged(object sender, EventArgs e)
|
private void OnNetworkChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
_validAddressResults.Clear();
|
_validAddressResults.Clear();
|
||||||
}
|
}
|
||||||
|
@ -418,10 +418,10 @@ namespace Emby.Server.Implementations
|
||||||
public string ApplicationVersion { get; } = typeof(ApplicationHost).Assembly.GetName().Version.ToString(3);
|
public string ApplicationVersion { get; } = typeof(ApplicationHost).Assembly.GetName().Version.ToString(3);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the current application user agent
|
/// Gets the current application user agent.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The application user agent.</value>
|
/// <value>The application user agent.</value>
|
||||||
public string ApplicationUserAgent => Name.Replace(' ','-') + '/' + ApplicationVersion;
|
public string ApplicationUserAgent => Name.Replace(' ', '-') + "/" + ApplicationVersion;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the email address for use within a comment section of a user agent field.
|
/// Gets the email address for use within a comment section of a user agent field.
|
||||||
|
@ -429,14 +429,11 @@ namespace Emby.Server.Implementations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ApplicationUserAgentAddress { get; } = "team@jellyfin.org";
|
public string ApplicationUserAgentAddress { get; } = "team@jellyfin.org";
|
||||||
|
|
||||||
private string _productName;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the current application name
|
/// Gets the current application name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The application name.</value>
|
/// <value>The application name.</value>
|
||||||
public string ApplicationProductName
|
public string ApplicationProductName { get; } = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location).ProductName;
|
||||||
=> _productName ?? (_productName = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location).ProductName);
|
|
||||||
|
|
||||||
private DeviceId _deviceId;
|
private DeviceId _deviceId;
|
||||||
|
|
||||||
|
@ -470,8 +467,8 @@ namespace Emby.Server.Implementations
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates an instance of type and resolves all constructor dependencies
|
/// Creates an instance of type and resolves all constructor dependencies
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// /// <typeparam name="T">The type</typeparam>
|
/// /// <typeparam name="T">The type.</typeparam>
|
||||||
/// <returns>T</returns>
|
/// <returns>T.</returns>
|
||||||
public T CreateInstance<T>()
|
public T CreateInstance<T>()
|
||||||
=> ActivatorUtilities.CreateInstance<T>(_serviceProvider);
|
=> ActivatorUtilities.CreateInstance<T>(_serviceProvider);
|
||||||
|
|
||||||
|
@ -604,10 +601,15 @@ namespace Emby.Server.Implementations
|
||||||
|
|
||||||
foreach (var plugin in Plugins)
|
foreach (var plugin in Plugins)
|
||||||
{
|
{
|
||||||
pluginBuilder.AppendLine(string.Format("{0} {1}", plugin.Name, plugin.Version));
|
pluginBuilder.AppendLine(
|
||||||
|
string.Format(
|
||||||
|
CultureInfo.InvariantCulture,
|
||||||
|
"{0} {1}",
|
||||||
|
plugin.Name,
|
||||||
|
plugin.Version));
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.LogInformation("Plugins: {plugins}", pluginBuilder.ToString());
|
Logger.LogInformation("Plugins: {Plugins}", pluginBuilder.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
DiscoverTypes();
|
DiscoverTypes();
|
||||||
|
@ -629,7 +631,7 @@ namespace Emby.Server.Implementations
|
||||||
|
|
||||||
if (EnableHttps && Certificate != null)
|
if (EnableHttps && Certificate != null)
|
||||||
{
|
{
|
||||||
options.ListenAnyIP(HttpsPort, listenOptions => { listenOptions.UseHttps(Certificate); });
|
options.ListenAnyIP(HttpsPort, listenOptions => listenOptions.UseHttps(Certificate));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.UseContentRoot(contentRoot)
|
.UseContentRoot(contentRoot)
|
||||||
|
@ -643,6 +645,7 @@ namespace Emby.Server.Implementations
|
||||||
app.UseWebSockets();
|
app.UseWebSockets();
|
||||||
|
|
||||||
app.UseResponseCompression();
|
app.UseResponseCompression();
|
||||||
|
|
||||||
// TODO app.UseMiddleware<WebSocketMiddleware>();
|
// TODO app.UseMiddleware<WebSocketMiddleware>();
|
||||||
app.Use(ExecuteWebsocketHandlerAsync);
|
app.Use(ExecuteWebsocketHandlerAsync);
|
||||||
app.Use(ExecuteHttpHandlerAsync);
|
app.Use(ExecuteHttpHandlerAsync);
|
||||||
|
@ -1044,8 +1047,8 @@ namespace Emby.Server.Implementations
|
||||||
.Cast<IServerEntryPoint>()
|
.Cast<IServerEntryPoint>()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
await Task.WhenAll(StartEntryPoints(entries, true));
|
await Task.WhenAll(StartEntryPoints(entries, true)).ConfigureAwait(false);
|
||||||
await Task.WhenAll(StartEntryPoints(entries, false));
|
await Task.WhenAll(StartEntryPoints(entries, false)).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1458,15 +1461,10 @@ namespace Emby.Server.Implementations
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public WakeOnLanInfo[] GetWakeOnLanInfo()
|
public IEnumerable<WakeOnLanInfo> GetWakeOnLanInfo()
|
||||||
{
|
=> NetworkManager.GetMacAddresses()
|
||||||
return NetworkManager.GetMacAddresses()
|
.Select(i => new WakeOnLanInfo(i))
|
||||||
.Select(i => new WakeOnLanInfo
|
.ToList();
|
||||||
{
|
|
||||||
MacAddress = i
|
|
||||||
})
|
|
||||||
.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<PublicSystemInfo> GetPublicSystemInfo(CancellationToken cancellationToken)
|
public async Task<PublicSystemInfo> GetPublicSystemInfo(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
@ -1482,6 +1480,7 @@ namespace Emby.Server.Implementations
|
||||||
{
|
{
|
||||||
wanAddress = GetWanApiUrl(ServerConfigurationManager.Configuration.WanDdns);
|
wanAddress = GetWanApiUrl(ServerConfigurationManager.Configuration.WanDdns);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new PublicSystemInfo
|
return new PublicSystemInfo
|
||||||
{
|
{
|
||||||
Version = ApplicationVersion,
|
Version = ApplicationVersion,
|
||||||
|
|
|
@ -6,8 +6,8 @@ namespace Emby.Server.Implementations
|
||||||
{
|
{
|
||||||
public static readonly Dictionary<string, string> Configuration = new Dictionary<string, string>
|
public static readonly Dictionary<string, string> Configuration = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{"HttpListenerHost:DefaultRedirectPath", "web/index.html"},
|
{ "HttpListenerHost:DefaultRedirectPath", "web/index.html" },
|
||||||
{"MusicBrainz:BaseUrl", "https://www.musicbrainz.org"}
|
{ "MusicBrainz:BaseUrl", "https://www.musicbrainz.org" }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
|
|
@ -58,6 +58,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
||||||
UserAgent = _appHost.ApplicationUserAgent
|
UserAgent = _appHost.ApplicationUserAgent
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult((Stream)File.OpenRead(url));
|
return Task.FromResult((Stream)File.OpenRead(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -425,47 +425,27 @@ namespace Emby.Server.Implementations.Networking
|
||||||
var localEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
var localEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
||||||
using (var udpClient = new UdpClient(localEndPoint))
|
using (var udpClient = new UdpClient(localEndPoint))
|
||||||
{
|
{
|
||||||
var port = ((IPEndPoint)(udpClient.Client.LocalEndPoint)).Port;
|
var port = ((IPEndPoint)udpClient.Client.LocalEndPoint).Port;
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<string> _macAddresses;
|
private List<PhysicalAddress> _macAddresses;
|
||||||
public List<string> GetMacAddresses()
|
public List<PhysicalAddress> GetMacAddresses()
|
||||||
{
|
{
|
||||||
if (_macAddresses == null)
|
if (_macAddresses == null)
|
||||||
{
|
{
|
||||||
_macAddresses = GetMacAddressesInternal();
|
_macAddresses = GetMacAddressesInternal().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _macAddresses;
|
return _macAddresses;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<string> GetMacAddressesInternal()
|
private static IEnumerable<PhysicalAddress> GetMacAddressesInternal()
|
||||||
{
|
=> NetworkInterface.GetAllNetworkInterfaces()
|
||||||
return NetworkInterface.GetAllNetworkInterfaces()
|
|
||||||
.Where(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback)
|
.Where(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback)
|
||||||
.Select(i =>
|
.Select(x => x.GetPhysicalAddress())
|
||||||
{
|
.Where(x => x != null && x != PhysicalAddress.None);
|
||||||
try
|
|
||||||
{
|
|
||||||
var physicalAddress = i.GetPhysicalAddress();
|
|
||||||
|
|
||||||
if (physicalAddress == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return physicalAddress.ToString();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
//TODO Log exception.
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.Where(i => i != null)
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parses the specified endpointstring.
|
/// Parses the specified endpointstring.
|
||||||
|
|
|
@ -10,8 +10,12 @@ namespace Emby.Server.Implementations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
|
public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
|
||||||
{
|
{
|
||||||
|
private string _defaultTranscodingTempPath;
|
||||||
|
private string _transcodingTempPath;
|
||||||
|
private string _internalMetadataPath;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="BaseApplicationPaths" /> class.
|
/// Initializes a new instance of the <see cref="ServerApplicationPaths" /> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ServerApplicationPaths(
|
public ServerApplicationPaths(
|
||||||
string programDataPath,
|
string programDataPath,
|
||||||
|
@ -30,7 +34,7 @@ namespace Emby.Server.Implementations
|
||||||
public string ApplicationResourcesPath { get; } = AppContext.BaseDirectory;
|
public string ApplicationResourcesPath { get; } = AppContext.BaseDirectory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the base root media directory
|
/// Gets the path to the base root media directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The root folder path.</value>
|
/// <value>The root folder path.</value>
|
||||||
public string RootFolderPath => Path.Combine(ProgramDataPath, "root");
|
public string RootFolderPath => Path.Combine(ProgramDataPath, "root");
|
||||||
|
@ -48,7 +52,7 @@ namespace Emby.Server.Implementations
|
||||||
public string LocalizationPath => Path.Combine(ProgramDataPath, "localization");
|
public string LocalizationPath => Path.Combine(ProgramDataPath, "localization");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the People directory
|
/// Gets the path to the People directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The people path.</value>
|
/// <value>The people path.</value>
|
||||||
public string PeoplePath => Path.Combine(InternalMetadataPath, "People");
|
public string PeoplePath => Path.Combine(InternalMetadataPath, "People");
|
||||||
|
@ -56,37 +60,37 @@ namespace Emby.Server.Implementations
|
||||||
public string ArtistsPath => Path.Combine(InternalMetadataPath, "artists");
|
public string ArtistsPath => Path.Combine(InternalMetadataPath, "artists");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the Genre directory
|
/// Gets the path to the Genre directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The genre path.</value>
|
/// <value>The genre path.</value>
|
||||||
public string GenrePath => Path.Combine(InternalMetadataPath, "Genre");
|
public string GenrePath => Path.Combine(InternalMetadataPath, "Genre");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the Genre directory
|
/// Gets the path to the Genre directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The genre path.</value>
|
/// <value>The genre path.</value>
|
||||||
public string MusicGenrePath => Path.Combine(InternalMetadataPath, "MusicGenre");
|
public string MusicGenrePath => Path.Combine(InternalMetadataPath, "MusicGenre");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the Studio directory
|
/// Gets the path to the Studio directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The studio path.</value>
|
/// <value>The studio path.</value>
|
||||||
public string StudioPath => Path.Combine(InternalMetadataPath, "Studio");
|
public string StudioPath => Path.Combine(InternalMetadataPath, "Studio");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the Year directory
|
/// Gets the path to the Year directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The year path.</value>
|
/// <value>The year path.</value>
|
||||||
public string YearPath => Path.Combine(InternalMetadataPath, "Year");
|
public string YearPath => Path.Combine(InternalMetadataPath, "Year");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the General IBN directory
|
/// Gets the path to the General IBN directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The general path.</value>
|
/// <value>The general path.</value>
|
||||||
public string GeneralPath => Path.Combine(InternalMetadataPath, "general");
|
public string GeneralPath => Path.Combine(InternalMetadataPath, "general");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the Ratings IBN directory
|
/// Gets the path to the Ratings IBN directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The ratings path.</value>
|
/// <value>The ratings path.</value>
|
||||||
public string RatingsPath => Path.Combine(InternalMetadataPath, "ratings");
|
public string RatingsPath => Path.Combine(InternalMetadataPath, "ratings");
|
||||||
|
@ -98,15 +102,13 @@ namespace Emby.Server.Implementations
|
||||||
public string MediaInfoImagesPath => Path.Combine(InternalMetadataPath, "mediainfo");
|
public string MediaInfoImagesPath => Path.Combine(InternalMetadataPath, "mediainfo");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the path to the user configuration directory
|
/// Gets the path to the user configuration directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The user configuration directory path.</value>
|
/// <value>The user configuration directory path.</value>
|
||||||
public string UserConfigurationDirectoryPath => Path.Combine(ConfigurationDirectoryPath, "users");
|
public string UserConfigurationDirectoryPath => Path.Combine(ConfigurationDirectoryPath, "users");
|
||||||
|
|
||||||
private string _defaultTranscodingTempPath;
|
|
||||||
public string DefaultTranscodingTempPath => _defaultTranscodingTempPath ?? (_defaultTranscodingTempPath = Path.Combine(ProgramDataPath, "transcoding-temp"));
|
public string DefaultTranscodingTempPath => _defaultTranscodingTempPath ?? (_defaultTranscodingTempPath = Path.Combine(ProgramDataPath, "transcoding-temp"));
|
||||||
|
|
||||||
private string _transcodingTempPath;
|
|
||||||
public string TranscodingTempPath
|
public string TranscodingTempPath
|
||||||
{
|
{
|
||||||
get => _transcodingTempPath ?? (_transcodingTempPath = DefaultTranscodingTempPath);
|
get => _transcodingTempPath ?? (_transcodingTempPath = DefaultTranscodingTempPath);
|
||||||
|
@ -139,7 +141,6 @@ namespace Emby.Server.Implementations
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _internalMetadataPath;
|
|
||||||
public string InternalMetadataPath
|
public string InternalMetadataPath
|
||||||
{
|
{
|
||||||
get => _internalMetadataPath ?? (_internalMetadataPath = Path.Combine(DataPath, "metadata"));
|
get => _internalMetadataPath ?? (_internalMetadataPath = Path.Combine(DataPath, "metadata"));
|
||||||
|
|
|
@ -18,7 +18,6 @@ using Jellyfin.Drawing.Skia;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Model.Globalization;
|
using MediaBrowser.Model.Globalization;
|
||||||
using MediaBrowser.Model.IO;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
@ -41,12 +40,12 @@ namespace Jellyfin.Server
|
||||||
// For backwards compatibility.
|
// For backwards compatibility.
|
||||||
// Modify any input arguments now which start with single-hyphen to POSIX standard
|
// Modify any input arguments now which start with single-hyphen to POSIX standard
|
||||||
// double-hyphen to allow parsing by CommandLineParser package.
|
// double-hyphen to allow parsing by CommandLineParser package.
|
||||||
const string pattern = @"^(-[^-\s]{2})"; // Match -xx, not -x, not --xx, not xx
|
const string Pattern = @"^(-[^-\s]{2})"; // Match -xx, not -x, not --xx, not xx
|
||||||
const string substitution = @"-$1"; // Prepend with additional single-hyphen
|
const string Substitution = @"-$1"; // Prepend with additional single-hyphen
|
||||||
var regex = new Regex(pattern);
|
var regex = new Regex(Pattern);
|
||||||
for (var i = 0; i < args.Length; i++)
|
for (var i = 0; i < args.Length; i++)
|
||||||
{
|
{
|
||||||
args[i] = regex.Replace(args[i], substitution);
|
args[i] = regex.Replace(args[i], Substitution);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the command line arguments and either start the app or exit indicating error
|
// Parse the command line arguments and either start the app or exit indicating error
|
||||||
|
@ -134,7 +133,7 @@ namespace Jellyfin.Server
|
||||||
Batteries_V2.Init();
|
Batteries_V2.Init();
|
||||||
if (raw.sqlite3_enable_shared_cache(1) != raw.SQLITE_OK)
|
if (raw.sqlite3_enable_shared_cache(1) != raw.SQLITE_OK)
|
||||||
{
|
{
|
||||||
Console.WriteLine("WARN: Failed to enable shared cache for SQLite");
|
_logger.LogWarning("Failed to enable shared cache for SQLite");
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var appHost = new CoreAppHost(
|
using (var appHost = new CoreAppHost(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Net.NetworkInformation;
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
using MediaBrowser.Model.Net;
|
using MediaBrowser.Model.Net;
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ namespace MediaBrowser.Common.Net
|
||||||
/// Returns MAC Address from first Network Card in Computer
|
/// Returns MAC Address from first Network Card in Computer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>[string] MAC Address</returns>
|
/// <returns>[string] MAC Address</returns>
|
||||||
List<string> GetMacAddresses();
|
List<PhysicalAddress> GetMacAddresses();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines whether [is in private address space] [the specified endpoint].
|
/// Determines whether [is in private address space] [the specified endpoint].
|
||||||
|
|
|
@ -83,7 +83,7 @@ namespace MediaBrowser.Controller
|
||||||
|
|
||||||
void EnableLoopback(string appName);
|
void EnableLoopback(string appName);
|
||||||
|
|
||||||
WakeOnLanInfo[] GetWakeOnLanInfo();
|
IEnumerable<WakeOnLanInfo> GetWakeOnLanInfo();
|
||||||
|
|
||||||
string ExpandVirtualPath(string path);
|
string ExpandVirtualPath(string path);
|
||||||
string ReverseVirtualPath(string path);
|
string ReverseVirtualPath(string path);
|
||||||
|
|
|
@ -1,10 +1,47 @@
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
|
||||||
namespace MediaBrowser.Model.System
|
namespace MediaBrowser.Model.System
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides the MAC address and port for wake-on-LAN functionality.
|
||||||
|
/// </summary>
|
||||||
public class WakeOnLanInfo
|
public class WakeOnLanInfo
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the MAC address of the device.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The MAC address.</value>
|
||||||
public string MacAddress { get; set; }
|
public string MacAddress { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the wake-on-LAN port.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The wake-on-LAN port.</value>
|
||||||
public int Port { get; set; }
|
public int Port { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="WakeOnLanInfo" /> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="macAddress">The MAC address.</param>
|
||||||
|
public WakeOnLanInfo(PhysicalAddress macAddress)
|
||||||
|
{
|
||||||
|
MacAddress = macAddress.ToString();
|
||||||
|
Port = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="WakeOnLanInfo" /> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="macAddress">The MAC address.</param>
|
||||||
|
public WakeOnLanInfo(string macAddress)
|
||||||
|
{
|
||||||
|
MacAddress = macAddress;
|
||||||
|
Port = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="WakeOnLanInfo" /> class.
|
||||||
|
/// </summary>
|
||||||
public WakeOnLanInfo()
|
public WakeOnLanInfo()
|
||||||
{
|
{
|
||||||
Port = 9;
|
Port = 9;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user