Prechádzať zdrojové kódy

Merge pull request #9191 from barronpm/applicationhost-cleanup1

Cody Robibero 2 rokov pred
rodič
commit
58b3945805

+ 7 - 71
Emby.Server.Implementations/ApplicationHost.cs

@@ -11,7 +11,6 @@ using System.IO;
 using System.Linq;
 using System.Net;
 using System.Reflection;
-using System.Runtime.InteropServices;
 using System.Security.Cryptography.X509Certificates;
 using System.Threading;
 using System.Threading.Tasks;
@@ -113,15 +112,11 @@ namespace Emby.Server.Implementations
     /// </summary>
     public abstract class ApplicationHost : IServerApplicationHost, IAsyncDisposable, IDisposable
     {
-        /// <summary>
-        /// The environment variable prefixes to log at server startup.
-        /// </summary>
-        private static readonly string[] _relevantEnvVarPrefixes = { "JELLYFIN_", "DOTNET_", "ASPNETCORE_" };
-
         /// <summary>
         /// The disposable parts.
         /// </summary>
         private readonly ConcurrentDictionary<IDisposable, byte> _disposableParts = new();
+        private readonly DeviceId _deviceId;
 
         private readonly IFileSystem _fileSystemManager;
         private readonly IConfiguration _startupConfig;
@@ -130,7 +125,6 @@ namespace Emby.Server.Implementations
         private readonly IPluginManager _pluginManager;
 
         private List<Type> _creatingInstances;
-        private IMediaEncoder _mediaEncoder;
         private ISessionManager _sessionManager;
 
         /// <summary>
@@ -139,8 +133,6 @@ namespace Emby.Server.Implementations
         /// <value>All concrete types.</value>
         private Type[] _allConcreteTypes;
 
-        private DeviceId _deviceId;
-
         private bool _disposed = false;
 
         /// <summary>
@@ -164,6 +156,7 @@ namespace Emby.Server.Implementations
 
             Logger = LoggerFactory.CreateLogger<ApplicationHost>();
             _fileSystemManager.AddShortcutHandler(new MbLinkShortcutHandler(_fileSystemManager));
+            _deviceId = new DeviceId(ApplicationPaths, LoggerFactory);
 
             ApplicationVersion = typeof(ApplicationHost).Assembly.GetName().Version;
             ApplicationVersionString = ApplicationVersion.ToString(3);
@@ -191,23 +184,9 @@ namespace Emby.Server.Implementations
 
         public bool CoreStartupHasCompleted { get; private set; }
 
-        public virtual bool CanLaunchWebBrowser
-        {
-            get
-            {
-                if (!Environment.UserInteractive)
-                {
-                    return false;
-                }
-
-                if (_startupOptions.IsService)
-                {
-                    return false;
-                }
-
-                return OperatingSystem.IsWindows() || OperatingSystem.IsMacOS();
-            }
-        }
+        public virtual bool CanLaunchWebBrowser => Environment.UserInteractive
+            && !_startupOptions.IsService
+            && (OperatingSystem.IsWindows() || OperatingSystem.IsMacOS());
 
         /// <summary>
         /// Gets the <see cref="INetworkManager"/> singleton instance.
@@ -284,15 +263,7 @@ namespace Emby.Server.Implementations
         /// <value>The application name.</value>
         public string ApplicationProductName { get; } = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location).ProductName;
 
-        public string SystemId
-        {
-            get
-            {
-                _deviceId ??= new DeviceId(ApplicationPaths, LoggerFactory);
-
-                return _deviceId.Value;
-            }
-        }
+        public string SystemId => _deviceId.Value;
 
         /// <inheritdoc/>
         public string Name => ApplicationProductName;
@@ -445,7 +416,7 @@ namespace Emby.Server.Implementations
             ConfigurationManager.ConfigurationUpdated += OnConfigurationUpdated;
             ConfigurationManager.NamedConfigurationUpdated += OnConfigurationUpdated;
 
-            _mediaEncoder.SetFFmpegPath();
+            Resolve<IMediaEncoder>().SetFFmpegPath();
 
             Logger.LogInformation("ServerId: {ServerId}", SystemId);
 
@@ -655,7 +626,6 @@ namespace Emby.Server.Implementations
             var localizationManager = (LocalizationManager)Resolve<ILocalizationManager>();
             await localizationManager.LoadAll().ConfigureAwait(false);
 
-            _mediaEncoder = Resolve<IMediaEncoder>();
             _sessionManager = Resolve<ISessionManager>();
 
             SetStaticProperties();
@@ -666,36 +636,6 @@ namespace Emby.Server.Implementations
             FindParts();
         }
 
