aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication/ApplicationHost.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.ServerApplication/ApplicationHost.cs')
-rw-r--r--MediaBrowser.ServerApplication/ApplicationHost.cs145
1 files changed, 103 insertions, 42 deletions
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index 6b748bb48..582b73a31 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -146,8 +146,12 @@ namespace MediaBrowser.ServerApplication
/// <value>The display preferences manager.</value>
internal IDisplayPreferencesManager DisplayPreferencesManager { get; set; }
+ /// <summary>
+ /// Gets or sets the media encoder.
+ /// </summary>
+ /// <value>The media encoder.</value>
private IMediaEncoder MediaEncoder { get; set; }
-
+
/// <summary>
/// The full path to our startmenu shortcut
/// </summary>
@@ -156,23 +160,34 @@ namespace MediaBrowser.ServerApplication
get { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Media Browser 3", "Media Browser Server.lnk"); }
}
+ private Task<IHttpServer> _httpServerCreationTask;
+
/// <summary>
/// Runs the startup tasks.
/// </summary>
/// <returns>Task.</returns>
protected override async Task RunStartupTasks()
{
- // Do these before allowing the base method to run, which will invoke startup scheduled tasks
- await ServerKernel.LoadRepositories(ServerConfigurationManager).ConfigureAwait(false);
-
await base.RunStartupTasks().ConfigureAwait(false);
DirectoryWatchers.Start();
+ Logger.Info("Core startup complete");
+
Parallel.ForEach(GetExports<IServerEntryPoint>(), entryPoint => entryPoint.Run());
}
/// <summary>
+ /// Called when [logger loaded].
+ /// </summary>
+ protected override void OnLoggerLoaded()
+ {
+ base.OnLoggerLoaded();
+
+ _httpServerCreationTask = Task.Run(() => ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html"));
+ }
+
+ /// <summary>
/// Registers resources that classes will depend on
/// </summary>
/// <returns>Task.</returns>
@@ -192,22 +207,16 @@ namespace MediaBrowser.ServerApplication
RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger));
- RegisterSingleInstance<IIsoManager>(new PismoIsoManager(Logger));
- RegisterSingleInstance<IBlurayExaminer>(new BdInfoExaminer());
+ RegisterSingleInstance<IIsoManager>(() => new PismoIsoManager(Logger));
+ RegisterSingleInstance<IBlurayExaminer>(() => new BdInfoExaminer());
ZipClient = new DotNetZipClient();
RegisterSingleInstance(ZipClient);
- HttpServer = ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html");
- RegisterSingleInstance(HttpServer, false);
-
- ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel);
- RegisterSingleInstance(ServerManager);
-
- UserManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager);
+ UserManager = new UserManager(Logger, ServerConfigurationManager);
RegisterSingleInstance(UserManager);
- LibraryManager = new LibraryManager(ServerKernel, Logger, TaskManager, UserManager, ServerConfigurationManager);
+ LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager);
RegisterSingleInstance(LibraryManager);
InstallationManager = new InstallationManager(HttpClient, PackageManager, JsonSerializer, Logger, this);
@@ -227,9 +236,20 @@ namespace MediaBrowser.ServerApplication
MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ZipClient, ApplicationPaths, JsonSerializer);
RegisterSingleInstance(MediaEncoder);
- await ConfigureRepositories().ConfigureAwait(false);
+ HttpServer = await _httpServerCreationTask.ConfigureAwait(false);
+ RegisterSingleInstance(HttpServer, false);
+
+ ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel);
+ RegisterSingleInstance(ServerManager);
+
+ var displayPreferencesTask = Task.Run(async () => await ConfigureDisplayPreferencesRepositories().ConfigureAwait(false));
+ var itemsTask = Task.Run(async () => await ConfigureItemRepositories().ConfigureAwait(false));
+ var userdataTask = Task.Run(async () => await ConfigureUserDataRepositories().ConfigureAwait(false));
+ var userTask = Task.Run(async () => await ConfigureUserRepositories().ConfigureAwait(false));
+
+ await Task.WhenAll(itemsTask, userTask, displayPreferencesTask, userdataTask).ConfigureAwait(false);
+
SetKernelProperties();
- SetStaticProperties();
}
/// <summary>
@@ -237,16 +257,13 @@ namespace MediaBrowser.ServerApplication
/// </summary>
private void SetKernelProperties()
{
- ServerKernel.FFMpegManager = new FFMpegManager(ServerKernel, ApplicationPaths, MediaEncoder);
- ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths);
-
Parallel.Invoke(
- () => ServerKernel.UserDataRepositories = GetExports<IUserDataRepository>(),
- () => ServerKernel.UserRepositories = GetExports<IUserRepository>(),
- () => ServerKernel.ItemRepositories = GetExports<IItemRepository>(),
+ () => ServerKernel.FFMpegManager = new FFMpegManager(ApplicationPaths, MediaEncoder, LibraryManager),
+ () => ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths),
() => ServerKernel.WeatherProviders = GetExports<IWeatherProvider>(),
() => ServerKernel.ImageEnhancers = GetExports<IImageEnhancer>().OrderBy(e => e.Priority).ToArray(),
- () => ServerKernel.StringFiles = GetExports<LocalizedStringData>()
+ () => ServerKernel.StringFiles = GetExports<LocalizedStringData>(),
+ SetStaticProperties
);
}
@@ -254,15 +271,56 @@ namespace MediaBrowser.ServerApplication
/// Configures the repositories.
/// </summary>
/// <returns>Task.</returns>
- private async Task ConfigureRepositories()
+ private async Task ConfigureDisplayPreferencesRepositories()
{
- var displayPreferencesRepositories = GetExports<IDisplayPreferencesRepository>();
+ var repositories = GetExports<IDisplayPreferencesRepository>();
- var repo = GetRepository(displayPreferencesRepositories, ServerConfigurationManager.Configuration.DisplayPreferencesRepository);
+ var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.DisplayPreferencesRepository);
- await repo.Initialize().ConfigureAwait(false);
+ await repository.Initialize().ConfigureAwait(false);
- ((DisplayPreferencesManager)DisplayPreferencesManager).Repository = repo;
+ ((DisplayPreferencesManager)DisplayPreferencesManager).Repository = repository;
+ }
+
+ /// <summary>
+ /// Configures the item repositories.
+ /// </summary>
+ /// <returns>Task.</returns>
+ private async Task ConfigureItemRepositories()
+ {
+ var repositories = GetExports<IItemRepository>();
+
+ var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.ItemRepository);
+
+ await repository.Initialize().ConfigureAwait(false);
+
+ ((LibraryManager)LibraryManager).ItemRepository = repository;
+ }
+
+ /// <summary>
+ /// Configures the user data repositories.
+ /// </summary>
+ /// <returns>Task.</returns>
+ private async Task ConfigureUserDataRepositories()
+ {
+ var repositories = GetExports<IUserDataRepository>();
+
+ var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserDataRepository);
+
+ await repository.Initialize().ConfigureAwait(false);
+
+ ((UserManager)UserManager).UserDataRepository = repository;
+ }
+
+ private async Task ConfigureUserRepositories()
+ {
+ var repositories = GetExports<IUserRepository>();
+
+ var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserRepository);
+
+ await repository.Initialize().ConfigureAwait(false);
+
+ ((UserManager)UserManager).UserRepository = repository;
}
/// <summary>
@@ -286,8 +344,6 @@ namespace MediaBrowser.ServerApplication
/// </summary>
protected override void FindParts()
{
- base.FindParts();
-
if (IsFirstRun)
{
RegisterServerWithAdministratorAccess();
@@ -295,6 +351,8 @@ namespace MediaBrowser.ServerApplication
Parallel.Invoke(
+ () => base.FindParts(),
+
() =>
{
HttpServer.Init(GetExports<IRestfulService>(false));
@@ -305,19 +363,22 @@ namespace MediaBrowser.ServerApplication
() => LibraryManager.AddParts(GetExports<IResolverIgnoreRule>(), GetExports<IVirtualFolderCreator>(), GetExports<IItemResolver>(), GetExports<IIntroProvider>(), GetExports<IBaseItemComparer>()),
- () => ProviderManager.AddMetadataProviders(GetExports<BaseMetadataProvider>().ToArray())
- );
-
- UdpServer = new UdpServer(Logger, NetworkManager, ServerConfigurationManager);
+ () => ProviderManager.AddMetadataProviders(GetExports<BaseMetadataProvider>().ToArray()),
- try
- {
- UdpServer.Start(UdpServerPort);
- }
- catch (SocketException ex)
- {
- Logger.ErrorException("Failed to start UDP Server", ex);
- }
+ () =>
+ {
+ UdpServer = new UdpServer(Logger, NetworkManager, ServerConfigurationManager);
+
+ try
+ {
+ UdpServer.Start(UdpServerPort);
+ }
+ catch (SocketException ex)
+ {
+ Logger.ErrorException("Failed to start UDP Server", ex);
+ }
+ }
+ );
}
/// <summary>