Streamline startup code
This commit is contained in:
parent
838225e962
commit
104e36f2f9
|
@ -147,25 +147,20 @@ namespace Emby.Server.Implementations
|
||||||
/// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> 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="options">Instance of the <see cref="IStartupOptions"/> interface.</param>
|
||||||
/// <param name="startupConfig">The <see cref="IConfiguration" /> 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(
|
public ApplicationHost(
|
||||||
IServerApplicationPaths applicationPaths,
|
IServerApplicationPaths applicationPaths,
|
||||||
ILoggerFactory loggerFactory,
|
ILoggerFactory loggerFactory,
|
||||||
IStartupOptions options,
|
IStartupOptions options,
|
||||||
IConfiguration startupConfig,
|
IConfiguration startupConfig)
|
||||||
IFileSystem fileSystem,
|
|
||||||
IServiceCollection serviceCollection)
|
|
||||||
{
|
{
|
||||||
ApplicationPaths = applicationPaths;
|
ApplicationPaths = applicationPaths;
|
||||||
LoggerFactory = loggerFactory;
|
LoggerFactory = loggerFactory;
|
||||||
_startupOptions = options;
|
_startupOptions = options;
|
||||||
_startupConfig = startupConfig;
|
_startupConfig = startupConfig;
|
||||||
_fileSystemManager = fileSystem;
|
_fileSystemManager = new ManagedFileSystem(LoggerFactory.CreateLogger<ManagedFileSystem>(), applicationPaths);
|
||||||
ServiceCollection = serviceCollection;
|
|
||||||
|
|
||||||
Logger = LoggerFactory.CreateLogger<ApplicationHost>();
|
Logger = LoggerFactory.CreateLogger<ApplicationHost>();
|
||||||
fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
|
_fileSystemManager.AddShortcutHandler(new MbLinkShortcutHandler(_fileSystemManager));
|
||||||
|
|
||||||
ApplicationVersion = typeof(ApplicationHost).Assembly.GetName().Version;
|
ApplicationVersion = typeof(ApplicationHost).Assembly.GetName().Version;
|
||||||
ApplicationVersionString = ApplicationVersion.ToString(3);
|
ApplicationVersionString = ApplicationVersion.ToString(3);
|
||||||
|
@ -230,8 +225,6 @@ namespace Emby.Server.Implementations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected ILogger<ApplicationHost> Logger { get; }
|
protected ILogger<ApplicationHost> Logger { get; }
|
||||||
|
|
||||||
protected IServiceCollection ServiceCollection { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the logger factory.
|
/// Gets the logger factory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -521,7 +514,7 @@ namespace Emby.Server.Implementations
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void Init()
|
public void Init(IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
DiscoverTypes();
|
DiscoverTypes();
|
||||||
|
|
||||||
|
@ -551,128 +544,129 @@ namespace Emby.Server.Implementations
|
||||||
CertificatePath = networkConfiguration.CertificatePath;
|
CertificatePath = networkConfiguration.CertificatePath;
|
||||||
Certificate = GetCertificate(CertificatePath, networkConfiguration.CertificatePassword);
|
Certificate = GetCertificate(CertificatePath, networkConfiguration.CertificatePassword);
|
||||||
|
|
||||||
RegisterServices();
|
RegisterServices(serviceCollection);
|
||||||
|
|
||||||
_pluginManager.RegisterServices(ServiceCollection);
|
_pluginManager.RegisterServices(serviceCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Registers services/resources with the service collection that will be available via DI.
|
/// Registers services/resources with the service collection that will be available via DI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual void RegisterServices()
|
/// <param name="serviceCollection">Instance of the <see cref="IServiceCollection"/> interface.</param>
|
||||||
|
protected virtual void RegisterServices(IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
ServiceCollection.AddSingleton(_startupOptions);
|
serviceCollection.AddSingleton(_startupOptions);
|
||||||
|
|
||||||
ServiceCollection.AddMemoryCache();
|
serviceCollection.AddMemoryCache();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IServerConfigurationManager>(ConfigurationManager);
|
serviceCollection.AddSingleton<IServerConfigurationManager>(ConfigurationManager);
|
||||||
ServiceCollection.AddSingleton<IConfigurationManager>(ConfigurationManager);
|
serviceCollection.AddSingleton<IConfigurationManager>(ConfigurationManager);
|
||||||
ServiceCollection.AddSingleton<IApplicationHost>(this);
|
serviceCollection.AddSingleton<IApplicationHost>(this);
|
||||||
ServiceCollection.AddSingleton<IPluginManager>(_pluginManager);
|
serviceCollection.AddSingleton<IPluginManager>(_pluginManager);
|
||||||
ServiceCollection.AddSingleton<IApplicationPaths>(ApplicationPaths);
|
serviceCollection.AddSingleton<IApplicationPaths>(ApplicationPaths);
|
||||||
|
|
||||||
ServiceCollection.AddSingleton(_fileSystemManager);
|
serviceCollection.AddSingleton(_fileSystemManager);
|
||||||
ServiceCollection.AddSingleton<TmdbClientManager>();
|
serviceCollection.AddSingleton<TmdbClientManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton(NetManager);
|
serviceCollection.AddSingleton(NetManager);
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ITaskManager, TaskManager>();
|
serviceCollection.AddSingleton<ITaskManager, TaskManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton(_xmlSerializer);
|
serviceCollection.AddSingleton(_xmlSerializer);
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IStreamHelper, StreamHelper>();
|
serviceCollection.AddSingleton<IStreamHelper, StreamHelper>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ICryptoProvider, CryptographyProvider>();
|
serviceCollection.AddSingleton<ICryptoProvider, CryptographyProvider>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISocketFactory, SocketFactory>();
|
serviceCollection.AddSingleton<ISocketFactory, SocketFactory>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IInstallationManager, InstallationManager>();
|
serviceCollection.AddSingleton<IInstallationManager, InstallationManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IZipClient, ZipClient>();
|
serviceCollection.AddSingleton<IZipClient, ZipClient>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IServerApplicationHost>(this);
|
serviceCollection.AddSingleton<IServerApplicationHost>(this);
|
||||||
ServiceCollection.AddSingleton<IServerApplicationPaths>(ApplicationPaths);
|
serviceCollection.AddSingleton<IServerApplicationPaths>(ApplicationPaths);
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ILocalizationManager, LocalizationManager>();
|
serviceCollection.AddSingleton<ILocalizationManager, LocalizationManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IBlurayExaminer, BdInfoExaminer>();
|
serviceCollection.AddSingleton<IBlurayExaminer, BdInfoExaminer>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IUserDataRepository, SqliteUserDataRepository>();
|
serviceCollection.AddSingleton<IUserDataRepository, SqliteUserDataRepository>();
|
||||||
ServiceCollection.AddSingleton<IUserDataManager, UserDataManager>();
|
serviceCollection.AddSingleton<IUserDataManager, UserDataManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IItemRepository, SqliteItemRepository>();
|
serviceCollection.AddSingleton<IItemRepository, SqliteItemRepository>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IMediaEncoder, MediaBrowser.MediaEncoding.Encoder.MediaEncoder>();
|
serviceCollection.AddSingleton<IMediaEncoder, MediaBrowser.MediaEncoding.Encoder.MediaEncoder>();
|
||||||
ServiceCollection.AddSingleton<EncodingHelper>();
|
serviceCollection.AddSingleton<EncodingHelper>();
|
||||||
|
|
||||||
// TODO: Refactor to eliminate the circular dependencies here so that Lazy<T> isn't required
|
// TODO: Refactor to eliminate the circular dependencies here so that Lazy<T> isn't required
|
||||||
ServiceCollection.AddTransient(provider => new Lazy<ILibraryMonitor>(provider.GetRequiredService<ILibraryMonitor>));
|
serviceCollection.AddTransient(provider => new Lazy<ILibraryMonitor>(provider.GetRequiredService<ILibraryMonitor>));
|
||||||
ServiceCollection.AddTransient(provider => new Lazy<IProviderManager>(provider.GetRequiredService<IProviderManager>));
|
serviceCollection.AddTransient(provider => new Lazy<IProviderManager>(provider.GetRequiredService<IProviderManager>));
|
||||||
ServiceCollection.AddTransient(provider => new Lazy<IUserViewManager>(provider.GetRequiredService<IUserViewManager>));
|
serviceCollection.AddTransient(provider => new Lazy<IUserViewManager>(provider.GetRequiredService<IUserViewManager>));
|
||||||
ServiceCollection.AddSingleton<ILibraryManager, LibraryManager>();
|
serviceCollection.AddSingleton<ILibraryManager, LibraryManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IMusicManager, MusicManager>();
|
serviceCollection.AddSingleton<IMusicManager, MusicManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ILibraryMonitor, LibraryMonitor>();
|
serviceCollection.AddSingleton<ILibraryMonitor, LibraryMonitor>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISearchEngine, SearchEngine>();
|
serviceCollection.AddSingleton<ISearchEngine, SearchEngine>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IWebSocketManager, WebSocketManager>();
|
serviceCollection.AddSingleton<IWebSocketManager, WebSocketManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IImageProcessor, ImageProcessor>();
|
serviceCollection.AddSingleton<IImageProcessor, ImageProcessor>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ITVSeriesManager, TVSeriesManager>();
|
serviceCollection.AddSingleton<ITVSeriesManager, TVSeriesManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IMediaSourceManager, MediaSourceManager>();
|
serviceCollection.AddSingleton<IMediaSourceManager, MediaSourceManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISubtitleManager, SubtitleManager>();
|
serviceCollection.AddSingleton<ISubtitleManager, SubtitleManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IProviderManager, ProviderManager>();
|
serviceCollection.AddSingleton<IProviderManager, ProviderManager>();
|
||||||
|
|
||||||
// TODO: Refactor to eliminate the circular dependency here so that Lazy<T> isn't required
|
// TODO: Refactor to eliminate the circular dependency here so that Lazy<T> isn't required
|
||||||
ServiceCollection.AddTransient(provider => new Lazy<ILiveTvManager>(provider.GetRequiredService<ILiveTvManager>));
|
serviceCollection.AddTransient(provider => new Lazy<ILiveTvManager>(provider.GetRequiredService<ILiveTvManager>));
|
||||||
ServiceCollection.AddSingleton<IDtoService, DtoService>();
|
serviceCollection.AddSingleton<IDtoService, DtoService>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IChannelManager, ChannelManager>();
|
serviceCollection.AddSingleton<IChannelManager, ChannelManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISessionManager, SessionManager>();
|
serviceCollection.AddSingleton<ISessionManager, SessionManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IDlnaManager, DlnaManager>();
|
serviceCollection.AddSingleton<IDlnaManager, DlnaManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ICollectionManager, CollectionManager>();
|
serviceCollection.AddSingleton<ICollectionManager, CollectionManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IPlaylistManager, PlaylistManager>();
|
serviceCollection.AddSingleton<IPlaylistManager, PlaylistManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISyncPlayManager, SyncPlayManager>();
|
serviceCollection.AddSingleton<ISyncPlayManager, SyncPlayManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<LiveTvDtoService>();
|
serviceCollection.AddSingleton<LiveTvDtoService>();
|
||||||
ServiceCollection.AddSingleton<ILiveTvManager, LiveTvManager>();
|
serviceCollection.AddSingleton<ILiveTvManager, LiveTvManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IUserViewManager, UserViewManager>();
|
serviceCollection.AddSingleton<IUserViewManager, UserViewManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<INotificationManager, NotificationManager>();
|
serviceCollection.AddSingleton<INotificationManager, NotificationManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IDeviceDiscovery, DeviceDiscovery>();
|
serviceCollection.AddSingleton<IDeviceDiscovery, DeviceDiscovery>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IChapterManager, ChapterManager>();
|
serviceCollection.AddSingleton<IChapterManager, ChapterManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IEncodingManager, MediaEncoder.EncodingManager>();
|
serviceCollection.AddSingleton<IEncodingManager, MediaEncoder.EncodingManager>();
|
||||||
|
|
||||||
ServiceCollection.AddScoped<ISessionContext, SessionContext>();
|
serviceCollection.AddScoped<ISessionContext, SessionContext>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IAuthService, AuthService>();
|
serviceCollection.AddSingleton<IAuthService, AuthService>();
|
||||||
ServiceCollection.AddSingleton<IQuickConnect, QuickConnectManager>();
|
serviceCollection.AddSingleton<IQuickConnect, QuickConnectManager>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<ISubtitleEncoder, MediaBrowser.MediaEncoding.Subtitles.SubtitleEncoder>();
|
serviceCollection.AddSingleton<ISubtitleEncoder, MediaBrowser.MediaEncoding.Subtitles.SubtitleEncoder>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IAttachmentExtractor, MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor>();
|
serviceCollection.AddSingleton<IAttachmentExtractor, MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<TranscodingJobHelper>();
|
serviceCollection.AddSingleton<TranscodingJobHelper>();
|
||||||
ServiceCollection.AddScoped<MediaInfoHelper>();
|
serviceCollection.AddScoped<MediaInfoHelper>();
|
||||||
ServiceCollection.AddScoped<AudioHelper>();
|
serviceCollection.AddScoped<AudioHelper>();
|
||||||
ServiceCollection.AddScoped<DynamicHlsHelper>();
|
serviceCollection.AddScoped<DynamicHlsHelper>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IDirectoryService, DirectoryService>();
|
serviceCollection.AddSingleton<IDirectoryService, DirectoryService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -22,7 +22,6 @@ using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Net;
|
using MediaBrowser.Controller.Net;
|
||||||
using MediaBrowser.Controller.Security;
|
using MediaBrowser.Controller.Security;
|
||||||
using MediaBrowser.Model.Activity;
|
using MediaBrowser.Model.Activity;
|
||||||
using MediaBrowser.Model.IO;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
@ -42,67 +41,61 @@ namespace Jellyfin.Server
|
||||||
/// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="startupConfig">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="startupConfig">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="fileSystem">The <see cref="IFileSystem" /> to be used by the <see cref="CoreAppHost" />.</param>
|
|
||||||
/// <param name="collection">The <see cref="IServiceCollection"/> to be used by the <see cref="CoreAppHost"/>.</param>
|
|
||||||
public CoreAppHost(
|
public CoreAppHost(
|
||||||
IServerApplicationPaths applicationPaths,
|
IServerApplicationPaths applicationPaths,
|
||||||
ILoggerFactory loggerFactory,
|
ILoggerFactory loggerFactory,
|
||||||
IStartupOptions options,
|
IStartupOptions options,
|
||||||
IConfiguration startupConfig,
|
IConfiguration startupConfig)
|
||||||
IFileSystem fileSystem,
|
|
||||||
IServiceCollection collection)
|
|
||||||
: base(
|
: base(
|
||||||
applicationPaths,
|
applicationPaths,
|
||||||
loggerFactory,
|
loggerFactory,
|
||||||
options,
|
options,
|
||||||
startupConfig,
|
startupConfig)
|
||||||
fileSystem,
|
|
||||||
collection)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
protected override void RegisterServices()
|
protected override void RegisterServices(IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
// Register an image encoder
|
// Register an image encoder
|
||||||
bool useSkiaEncoder = SkiaEncoder.IsNativeLibAvailable();
|
bool useSkiaEncoder = SkiaEncoder.IsNativeLibAvailable();
|
||||||
Type imageEncoderType = useSkiaEncoder
|
Type imageEncoderType = useSkiaEncoder
|
||||||
? typeof(SkiaEncoder)
|
? typeof(SkiaEncoder)
|
||||||
: typeof(NullImageEncoder);
|
: typeof(NullImageEncoder);
|
||||||
ServiceCollection.AddSingleton(typeof(IImageEncoder), imageEncoderType);
|
serviceCollection.AddSingleton(typeof(IImageEncoder), imageEncoderType);
|
||||||
|
|
||||||
// Log a warning if the Skia encoder could not be used
|
// Log a warning if the Skia encoder could not be used
|
||||||
if (!useSkiaEncoder)
|
if (!useSkiaEncoder)
|
||||||
{
|
{
|
||||||
Logger.LogWarning($"Skia not available. Will fallback to {nameof(NullImageEncoder)}.");
|
Logger.LogWarning("Skia not available. Will fallback to {ImageEncoder}.", nameof(NullImageEncoder));
|
||||||
}
|
}
|
||||||
|
|
||||||
ServiceCollection.AddDbContextPool<JellyfinDb>(
|
serviceCollection.AddDbContextPool<JellyfinDb>(
|
||||||
options => options
|
options => options
|
||||||
.UseLoggerFactory(LoggerFactory)
|
.UseLoggerFactory(LoggerFactory)
|
||||||
.UseSqlite($"Filename={Path.Combine(ApplicationPaths.DataPath, "jellyfin.db")}"));
|
.UseSqlite($"Filename={Path.Combine(ApplicationPaths.DataPath, "jellyfin.db")}"));
|
||||||
|
|
||||||
ServiceCollection.AddEventServices();
|
serviceCollection.AddEventServices();
|
||||||
ServiceCollection.AddSingleton<IBaseItemManager, BaseItemManager>();
|
serviceCollection.AddSingleton<IBaseItemManager, BaseItemManager>();
|
||||||
ServiceCollection.AddSingleton<IEventManager, EventManager>();
|
serviceCollection.AddSingleton<IEventManager, EventManager>();
|
||||||
ServiceCollection.AddSingleton<JellyfinDbProvider>();
|
serviceCollection.AddSingleton<JellyfinDbProvider>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IActivityManager, ActivityManager>();
|
serviceCollection.AddSingleton<IActivityManager, ActivityManager>();
|
||||||
ServiceCollection.AddSingleton<IUserManager, UserManager>();
|
serviceCollection.AddSingleton<IUserManager, UserManager>();
|
||||||
ServiceCollection.AddSingleton<IDisplayPreferencesManager, DisplayPreferencesManager>();
|
serviceCollection.AddSingleton<IDisplayPreferencesManager, DisplayPreferencesManager>();
|
||||||
ServiceCollection.AddSingleton<IDeviceManager, DeviceManager>();
|
serviceCollection.AddSingleton<IDeviceManager, DeviceManager>();
|
||||||
|
|
||||||
// TODO search the assemblies instead of adding them manually?
|
// TODO search the assemblies instead of adding them manually?
|
||||||
ServiceCollection.AddSingleton<IWebSocketListener, SessionWebSocketListener>();
|
serviceCollection.AddSingleton<IWebSocketListener, SessionWebSocketListener>();
|
||||||
ServiceCollection.AddSingleton<IWebSocketListener, ActivityLogWebSocketListener>();
|
serviceCollection.AddSingleton<IWebSocketListener, ActivityLogWebSocketListener>();
|
||||||
ServiceCollection.AddSingleton<IWebSocketListener, ScheduledTasksWebSocketListener>();
|
serviceCollection.AddSingleton<IWebSocketListener, ScheduledTasksWebSocketListener>();
|
||||||
ServiceCollection.AddSingleton<IWebSocketListener, SessionInfoWebSocketListener>();
|
serviceCollection.AddSingleton<IWebSocketListener, SessionInfoWebSocketListener>();
|
||||||
|
|
||||||
ServiceCollection.AddSingleton<IAuthorizationContext, AuthorizationContext>();
|
serviceCollection.AddSingleton<IAuthorizationContext, AuthorizationContext>();
|
||||||
|
|
||||||
ServiceCollection.AddScoped<IAuthenticationManager, AuthenticationManager>();
|
serviceCollection.AddScoped<IAuthenticationManager, AuthenticationManager>();
|
||||||
|
|
||||||
base.RegisterServices();
|
base.RegisterServices(serviceCollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
|
@ -10,7 +10,6 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommandLine;
|
using CommandLine;
|
||||||
using Emby.Server.Implementations;
|
using Emby.Server.Implementations;
|
||||||
using Emby.Server.Implementations.IO;
|
|
||||||
using Jellyfin.Server.Implementations;
|
using Jellyfin.Server.Implementations;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
|
@ -157,34 +156,36 @@ namespace Jellyfin.Server
|
||||||
|
|
||||||
ApplicationHost.LogEnvironmentInfo(_logger, appPaths);
|
ApplicationHost.LogEnvironmentInfo(_logger, appPaths);
|
||||||
|
|
||||||
|
// If hosting the web client, validate the client content path
|
||||||
|
if (startupConfig.HostWebClient())
|
||||||
|
{
|
||||||
|
string? webContentPath = appPaths.WebPath;
|
||||||
|
if (!Directory.Exists(webContentPath) || !Directory.EnumerateFiles(webContentPath).Any())
|
||||||
|
{
|
||||||
|
_logger.LogError(
|
||||||
|
"The server is expected to host the web client, but the provided content directory is either " +
|
||||||
|
"invalid or empty: {WebContentPath}. If you do not want to host the web client with the " +
|
||||||
|
"server, you may set the '--nowebclient' command line flag, or set" +
|
||||||
|
"'{ConfigKey}=false' in your config settings.",
|
||||||
|
webContentPath,
|
||||||
|
ConfigurationExtensions.HostWebClientKey);
|
||||||
|
Environment.ExitCode = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PerformStaticInitialization();
|
PerformStaticInitialization();
|
||||||
var serviceCollection = new ServiceCollection();
|
|
||||||
|
|
||||||
var appHost = new CoreAppHost(
|
var appHost = new CoreAppHost(
|
||||||
appPaths,
|
appPaths,
|
||||||
_loggerFactory,
|
_loggerFactory,
|
||||||
options,
|
options,
|
||||||
startupConfig,
|
startupConfig);
|
||||||
new ManagedFileSystem(_loggerFactory.CreateLogger<ManagedFileSystem>(), appPaths),
|
|
||||||
serviceCollection);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// If hosting the web client, validate the client content path
|
var serviceCollection = new ServiceCollection();
|
||||||
if (startupConfig.HostWebClient())
|
appHost.Init(serviceCollection);
|
||||||
{
|
|
||||||
string? webContentPath = appHost.ConfigurationManager.ApplicationPaths.WebPath;
|
|
||||||
if (!Directory.Exists(webContentPath) || Directory.GetFiles(webContentPath).Length == 0)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException(
|
|
||||||
"The server is expected to host the web client, but the provided content directory is either " +
|
|
||||||
$"invalid or empty: {webContentPath}. If you do not want to host the web client with the " +
|
|
||||||
"server, you may set the '--nowebclient' command line flag, or set" +
|
|
||||||
$"'{ConfigurationExtensions.HostWebClientKey}=false' in your config settings.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
appHost.Init();
|
|
||||||
|
|
||||||
var webHost = new WebHostBuilder().ConfigureWebHostBuilder(appHost, serviceCollection, options, startupConfig, appPaths).Build();
|
var webHost = new WebHostBuilder().ConfigureWebHostBuilder(appHost, serviceCollection, options, startupConfig, appPaths).Build();
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace MediaBrowser.Common
|
namespace MediaBrowser.Common
|
||||||
{
|
{
|
||||||
|
@ -137,7 +138,8 @@ namespace MediaBrowser.Common
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes this instance.
|
/// Initializes this instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Init();
|
/// <param name="serviceCollection">Instance of the <see cref="IServiceCollection"/> interface.</param>
|
||||||
|
void Init(IServiceCollection serviceCollection);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the instance.
|
/// Creates the instance.
|
||||||
|
|
|
@ -3,7 +3,6 @@ using System.Collections.Concurrent;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Emby.Server.Implementations;
|
using Emby.Server.Implementations;
|
||||||
using Emby.Server.Implementations.IO;
|
|
||||||
using MediaBrowser.Common;
|
using MediaBrowser.Common;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc.Testing;
|
using Microsoft.AspNetCore.Mvc.Testing;
|
||||||
|
@ -67,7 +66,7 @@ namespace Jellyfin.Server.Integration.Tests
|
||||||
var startupConfig = Program.CreateAppConfiguration(commandLineOpts, appPaths);
|
var startupConfig = Program.CreateAppConfiguration(commandLineOpts, appPaths);
|
||||||
|
|
||||||
ILoggerFactory loggerFactory = new SerilogLoggerFactory();
|
ILoggerFactory loggerFactory = new SerilogLoggerFactory();
|
||||||
var serviceCollection = new ServiceCollection();
|
|
||||||
_disposableComponents.Add(loggerFactory);
|
_disposableComponents.Add(loggerFactory);
|
||||||
|
|
||||||
// Create the app host and initialize it
|
// Create the app host and initialize it
|
||||||
|
@ -75,11 +74,10 @@ namespace Jellyfin.Server.Integration.Tests
|
||||||
appPaths,
|
appPaths,
|
||||||
loggerFactory,
|
loggerFactory,
|
||||||
commandLineOpts,
|
commandLineOpts,
|
||||||
new ConfigurationBuilder().Build(),
|
new ConfigurationBuilder().Build());
|
||||||
new ManagedFileSystem(loggerFactory.CreateLogger<ManagedFileSystem>(), appPaths),
|
|
||||||
serviceCollection);
|
|
||||||
_disposableComponents.Add(appHost);
|
_disposableComponents.Add(appHost);
|
||||||
appHost.Init();
|
var serviceCollection = new ServiceCollection();
|
||||||
|
appHost.Init(serviceCollection);
|
||||||
|
|
||||||
// Configure the web host builder
|
// Configure the web host builder
|
||||||
Program.ConfigureWebHostBuilder(builder, appHost, serviceCollection, commandLineOpts, startupConfig, appPaths);
|
Program.ConfigureWebHostBuilder(builder, appHost, serviceCollection, commandLineOpts, startupConfig, appPaths);
|
||||||
|
|
|
@ -2,9 +2,7 @@ using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Emby.Server.Implementations;
|
using Emby.Server.Implementations;
|
||||||
using MediaBrowser.Controller;
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Model.IO;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace Jellyfin.Server.Integration.Tests
|
namespace Jellyfin.Server.Integration.Tests
|
||||||
|
@ -21,22 +19,16 @@ namespace Jellyfin.Server.Integration.Tests
|
||||||
/// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="loggerFactory">The <see cref="ILoggerFactory" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="options">The <see cref="StartupOptions" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="startup">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
|
/// <param name="startup">The <see cref="IConfiguration" /> to be used by the <see cref="CoreAppHost" />.</param>
|
||||||
/// <param name="fileSystem">The <see cref="IFileSystem" /> to be used by the <see cref="CoreAppHost" />.</param>
|
|
||||||
/// <param name="collection">The <see cref="IServiceCollection"/> to be used by the <see cref="CoreAppHost"/>.</param>
|
|
||||||
public TestAppHost(
|
public TestAppHost(
|
||||||
IServerApplicationPaths applicationPaths,
|
IServerApplicationPaths applicationPaths,
|
||||||
ILoggerFactory loggerFactory,
|
ILoggerFactory loggerFactory,
|
||||||
IStartupOptions options,
|
IStartupOptions options,
|
||||||
IConfiguration startup,
|
IConfiguration startup)
|
||||||
IFileSystem fileSystem,
|
|
||||||
IServiceCollection collection)
|
|
||||||
: base(
|
: base(
|
||||||
applicationPaths,
|
applicationPaths,
|
||||||
loggerFactory,
|
loggerFactory,
|
||||||
options,
|
options,
|
||||||
startup,
|
startup)
|
||||||
fileSystem,
|
|
||||||
collection)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user