diff options
Diffstat (limited to 'MediaBrowser.Server.Startup.Common/ApplicationHost.cs')
| -rw-r--r-- | MediaBrowser.Server.Startup.Common/ApplicationHost.cs | 236 |
1 files changed, 133 insertions, 103 deletions
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index ae839e6ee..1e5c54d93 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -160,7 +160,6 @@ namespace MediaBrowser.Server.Startup.Common private IHttpServer HttpServer { get; set; } private IDtoService DtoService { get; set; } private IImageProcessor ImageProcessor { get; set; } - private ISeriesOrderManager SeriesOrderManager { get; set; } /// <summary> /// Gets or sets the media encoder. @@ -190,7 +189,6 @@ namespace MediaBrowser.Server.Startup.Common internal IItemRepository ItemRepository { get; set; } private INotificationsRepository NotificationsRepository { get; set; } private IFileOrganizationRepository FileOrganizationRepository { get; set; } - private IProviderRepository ProviderRepository { get; set; } private INotificationManager NotificationManager { get; set; } private ISubtitleManager SubtitleManager { get; set; } @@ -314,7 +312,6 @@ namespace MediaBrowser.Server.Startup.Common /// <summary> /// Runs the startup tasks. /// </summary> - /// <returns>Task.</returns> public override async Task RunStartupTasks() { if (ServerConfigurationManager.Configuration.MigrationVersion < CleanDatabaseScheduledTask.MigrationVersion && @@ -325,23 +322,30 @@ namespace MediaBrowser.Server.Startup.Common await base.RunStartupTasks().ConfigureAwait(false); + await MediaEncoder.Init().ConfigureAwait(false); + Logger.Info("ServerId: {0}", SystemId); Logger.Info("Core startup complete"); HttpServer.GlobalResponse = null; PerformPostInitMigrations(); + Logger.Info("Post-init migrations complete"); - Parallel.ForEach(GetExports<IServerEntryPoint>(), entryPoint => + foreach (var entryPoint in GetExports<IServerEntryPoint>().ToList()) { + var name = entryPoint.GetType().FullName; + Logger.Info("Starting entry point {0}", name); try { entryPoint.Run(); } catch (Exception ex) { - Logger.ErrorException("Error in {0}", ex, entryPoint.GetType().Name); + Logger.ErrorException("Error in {0}", ex, name); } - }); + Logger.Info("Entry point completed: {0}", name); + } + Logger.Info("All entry points have started"); LogManager.RemoveConsoleOutput(); } @@ -360,12 +364,18 @@ namespace MediaBrowser.Server.Startup.Common { var migrations = new List<IVersionMigration> { - new RenameXmlOptions(ServerConfigurationManager) }; foreach (var task in migrations) { - task.Run(); + try + { + task.Run(); + } + catch (Exception ex) + { + Logger.ErrorException("Error running migration", ex); + } } } @@ -375,19 +385,28 @@ namespace MediaBrowser.Server.Startup.Common { new OmdbEpisodeProviderMigration(ServerConfigurationManager), new MovieDbEpisodeProviderMigration(ServerConfigurationManager), - new DbMigration(ServerConfigurationManager, TaskManager) + new DbMigration(ServerConfigurationManager, TaskManager), + new FolderViewSettingMigration(ServerConfigurationManager, UserManager), + new CollectionGroupingMigration(ServerConfigurationManager, UserManager), + new CollectionsViewMigration(ServerConfigurationManager, UserManager) }; foreach (var task in migrations) { - task.Run(); + try + { + task.Run(); + } + catch (Exception ex) + { + Logger.ErrorException("Error running migration", ex); + } } } /// <summary> /// Registers resources that classes will depend on /// </summary> - /// <returns>Task.</returns> protected override async Task RegisterResources(IProgress<double> progress) { await base.RegisterResources(progress).ConfigureAwait(false); @@ -410,18 +429,14 @@ namespace MediaBrowser.Server.Startup.Common UserRepository = await GetUserRepository().ConfigureAwait(false); RegisterSingleInstance(UserRepository); - var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager, JsonSerializer, ApplicationPaths); + var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager, JsonSerializer, ApplicationPaths, NativeApp.GetDbConnector()); DisplayPreferencesRepository = displayPreferencesRepo; RegisterSingleInstance(DisplayPreferencesRepository); - var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager); + var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager, NativeApp.GetDbConnector()); ItemRepository = itemRepo; RegisterSingleInstance(ItemRepository); - var providerRepo = new SqliteProviderInfoRepository(LogManager, ApplicationPaths); - ProviderRepository = providerRepo; - RegisterSingleInstance(ProviderRepository); - FileOrganizationRepository = await GetFileOrganizationRepository().ConfigureAwait(false); RegisterSingleInstance(FileOrganizationRepository); @@ -446,9 +461,6 @@ namespace MediaBrowser.Server.Startup.Common ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer); RegisterSingleInstance(ProviderManager); - SeriesOrderManager = new SeriesOrderManager(); - RegisterSingleInstance(SeriesOrderManager); - RegisterSingleInstance<ISearchEngine>(() => new SearchEngine(LogManager, LibraryManager, UserManager)); HttpServer = ServerFactory.CreateServer(this, LogManager, ServerConfigurationManager, NetworkManager, "Emby", "web/index.html"); @@ -543,8 +555,8 @@ namespace MediaBrowser.Server.Startup.Common RegisterSingleInstance(NativeApp.GetPowerManagement()); - var sharingRepo = new SharingRepository(LogManager, ApplicationPaths); - await sharingRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + var sharingRepo = new SharingRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector()); + await sharingRepo.Initialize().ConfigureAwait(false); RegisterSingleInstance<ISharingManager>(new SharingManager(sharingRepo, ServerConfigurationManager, LibraryManager, this)); RegisterSingleInstance<ISsdpHandler>(new SsdpHandler(LogManager.GetLogger("SsdpHandler"), ServerConfigurationManager, this)); @@ -560,11 +572,13 @@ namespace MediaBrowser.Server.Startup.Common SubtitleEncoder = new SubtitleEncoder(LibraryManager, LogManager.GetLogger("SubtitleEncoder"), ApplicationPaths, FileSystemManager, MediaEncoder, JsonSerializer, HttpClient, MediaSourceManager); RegisterSingleInstance(SubtitleEncoder); - - await displayPreferencesRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); - await ConfigureUserDataRepositories().ConfigureAwait(false); - await itemRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); - await providerRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + + await displayPreferencesRepo.Initialize().ConfigureAwait(false); + + var userDataRepo = new SqliteUserDataRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector()); + + ((UserDataManager)UserDataManager).Repository = userDataRepo; + await itemRepo.Initialize(userDataRepo).ConfigureAwait(false); ((LibraryManager)LibraryManager).ItemRepository = ItemRepository; await ConfigureNotificationsRepository().ConfigureAwait(false); progress.Report(100); @@ -623,14 +637,21 @@ namespace MediaBrowser.Server.Startup.Common /// <returns>Task.</returns> private async Task RegisterMediaEncoder(IProgress<double> progress) { - var info = await new FFMpegLoader(Logger, ApplicationPaths, HttpClient, ZipClient, FileSystemManager, NativeApp.Environment, NativeApp.GetType().Assembly, NativeApp.GetFfmpegInstallInfo()) + string encoderPath = null; + string probePath = null; + + var info = await new FFMpegLoader(Logger, ApplicationPaths, HttpClient, ZipClient, FileSystemManager, NativeApp.Environment, NativeApp.GetFfmpegInstallInfo()) .GetFFMpegInfo(NativeApp.Environment, _startupOptions, progress).ConfigureAwait(false); + encoderPath = info.EncoderPath; + probePath = info.ProbePath; + var hasExternalEncoder = string.Equals(info.Version, "external", StringComparison.OrdinalIgnoreCase); + var mediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), JsonSerializer, - info.EncoderPath, - info.ProbePath, - info.Version, + encoderPath, + probePath, + hasExternalEncoder, ServerConfigurationManager, FileSystemManager, LiveTvManager, @@ -643,14 +664,6 @@ namespace MediaBrowser.Server.Startup.Common MediaEncoder = mediaEncoder; RegisterSingleInstance(MediaEncoder); - - Task.Run(() => - { - var result = new FFmpegValidator(Logger, ApplicationPaths, FileSystemManager).Validate(info); - - mediaEncoder.SetAvailableDecoders(result.Item1); - mediaEncoder.SetAvailableEncoders(result.Item2); - }); } /// <summary> @@ -661,9 +674,9 @@ namespace MediaBrowser.Server.Startup.Common { try { - var repo = new SqliteUserRepository(LogManager, ApplicationPaths, JsonSerializer); + var repo = new SqliteUserRepository(LogManager, ApplicationPaths, JsonSerializer, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); return repo; } @@ -680,36 +693,36 @@ namespace MediaBrowser.Server.Startup.Common /// <returns>Task{IUserRepository}.</returns> private async Task<IFileOrganizationRepository> GetFileOrganizationRepository() { - var repo = new SqliteFileOrganizationRepository(LogManager, ServerConfigurationManager.ApplicationPaths); + var repo = new SqliteFileOrganizationRepository(LogManager, ServerConfigurationManager.ApplicationPaths, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); return repo; } private async Task<IAuthenticationRepository> GetAuthenticationRepository() { - var repo = new AuthenticationRepository(LogManager, ServerConfigurationManager.ApplicationPaths); + var repo = new AuthenticationRepository(LogManager, ServerConfigurationManager.ApplicationPaths, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); return repo; } private async Task<IActivityRepository> GetActivityLogRepository() { - var repo = new ActivityRepository(LogManager, ServerConfigurationManager.ApplicationPaths); + var repo = new ActivityRepository(LogManager, ServerConfigurationManager.ApplicationPaths, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); return repo; } private async Task<ISyncRepository> GetSyncRepository() { - var repo = new SyncRepository(LogManager, JsonSerializer, ServerConfigurationManager.ApplicationPaths); + var repo = new SyncRepository(LogManager, JsonSerializer, ServerConfigurationManager.ApplicationPaths, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); return repo; } @@ -717,12 +730,11 @@ namespace MediaBrowser.Server.Startup.Common /// <summary> /// Configures the repositories. /// </summary> - /// <returns>Task.</returns> private async Task ConfigureNotificationsRepository() { - var repo = new SqliteNotificationsRepository(LogManager, ApplicationPaths); + var repo = new SqliteNotificationsRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector()); - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); + await repo.Initialize().ConfigureAwait(false); NotificationsRepository = repo; @@ -730,19 +742,6 @@ namespace MediaBrowser.Server.Startup.Common } /// <summary> - /// Configures the user data repositories. - /// </summary> - /// <returns>Task.</returns> - private async Task ConfigureUserDataRepositories() - { - var repo = new SqliteUserDataRepository(LogManager, ApplicationPaths); - - await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); - - ((UserDataManager)UserDataManager).Repository = repo; - } - - /// <summary> /// Dirty hacks /// </summary> private void SetStaticProperties() @@ -797,15 +796,11 @@ namespace MediaBrowser.Server.Startup.Common ProviderManager.AddParts(GetExports<IImageProvider>(), GetExports<IMetadataService>(), - GetExports<IItemIdentityProvider>(), - GetExports<IItemIdentityConverter>(), GetExports<IMetadataProvider>(), GetExports<IMetadataSaver>(), GetExports<IImageSaver>(), GetExports<IExternalId>()); - SeriesOrderManager.AddParts(GetExports<ISeriesOrderProvider>()); - ImageProcessor.AddParts(GetExports<IImageEnhancer>()); LiveTvManager.AddParts(GetExports<ILiveTvService>(), GetExports<ITunerHost>(), GetExports<IListingsProvider>()); @@ -825,19 +820,57 @@ namespace MediaBrowser.Server.Startup.Common private string CertificatePath { get; set; } + private string NormalizeConfiguredLocalAddress(string address) + { + var index = address.Trim('/').IndexOf('/'); + + if (index != -1) + { + address = address.Substring(index + 1); + } + + return address.Trim('/'); + } private IEnumerable<string> GetUrlPrefixes() { - var prefixes = new List<string> - { - "http://+:" + ServerConfigurationManager.Configuration.HttpServerPortNumber + "/" - }; + var hosts = ServerConfigurationManager + .Configuration + .LocalNetworkAddresses + .Select(NormalizeConfiguredLocalAddress) + .ToList(); - if (!string.IsNullOrWhiteSpace(CertificatePath)) + if (hosts.Count == 0) { - prefixes.Add("https://+:" + ServerConfigurationManager.Configuration.HttpsPortNumber + "/"); + hosts.Add("+"); } - return prefixes; + if (!hosts.Contains("+", StringComparer.OrdinalIgnoreCase)) + { + if (!hosts.Contains("localhost", StringComparer.OrdinalIgnoreCase)) + { + hosts.Add("localhost"); + } + + if (!hosts.Contains("127.0.0.1", StringComparer.OrdinalIgnoreCase)) + { + hosts.Add("127.0.0.1"); + } + } + + return hosts.SelectMany(i => + { + var prefixes = new List<string> + { + "http://"+i+":" + ServerConfigurationManager.Configuration.HttpServerPortNumber + "/" + }; + + if (!string.IsNullOrWhiteSpace(CertificatePath)) + { + prefixes.Add("https://" + i + ":" + ServerConfigurationManager.Configuration.HttpsPortNumber + "/"); + } + + return prefixes; + }); } /// <summary> @@ -1056,8 +1089,10 @@ namespace MediaBrowser.Server.Startup.Common /// Gets the system status. /// </summary> /// <returns>SystemInfo.</returns> - public virtual SystemInfo GetSystemInfo() + public async Task<SystemInfo> GetSystemInfo() { + var localAddress = await GetLocalApiUrl().ConfigureAwait(false); + return new SystemInfo { HasPendingRestart = HasPendingRestart, @@ -1088,8 +1123,10 @@ namespace MediaBrowser.Server.Startup.Common IsRunningAsService = IsRunningAsService, SupportsRunningAsService = SupportsRunningAsService, ServerName = FriendlyName, - LocalAddress = LocalApiUrl, - SupportsLibraryMonitor = SupportsLibraryMonitor + LocalAddress = localAddress, + SupportsLibraryMonitor = SupportsLibraryMonitor, + EncoderLocationType = MediaEncoder.EncoderLocationType, + SystemArchitecture = NativeApp.Environment.SystemArchitecture }; } @@ -1106,29 +1143,26 @@ namespace MediaBrowser.Server.Startup.Common get { return !string.IsNullOrWhiteSpace(HttpServer.CertificatePath); } } - public string LocalApiUrl + public async Task<string> GetLocalApiUrl() { - get + try { - try - { - // Return the first matched address, if found, or the first known local address - var address = LocalIpAddresses.FirstOrDefault(i => !IPAddress.IsLoopback(i)); + // Return the first matched address, if found, or the first known local address + var address = (await GetLocalIpAddresses().ConfigureAwait(false)).FirstOrDefault(i => !IPAddress.IsLoopback(i)); - if (address != null) - { - return GetLocalApiUrl(address); - } - - return null; - } - catch (Exception ex) + if (address != null) { - Logger.ErrorException("Error getting local Ip address information", ex); + return GetLocalApiUrl(address); } return null; } + catch (Exception ex) + { + Logger.ErrorException("Error getting local Ip address information", ex); + } + + return null; } public string GetLocalApiUrl(IPAddress ipAddress) @@ -1148,16 +1182,13 @@ namespace MediaBrowser.Server.Startup.Common HttpPort.ToString(CultureInfo.InvariantCulture)); } - public List<IPAddress> LocalIpAddresses + public async Task<List<IPAddress>> GetLocalIpAddresses() { - get - { - var localAddresses = NetworkManager.GetLocalIpAddresses() - .Where(IsIpAddressValid) - .ToList(); + var localAddresses = NetworkManager.GetLocalIpAddresses() + .Where(IsIpAddressValid) + .ToList(); - return localAddresses; - } + return localAddresses; } private readonly ConcurrentDictionary<string, bool> _validAddressResults = new ConcurrentDictionary<string, bool>(StringComparer.OrdinalIgnoreCase); @@ -1343,7 +1374,6 @@ namespace MediaBrowser.Server.Startup.Common /// <param name="package">The package that contains the update</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> public override async Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress) { await InstallationManager.InstallPackage(package, false, progress, cancellationToken).ConfigureAwait(false); |
