|
@@ -47,7 +47,6 @@ using Emby.Server.Implementations.Session;
|
|
using Emby.Server.Implementations.SocketSharp;
|
|
using Emby.Server.Implementations.SocketSharp;
|
|
using Emby.Server.Implementations.TV;
|
|
using Emby.Server.Implementations.TV;
|
|
using Emby.Server.Implementations.Updates;
|
|
using Emby.Server.Implementations.Updates;
|
|
-using Jellyfin.Api.Extensions;
|
|
|
|
using MediaBrowser.Api;
|
|
using MediaBrowser.Api;
|
|
using MediaBrowser.Common;
|
|
using MediaBrowser.Common;
|
|
using MediaBrowser.Common.Configuration;
|
|
using MediaBrowser.Common.Configuration;
|
|
@@ -232,7 +231,7 @@ namespace Emby.Server.Implementations
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- protected IServiceProvider _serviceProvider;
|
|
|
|
|
|
+ public IServiceProvider ServiceProvider;
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Gets the server configuration manager.
|
|
/// Gets the server configuration manager.
|
|
@@ -461,7 +460,7 @@ namespace Emby.Server.Implementations
|
|
/// <param name="type">The type.</param>
|
|
/// <param name="type">The type.</param>
|
|
/// <returns>System.Object.</returns>
|
|
/// <returns>System.Object.</returns>
|
|
public object CreateInstance(Type type)
|
|
public object CreateInstance(Type type)
|
|
- => ActivatorUtilities.CreateInstance(_serviceProvider, type);
|
|
|
|
|
|
+ => ActivatorUtilities.CreateInstance(ServiceProvider, type);
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Creates an instance of type and resolves all constructor dependencies
|
|
/// Creates an instance of type and resolves all constructor dependencies
|
|
@@ -469,7 +468,7 @@ namespace Emby.Server.Implementations
|
|
/// /// <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);
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Creates the instance safe.
|
|
/// Creates the instance safe.
|
|
@@ -481,7 +480,7 @@ namespace Emby.Server.Implementations
|
|
try
|
|
try
|
|
{
|
|
{
|
|
Logger.LogDebug("Creating instance of {Type}", type);
|
|
Logger.LogDebug("Creating instance of {Type}", type);
|
|
- return ActivatorUtilities.CreateInstance(_serviceProvider, type);
|
|
|
|
|
|
+ return ActivatorUtilities.CreateInstance(ServiceProvider, type);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
{
|
|
{
|
|
@@ -495,7 +494,7 @@ namespace Emby.Server.Implementations
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <typeparam name="T">The type</typeparam>
|
|
/// <typeparam name="T">The type</typeparam>
|
|
/// <returns>``0.</returns>
|
|
/// <returns>``0.</returns>
|
|
- public T Resolve<T>() => _serviceProvider.GetService<T>();
|
|
|
|
|
|
+ public T Resolve<T>() => ServiceProvider.GetService<T>();
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Gets the export types.
|
|
/// Gets the export types.
|
|
@@ -611,93 +610,14 @@ namespace Emby.Server.Implementations
|
|
|
|
|
|
await RegisterResources(serviceCollection).ConfigureAwait(false);
|
|
await RegisterResources(serviceCollection).ConfigureAwait(false);
|
|
|
|
|
|
- string contentRoot = ServerConfigurationManager.Configuration.DashboardSourcePath;
|
|
|
|
- if (string.IsNullOrEmpty(contentRoot))
|
|
|
|
|
|
+ ContentRoot = ServerConfigurationManager.Configuration.DashboardSourcePath;
|
|
|
|
+ if (string.IsNullOrEmpty(ContentRoot))
|
|
{
|
|
{
|
|
- contentRoot = ServerConfigurationManager.ApplicationPaths.WebPath;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var host = new WebHostBuilder()
|
|
|
|
- .UseKestrel(options =>
|
|
|
|
- {
|
|
|
|
- var addresses = ServerConfigurationManager
|
|
|
|
- .Configuration
|
|
|
|
- .LocalNetworkAddresses
|
|
|
|
- .Select(NormalizeConfiguredLocalAddress)
|
|
|
|
- .Where(i => i != null)
|
|
|
|
- .ToList();
|
|
|
|
- if (addresses.Any())
|
|
|
|
- {
|
|
|
|
- foreach (var address in addresses)
|
|
|
|
- {
|
|
|
|
- Logger.LogInformation("Kestrel listening on {ipaddr}", address);
|
|
|
|
- options.Listen(address, HttpPort);
|
|
|
|
-
|
|
|
|
- if (EnableHttps && Certificate != null)
|
|
|
|
- {
|
|
|
|
- options.Listen(address, HttpsPort, listenOptions => listenOptions.UseHttps(Certificate));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- Logger.LogInformation("Kestrel listening on all interfaces");
|
|
|
|
- options.ListenAnyIP(HttpPort);
|
|
|
|
-
|
|
|
|
- if (EnableHttps && Certificate != null)
|
|
|
|
- {
|
|
|
|
- options.ListenAnyIP(HttpsPort, listenOptions => listenOptions.UseHttps(Certificate));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- .UseContentRoot(contentRoot)
|
|
|
|
- .ConfigureServices(services =>
|
|
|
|
- {
|
|
|
|
- services.AddResponseCompression();
|
|
|
|
- services.AddHttpContextAccessor();
|
|
|
|
- services.AddJellyfinApi(ServerConfigurationManager.Configuration.BaseUrl.TrimStart('/'));
|
|
|
|
-
|
|
|
|
- services.AddJellyfinApiSwagger();
|
|
|
|
-
|
|
|
|
- // configure custom legacy authentication
|
|
|
|
- services.AddCustomAuthentication();
|
|
|
|
-
|
|
|
|
- services.AddJellyfinApiAuthorization();
|
|
|
|
-
|
|
|
|
- // Merge the external ServiceCollection into ASP.NET DI
|
|
|
|
- services.TryAdd(serviceCollection);
|
|
|
|
- })
|
|
|
|
- .Configure(app =>
|
|
|
|
- {
|
|
|
|
- app.UseWebSockets();
|
|
|
|
-
|
|
|
|
- app.UseResponseCompression();
|
|
|
|
-
|
|
|
|
- // TODO app.UseMiddleware<WebSocketMiddleware>();
|
|
|
|
- app.Use(ExecuteWebsocketHandlerAsync);
|
|
|
|
-
|
|
|
|
- // TODO use when old API is removed: app.UseAuthentication();
|
|
|
|
- app.UseJellyfinApiSwagger();
|
|
|
|
- app.UseMvc();
|
|
|
|
- app.Use(ExecuteHttpHandlerAsync);
|
|
|
|
- })
|
|
|
|
- .Build();
|
|
|
|
-
|
|
|
|
- _serviceProvider = host.Services;
|
|
|
|
- FindParts();
|
|
|
|
-
|
|
|
|
- try
|
|
|
|
- {
|
|
|
|
- await host.StartAsync().ConfigureAwait(false);
|
|
|
|
- }
|
|
|
|
- catch
|
|
|
|
- {
|
|
|
|
- Logger.LogError("Kestrel failed to start! This is most likely due to an invalid address or port bind - correct your bind configuration in system.xml and try again.");
|
|
|
|
- throw;
|
|
|
|
|
|
+ ContentRoot = ServerConfigurationManager.ApplicationPaths.WebPath;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private async Task ExecuteWebsocketHandlerAsync(HttpContext context, Func<Task> next)
|
|
|
|
|
|
+ public async Task ExecuteWebsocketHandlerAsync(HttpContext context, Func<Task> next)
|
|
{
|
|
{
|
|
if (!context.WebSockets.IsWebSocketRequest)
|
|
if (!context.WebSockets.IsWebSocketRequest)
|
|
{
|
|
{
|
|
@@ -708,7 +628,7 @@ namespace Emby.Server.Implementations
|
|
await HttpServer.ProcessWebSocketRequest(context).ConfigureAwait(false);
|
|
await HttpServer.ProcessWebSocketRequest(context).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
|
|
- private async Task ExecuteHttpHandlerAsync(HttpContext context, Func<Task> next)
|
|
|
|
|
|
+ public async Task ExecuteHttpHandlerAsync(HttpContext context, Func<Task> next)
|
|
{
|
|
{
|
|
if (context.WebSockets.IsWebSocketRequest)
|
|
if (context.WebSockets.IsWebSocketRequest)
|
|
{
|
|
{
|
|
@@ -1090,9 +1010,9 @@ namespace Emby.Server.Implementations
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Finds the parts.
|
|
/// Finds the parts.
|
|
/// </summary>
|
|
/// </summary>
|
|
- protected void FindParts()
|
|
|
|
|
|
+ public void FindParts()
|
|
{
|
|
{
|
|
- InstallationManager = _serviceProvider.GetService<IInstallationManager>();
|
|
|
|
|
|
+ InstallationManager = ServiceProvider.GetService<IInstallationManager>();
|
|
InstallationManager.PluginInstalled += PluginInstalled;
|
|
InstallationManager.PluginInstalled += PluginInstalled;
|
|
|
|
|
|
if (!ServerConfigurationManager.Configuration.IsPortAuthorized)
|
|
if (!ServerConfigurationManager.Configuration.IsPortAuthorized)
|
|
@@ -1221,7 +1141,7 @@ namespace Emby.Server.Implementations
|
|
|
|
|
|
private CertificateInfo CertificateInfo { get; set; }
|
|
private CertificateInfo CertificateInfo { get; set; }
|
|
|
|
|
|
- protected X509Certificate2 Certificate { get; private set; }
|
|
|
|
|
|
+ public X509Certificate2 Certificate { get; private set; }
|
|
|
|
|
|
private IEnumerable<string> GetUrlPrefixes()
|
|
private IEnumerable<string> GetUrlPrefixes()
|
|
{
|
|
{
|
|
@@ -1605,7 +1525,7 @@ namespace Emby.Server.Implementations
|
|
return resultList;
|
|
return resultList;
|
|
}
|
|
}
|
|
|
|
|
|
- private IPAddress NormalizeConfiguredLocalAddress(string address)
|
|
|
|
|
|
+ public IPAddress NormalizeConfiguredLocalAddress(string address)
|
|
{
|
|
{
|
|
var index = address.Trim('/').IndexOf('/');
|
|
var index = address.Trim('/').IndexOf('/');
|
|
|
|
|
|
@@ -1685,6 +1605,8 @@ namespace Emby.Server.Implementations
|
|
|
|
|
|
public int HttpsPort { get; private set; }
|
|
public int HttpsPort { get; private set; }
|
|
|
|
|
|
|
|
+ public string ContentRoot { get; private set; }
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Shuts down.
|
|
/// Shuts down.
|
|
/// </summary>
|
|
/// </summary>
|