-        public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths)
-        {
-            // Distinct these to prevent users from reporting problems that aren't actually problems
-            var commandLineArgs = Environment
-                .GetCommandLineArgs()
-                .Distinct();
-
-            // Get all relevant environment variables
-            var allEnvVars = Environment.GetEnvironmentVariables();
-            var relevantEnvVars = new Dictionary<object, object>();
-            foreach (var key in allEnvVars.Keys)
-            {
-                if (_relevantEnvVarPrefixes.Any(prefix => key.ToString().StartsWith(prefix, StringComparison.OrdinalIgnoreCase)))
-                {
-                    relevantEnvVars.Add(key, allEnvVars[key]);
-                }
-            }
-
-            logger.LogInformation("Environment Variables: {EnvVars}", relevantEnvVars);
-            logger.LogInformation("Arguments: {Args}", commandLineArgs);
-            logger.LogInformation("Operating system: {OS}", RuntimeInformation.OSDescription);
-            logger.LogInformation("Architecture: {Architecture}", RuntimeInformation.OSArchitecture);
-            logger.LogInformation("64-Bit Process: {Is64Bit}", Environment.Is64BitProcess);
-            logger.LogInformation("User Interactive: {IsUserInteractive}", Environment.UserInteractive);
-            logger.LogInformation("Processor count: {ProcessorCount}", Environment.ProcessorCount);
-            logger.LogInformation("Program data path: {ProgramDataPath}", appPaths.ProgramDataPath);
-            logger.LogInformation("Web resources path: {WebPath}", appPaths.WebPath);
-            logger.LogInformation("Application directory: {ApplicationPath}", appPaths.ProgramSystemPath);
-        }
-
         private X509Certificate2 GetCertificate(string path, string password)
         {
             if (string.IsNullOrWhiteSpace(path))
@@ -782,10 +722,6 @@ namespace Emby.Server.Implementations
 
             Resolve<ILiveTvManager>().AddParts(GetExports<ILiveTvService>(), GetExports<ITunerHost>(), GetExports<IListingsProvider>());
 
-            Resolve<ISubtitleManager>().AddParts(GetExports<ISubtitleProvider>());
-
-            Resolve<IChannelManager>().AddParts(GetExports<IChannel>());
-
             Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
         }
 

+ 5 - 8
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -66,6 +66,7 @@ namespace Emby.Server.Implementations.Channels
         /// <param name="userDataManager">The user data manager.</param>
         /// <param name="providerManager">The provider manager.</param>
         /// <param name="memoryCache">The memory cache.</param>
+        /// <param name="channels">The channels.</param>
         public ChannelManager(
             IUserManager userManager,
             IDtoService dtoService,
@@ -75,7 +76,8 @@ namespace Emby.Server.Implementations.Channels
             IFileSystem fileSystem,
             IUserDataManager userDataManager,
             IProviderManager providerManager,
-            IMemoryCache memoryCache)
+            IMemoryCache memoryCache,
+            IEnumerable<IChannel> channels)
         {
             _userManager = userManager;
             _dtoService = dtoService;
@@ -86,18 +88,13 @@ namespace Emby.Server.Implementations.Channels
             _userDataManager = userDataManager;
             _providerManager = providerManager;
             _memoryCache = memoryCache;
+            Channels = channels.ToArray();
         }
 
-        internal IChannel[] Channels { get; private set; }
+        internal IChannel[] Channels { get; }
 
         private static TimeSpan CacheLength => TimeSpan.FromHours(3);
 
-        /// <inheritdoc />
-        public void AddParts(IEnumerable<IChannel> channels)
-        {
-            Channels = channels.ToArray();
-        }
-
         /// <inheritdoc />
         public bool EnableMediaSourceDisplay(BaseItem item)
         {

+ 40 - 0
Jellyfin.Server/Helpers/StartupHelpers.cs

@@ -1,7 +1,10 @@
 using System;
+using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
+using System.Linq;
 using System.Net;
+using System.Runtime.InteropServices;
 using System.Runtime.Versioning;
 using System.Text;
 using System.Threading.Tasks;
@@ -22,6 +25,43 @@ namespace Jellyfin.Server.Helpers;
 /// </summary>
 public static class StartupHelpers
 {
+    private static readonly string[] _relevantEnvVarPrefixes = { "JELLYFIN_", "DOTNET_", "ASPNETCORE_" };
+
+    /// <summary>
+    /// Logs relevant environment variables and information about the host.
+    /// </summary>
+    /// <param name="logger">The logger to use.</param>
+    /// <param name="appPaths">The application paths to use.</param>
+    public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths)
+    {
+        // Distinct these to prevent users from reporting problems that aren't actually problems
+        var commandLineArgs = Environment
+            .GetCommandLineArgs()
+            .Distinct();
+
+        // Get all relevant environment variables
+        var allEnvVars = Environment.GetEnvironmentVariables();
+        var relevantEnvVars = new Dictionary<object, object>();
+        foreach (var key in allEnvVars.Keys)
+        {
+            if (_relevantEnvVarPrefixes.Any(prefix => key.ToString()!.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)))
+            {
+                relevantEnvVars.Add(key, allEnvVars[key]!);
+            }
+        }
+
+        logger.LogInformation("Environment Variables: {EnvVars}", relevantEnvVars);
+        logger.LogInformation("Arguments: {Args}", commandLineArgs);
+        logger.LogInformation("Operating system: {OS}", RuntimeInformation.OSDescription);
+        logger.LogInformation("Architecture: {Architecture}", RuntimeInformation.OSArchitecture);
+        logger.LogInformation("64-Bit Process: {Is64Bit}", Environment.Is64BitProcess);
+        logger.LogInformation("User Interactive: {IsUserInteractive}", Environment.UserInteractive);
+        logger.LogInformation("Processor count: {ProcessorCount}", Environment.ProcessorCount);
+        logger.LogInformation("Program data path: {ProgramDataPath}", appPaths.ProgramDataPath);
+        logger.LogInformation("Web resources path: {WebPath}", appPaths.WebPath);
+        logger.LogInformation("Application directory: {ApplicationPath}", appPaths.ProgramSystemPath);
+    }
+
     /// <summary>
     /// Create the data, config and log paths from the variety of inputs(command line args,
     /// environment variables) or decide on what default to use. For Windows it's %AppPath%

+ 1 - 1
Jellyfin.Server/Program.cs

@@ -148,7 +148,7 @@ namespace Jellyfin.Server
                 "Jellyfin version: {Version}",
                 Assembly.GetEntryAssembly()!.GetName().Version!.ToString(3));
 
-            ApplicationHost.LogEnvironmentInfo(_logger, appPaths);
+            StartupHelpers.LogEnvironmentInfo(_logger, appPaths);
 
             // If hosting the web client, validate the client content path
             if (startupConfig.HostWebClient())

+ 0 - 6
MediaBrowser.Controller/Channels/IChannelManager.cs

@@ -15,12 +15,6 @@ namespace MediaBrowser.Controller.Channels
 {
     public interface IChannelManager
     {
-        /// <summary>
-        /// Adds the parts.
-        /// </summary>
-        /// <param name="channels">The channels.</param>
-        void AddParts(IEnumerable<IChannel> channels);
-
         /// <summary>
         /// Gets the channel features.
         /// </summary>

+ 0 - 6
MediaBrowser.Controller/Subtitles/ISubtitleManager.cs

@@ -19,12 +19,6 @@ namespace MediaBrowser.Controller.Subtitles
         /// </summary>
         event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
 
-        /// <summary>
-        /// Adds the parts.
-        /// </summary>
-        /// <param name="subtitleProviders">The subtitle providers.</param>
-        void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders);
-
         /// <summary>
         /// Searches the subtitles.
         /// </summary>

+ 6 - 10
MediaBrowser.Providers/Subtitles/SubtitleManager.cs

@@ -35,33 +35,29 @@ namespace MediaBrowser.Providers.Subtitles
         private readonly IMediaSourceManager _mediaSourceManager;
         private readonly ILocalizationManager _localization;
 
-        private ISubtitleProvider[] _subtitleProviders;
+        private readonly ISubtitleProvider[] _subtitleProviders;
 
         public SubtitleManager(
             ILogger<SubtitleManager> logger,
             IFileSystem fileSystem,
             ILibraryMonitor monitor,
             IMediaSourceManager mediaSourceManager,
-            ILocalizationManager localizationManager)
+            ILocalizationManager localizationManager,
+            IEnumerable<ISubtitleProvider> subtitleProviders)
         {
             _logger = logger;
             _fileSystem = fileSystem;
             _monitor = monitor;
             _mediaSourceManager = mediaSourceManager;
             _localization = localizationManager;
-        }
-
-        /// <inheritdoc />
-        public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
-
-        /// <inheritdoc />
-        public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders)
-        {
             _subtitleProviders = subtitleProviders
                 .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)
                 .ToArray();
         }
 
+        /// <inheritdoc />
+        public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
+
         /// <inheritdoc />
         public async Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, CancellationToken cancellationToken)
         {