Pārlūkot izejas kodu

Fix more warnings

Bond_009 5 gadi atpakaļ
vecāks
revīzija
42ffddc269
97 mainītis faili ar 614 papildinājumiem un 269 dzēšanām
  1. 15 0
      Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
  2. 2 0
      Emby.Server.Implementations/Activity/ActivityManager.cs
  3. 2 0
      Emby.Server.Implementations/Activity/ActivityRepository.cs
  4. 19 2
      Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
  5. 1 7
      Emby.Server.Implementations/Archiving/ZipClient.cs
  6. 2 0
      Emby.Server.Implementations/Branding/BrandingConfigurationFactory.cs
  7. 2 1
      Emby.Server.Implementations/Browser/BrowserLauncher.cs
  8. 8 0
      Emby.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs
  9. 2 0
      Emby.Server.Implementations/Channels/ChannelImageProvider.cs
  10. 2 0
      Emby.Server.Implementations/Channels/ChannelManager.cs
  11. 2 0
      Emby.Server.Implementations/Channels/ChannelPostScanTask.cs
  12. 2 0
      Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs
  13. 2 0
      Emby.Server.Implementations/Collections/CollectionImageProvider.cs
  14. 2 0
      Emby.Server.Implementations/Collections/CollectionManager.cs
  15. 23 7
      Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
  16. 13 0
      Emby.Server.Implementations/Cryptography/CryptographyProvider.cs
  17. 6 0
      Emby.Server.Implementations/Data/BaseSqliteRepository.cs
  18. 2 0
      Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs
  19. 2 0
      Emby.Server.Implementations/Data/ManagedConnection.cs
  20. 2 0
      Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
  21. 2 0
      Emby.Server.Implementations/Data/SqliteExtensions.cs
  22. 2 0
      Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
  23. 2 0
      Emby.Server.Implementations/Data/SqliteUserRepository.cs
  24. 4 7
      Emby.Server.Implementations/Data/TypeMapper.cs
  25. 2 0
      Emby.Server.Implementations/Devices/DeviceId.cs
  26. 2 0
      Emby.Server.Implementations/Devices/DeviceManager.cs
  27. 2 0
      Emby.Server.Implementations/Diagnostics/CommonProcess.cs
  28. 2 0
      Emby.Server.Implementations/Diagnostics/ProcessFactory.cs
  29. 2 0
      Emby.Server.Implementations/Dto/DtoService.cs
  30. 2 0
      Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
  31. 2 0
      Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
  32. 2 0
      Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
  33. 2 0
      Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs
  34. 23 14
      Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs
  35. 63 44
      Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs
  36. 12 9
      Emby.Server.Implementations/EntryPoints/StartupWizard.cs
  37. 19 16
      Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
  38. 2 0
      Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
  39. 1 0
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  40. 2 0
      Emby.Server.Implementations/HttpServer/FileWriter.cs
  41. 2 0
      Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
  42. 4 4
      Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
  43. 2 0
      Emby.Server.Implementations/HttpServer/IHttpListener.cs
  44. 2 0
      Emby.Server.Implementations/HttpServer/RangeRequestWriter.cs
  45. 9 3
      Emby.Server.Implementations/HttpServer/ResponseFilter.cs
  46. 2 0
      Emby.Server.Implementations/HttpServer/Security/AuthService.cs
  47. 2 0
      Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
  48. 2 0
      Emby.Server.Implementations/HttpServer/Security/SessionContext.cs
  49. 30 27
      Emby.Server.Implementations/HttpServer/StreamWriter.cs
  50. 57 53
      Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
  51. 2 0
      Emby.Server.Implementations/IO/ExtendedFileSystemInfo.cs
  52. 2 0
      Emby.Server.Implementations/IO/FileRefresher.cs
  53. 6 4
      Emby.Server.Implementations/IO/LibraryMonitor.cs
  54. 2 0
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  55. 2 0
      Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
  56. 2 0
      Emby.Server.Implementations/IO/StreamHelper.cs
  57. 2 0
      Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
  58. 4 0
      Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
  59. 9 1
      Emby.Server.Implementations/Library/DefaultAuthenticationProvider.cs
  60. 11 2
      Emby.Server.Implementations/Library/DefaultPasswordResetProvider.cs
  61. 2 0
      Emby.Server.Implementations/Library/ExclusiveLiveStream.cs
  62. 11 0
      Emby.Server.Implementations/Library/InvalidAuthProvider.cs
  63. 2 0
      Emby.Server.Implementations/Library/LibraryManager.cs
  64. 2 0
      Emby.Server.Implementations/Library/LiveStreamHelper.cs
  65. 2 0
      Emby.Server.Implementations/Library/MediaSourceManager.cs
  66. 2 0
      Emby.Server.Implementations/Library/MediaStreamSelector.cs
  67. 2 0
      Emby.Server.Implementations/Library/MusicManager.cs
  68. 4 0
      Emby.Server.Implementations/Library/PathExtensions.cs
  69. 3 1
      Emby.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs
  70. 27 8
      Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
  71. 12 3
      Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
  72. 3 1
      Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
  73. 2 13
      Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs
  74. 2 2
      Emby.Server.Implementations/Library/Resolvers/FolderResolver.cs
  75. 1 1
      Emby.Server.Implementations/Library/Resolvers/ItemResolver.cs
  76. 2 3
      Emby.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs
  77. 8 2
      Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  78. 10 0
      Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs
  79. 2 0
      Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs
  80. 2 1
      Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs
  81. 2 0
      Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
  82. 6 1
      Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
  83. 9 1
      Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
  84. 2 0
      Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs
  85. 2 2
      Emby.Server.Implementations/Library/SearchEngine.cs
  86. 3 1
      Emby.Server.Implementations/Library/UserDataManager.cs
  87. 19 9
      Emby.Server.Implementations/Library/UserManager.cs
  88. 2 0
      Emby.Server.Implementations/Library/UserViewManager.cs
  89. 4 2
      Emby.Server.Implementations/Library/Validators/ArtistsPostScanTask.cs
  90. 3 3
      Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs
  91. 3 0
      Emby.Server.Implementations/Library/Validators/GenresPostScanTask.cs
  92. 12 3
      Emby.Server.Implementations/Library/Validators/GenresValidator.cs
  93. 2 2
      Emby.Server.Implementations/Library/Validators/MusicGenresPostScanTask.cs
  94. 12 3
      Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs
  95. 1 0
      Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
  96. 3 3
      Emby.Server.Implementations/Library/Validators/StudiosPostScanTask.cs
  97. 13 3
      Emby.Server.Implementations/Library/Validators/StudiosValidator.cs

+ 15 - 0
Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -39,6 +41,19 @@ namespace Emby.Server.Implementations.Activity
         private readonly IServerApplicationHost _appHost;
         private readonly IDeviceManager _deviceManager;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ActivityLogEntryPoint"/> class.
+        /// </summary>
+        /// <param name="logger"></param>
+        /// <param name="sessionManager"></param>
+        /// <param name="deviceManager"></param>
+        /// <param name="taskManager"></param>
+        /// <param name="activityManager"></param>
+        /// <param name="localization"></param>
+        /// <param name="installationManager"></param>
+        /// <param name="subManager"></param>
+        /// <param name="userManager"></param>
+        /// <param name="appHost"></param>
         public ActivityLogEntryPoint(
             ILogger<ActivityLogEntryPoint> logger,
             ISessionManager sessionManager,

+ 2 - 0
Emby.Server.Implementations/Activity/ActivityManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Linq;
 using MediaBrowser.Controller.Library;

+ 2 - 0
Emby.Server.Implementations/Activity/ActivityRepository.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 19 - 2
Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs

@@ -84,6 +84,7 @@ namespace Emby.Server.Implementations.AppBase
         /// </summary>
         /// <value>The logger.</value>
         protected ILogger Logger { get; private set; }
+
         /// <summary>
         /// Gets the XML serializer.
         /// </summary>
@@ -131,6 +132,10 @@ namespace Emby.Server.Implementations.AppBase
             }
         }
 
+        /// <summary>
+        /// Adds parts.
+        /// </summary>
+        /// <param name="factories">The configuration factories.</param>
         public virtual void AddParts(IEnumerable<IConfigurationFactory> factories)
         {
             _configurationFactories = factories.ToArray();
@@ -223,7 +228,7 @@ namespace Emby.Server.Implementations.AppBase
         /// Replaces the cache path.
         /// </summary>
         /// <param name="newConfig">The new configuration.</param>
-        /// <exception cref="DirectoryNotFoundException"></exception>
+        /// <exception cref="DirectoryNotFoundException">The new cache path doesn't exist.</exception>
         private void ValidateCachePath(BaseApplicationConfiguration newConfig)
         {
             var newPath = newConfig.CachePath;
@@ -234,7 +239,7 @@ namespace Emby.Server.Implementations.AppBase
                 // Validate
                 if (!Directory.Exists(newPath))
                 {
-                    throw new FileNotFoundException(
+                    throw new DirectoryNotFoundException(
                         string.Format(
                             CultureInfo.InvariantCulture,
                             "{0} does not exist.",
@@ -245,6 +250,10 @@ namespace Emby.Server.Implementations.AppBase
             }
         }
 
+        /// <summary>
+        /// Ensures that we have write access to the path.
+        /// </summary>
+        /// <param name="path">The path.</param>
         protected void EnsureWriteAccess(string path)
         {
             var file = Path.Combine(path, Guid.NewGuid().ToString());
@@ -257,6 +266,7 @@ namespace Emby.Server.Implementations.AppBase
             return Path.Combine(CommonApplicationPaths.ConfigurationDirectoryPath, key.ToLowerInvariant() + ".xml");
         }
 
+        /// <inheritdoc />
         public object GetConfiguration(string key)
         {
             return _configurations.GetOrAdd(key, k =>
@@ -303,6 +313,7 @@ namespace Emby.Server.Implementations.AppBase
             }
         }
 
+        /// <inheritdoc />
         public void SaveConfiguration(string key, object configuration)
         {
             var configurationStore = GetConfigurationStore(key);
@@ -339,6 +350,11 @@ namespace Emby.Server.Implementations.AppBase
             OnNamedConfigurationUpdated(key, configuration);
         }
 
+        /// <summary>
+        /// Event handler for when a named configuration got updates.
+        /// </summary>
+        /// <param name="key">The key of the configuration.</param>
+        /// <param name="configuration">The old configuration.</param>
         protected virtual void OnNamedConfigurationUpdated(string key, object configuration)
         {
             NamedConfigurationUpdated?.Invoke(this, new ConfigurationUpdateEventArgs
@@ -348,6 +364,7 @@ namespace Emby.Server.Implementations.AppBase
             });
         }
 
+        /// <inheritdoc />
         public Type GetConfigurationType(string key)
         {
             return GetConfigurationStore(key)

+ 1 - 7
Emby.Server.Implementations/Archiving/ZipClient.cs

@@ -10,15 +10,10 @@ using SharpCompress.Readers.Zip;
 namespace Emby.Server.Implementations.Archiving
 {
     /// <summary>
-    /// Class DotNetZipClient
+    /// Class DotNetZipClient.
     /// </summary>
     public class ZipClient : IZipClient
     {
-        public ZipClient()
-        {
-
-        }
-
         /// <summary>
         /// Extracts all.
         /// </summary>
@@ -144,7 +139,6 @@ namespace Emby.Server.Implementations.Archiving
             }
         }
 
-
         /// <summary>
         /// Extracts all from tar.
         /// </summary>

+ 2 - 0
Emby.Server.Implementations/Branding/BrandingConfigurationFactory.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System.Collections.Generic;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Model.Branding;

+ 2 - 1
Emby.Server.Implementations/Browser/BrowserLauncher.cs

@@ -4,7 +4,7 @@ using MediaBrowser.Controller;
 namespace Emby.Server.Implementations.Browser
 {
     /// <summary>
-    /// Class BrowserLauncher
+    /// Class BrowserLauncher.
     /// </summary>
     public static class BrowserLauncher
     {
@@ -32,6 +32,7 @@ namespace Emby.Server.Implementations.Browser
         /// <summary>
         /// Opens the URL.
         /// </summary>
+        /// <param name="appHost">The application host instance.</param>
         /// <param name="url">The URL.</param>
         private static void OpenUrl(IServerApplicationHost appHost, string url)
         {

+ 8 - 0
Emby.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Threading;
@@ -13,11 +15,16 @@ namespace Emby.Server.Implementations.Channels
     {
         private readonly ChannelManager _channelManager;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ChannelDynamicMediaSourceProvider"/> class.
+        /// </summary>
+        /// <param name="channelManager">The channel manager.</param>
         public ChannelDynamicMediaSourceProvider(IChannelManager channelManager)
         {
             _channelManager = (ChannelManager)channelManager;
         }
 
+        /// <inheritdoc />
         public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(BaseItem item, CancellationToken cancellationToken)
         {
             if (item.SourceType == SourceType.Channel)
@@ -28,6 +35,7 @@ namespace Emby.Server.Implementations.Channels
             return Task.FromResult<IEnumerable<MediaSourceInfo>>(new List<MediaSourceInfo>());
         }
 
+        /// <inheritdoc />
         public Task<ILiveStream> OpenMediaSource(string openToken, List<ILiveStream> currentLiveStreams, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();

+ 2 - 0
Emby.Server.Implementations/Channels/ChannelImageProvider.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading;

+ 2 - 0
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;

+ 2 - 0
Emby.Server.Implementations/Channels/ChannelPostScanTask.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Linq;
 using System.Threading;

+ 2 - 0
Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Threading;

+ 2 - 0
Emby.Server.Implementations/Collections/CollectionImageProvider.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;

+ 2 - 0
Emby.Server.Implementations/Collections/CollectionManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 23 - 7
Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using Emby.Server.Implementations.AppBase;
 using MediaBrowser.Common.Configuration;
@@ -17,7 +19,6 @@ namespace Emby.Server.Implementations.Configuration
     /// </summary>
     public class ServerConfigurationManager : BaseConfigurationManager, IServerConfigurationManager
     {
-
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerConfigurationManager" /> class.
         /// </summary>
@@ -31,6 +32,9 @@ namespace Emby.Server.Implementations.Configuration
             UpdateMetadataPath();
         }
 
+        /// <summary>
+        /// Configuration updating event.
+        /// </summary>
         public event EventHandler<GenericEventArgs<ServerConfiguration>> ConfigurationUpdating;
 
         /// <summary>
@@ -97,7 +101,7 @@ namespace Emby.Server.Implementations.Configuration
         /// Validates the SSL certificate.
         /// </summary>
         /// <param name="newConfig">The new configuration.</param>
-        /// <exception cref="DirectoryNotFoundException"></exception>
+        /// <exception cref="FileNotFoundException">The certificate path doesn't exist.</exception>
         private void ValidateSslCertificate(BaseApplicationConfiguration newConfig)
         {
             var serverConfig = (ServerConfiguration)newConfig;
@@ -105,12 +109,16 @@ namespace Emby.Server.Implementations.Configuration
             var newPath = serverConfig.CertificatePath;
 
             if (!string.IsNullOrWhiteSpace(newPath)
-                && !string.Equals(Configuration.CertificatePath ?? string.Empty, newPath))
+                && !string.Equals(Configuration.CertificatePath, newPath, StringComparison.Ordinal))
             {
                 // Validate
                 if (!File.Exists(newPath))
                 {
-                    throw new FileNotFoundException(string.Format("Certificate file '{0}' does not exist.", newPath));
+                    throw new FileNotFoundException(
+                        string.Format(
+                            CultureInfo.InvariantCulture,
+                            "Certificate file '{0}' does not exist.",
+                            newPath));
                 }
             }
         }
@@ -119,24 +127,32 @@ namespace Emby.Server.Implementations.Configuration
         /// Validates the metadata path.
         /// </summary>
         /// <param name="newConfig">The new configuration.</param>
-        /// <exception cref="DirectoryNotFoundException"></exception>
+        /// <exception cref="DirectoryNotFoundException">The new config path doesn't exist.</exception>
         private void ValidateMetadataPath(ServerConfiguration newConfig)
         {
             var newPath = newConfig.MetadataPath;
 
             if (!string.IsNullOrWhiteSpace(newPath)
-                && !string.Equals(Configuration.MetadataPath ?? string.Empty, newPath))
+                && !string.Equals(Configuration.MetadataPath, newPath,  StringComparison.Ordinal))
             {
                 // Validate
                 if (!Directory.Exists(newPath))
                 {
-                    throw new FileNotFoundException(string.Format("{0} does not exist.", newPath));
+                    throw new DirectoryNotFoundException(
+                        string.Format(
+                            CultureInfo.InvariantCulture,
+                            "{0} does not exist.",
+                            newPath));
                 }
 
                 EnsureWriteAccess(newPath);
             }
         }
 
+        /// <summary>
+        /// Sets all config values to the optimal value.
+        /// </summary>
+        /// <returns>If the configuration changed.</returns>
         public bool SetOptimalValues()
         {
             var config = Configuration;

+ 13 - 0
Emby.Server.Implementations/Cryptography/CryptographyProvider.cs

@@ -6,6 +6,9 @@ using static MediaBrowser.Common.Cryptography.Constants;
 
 namespace Emby.Server.Implementations.Cryptography
 {
+    /// <summary>
+    /// Class providing abstractions over cryptographic functions.
+    /// </summary>
     public class CryptographyProvider : ICryptoProvider, IDisposable
     {
         private static readonly HashSet<string> _supportedHashMethods = new HashSet<string>()
@@ -42,8 +45,10 @@ namespace Emby.Server.Implementations.Cryptography
             _randomNumberGenerator = RandomNumberGenerator.Create();
         }
 
+        /// <inheritdoc />
         public string DefaultHashMethod => "PBKDF2";
 
+        /// <inheritdoc />
         public IEnumerable<string> GetSupportedHashMethods()
             => _supportedHashMethods;
 
@@ -62,6 +67,7 @@ namespace Emby.Server.Implementations.Cryptography
             throw new CryptographicException($"Cannot currently use PBKDF2 with requested hash method: {method}");
         }
 
+        /// <inheritdoc />
         public byte[] ComputeHash(string hashMethod, byte[] bytes, byte[] salt)
         {
             if (hashMethod == DefaultHashMethod)
@@ -89,12 +95,15 @@ namespace Emby.Server.Implementations.Cryptography
             throw new CryptographicException($"Requested hash method is not supported: {hashMethod}");
         }
 
+        /// <inheritdoc />
         public byte[] ComputeHashWithDefaultMethod(byte[] bytes, byte[] salt)
             => PBKDF2(DefaultHashMethod, bytes, salt, DefaultIterations);
 
+        /// <inheritdoc />
         public byte[] GenerateSalt()
             => GenerateSalt(DefaultSaltLength);
 
+        /// <inheritdoc />
         public byte[] GenerateSalt(int length)
         {
             byte[] salt = new byte[length];
@@ -109,6 +118,10 @@ namespace Emby.Server.Implementations.Cryptography
             GC.SuppressFinalize(this);
         }
 
+        /// <summary>
+        /// Releases unmanaged and - optionally - managed resources.
+        /// </summary>
+        /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
         protected virtual void Dispose(bool disposing)
         {
             if (_disposed)

+ 6 - 0
Emby.Server.Implementations/Data/BaseSqliteRepository.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,6 +13,10 @@ namespace Emby.Server.Implementations.Data
     {
         private bool _disposed = false;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="BaseSqliteRepository"/> class.
+        /// </summary>
+        /// <param name="logger">The ogger.</param>
         protected BaseSqliteRepository(ILogger logger)
         {
             Logger = logger;

+ 2 - 0
Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Threading;
 using System.Threading.Tasks;

+ 2 - 0
Emby.Server.Implementations/Data/ManagedConnection.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Threading;

+ 2 - 0
Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/Data/SqliteExtensions.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/Data/SqliteUserDataRepository.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;

+ 2 - 0
Emby.Server.Implementations/Data/SqliteUserRepository.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;

+ 4 - 7
Emby.Server.Implementations/Data/TypeMapper.cs

@@ -5,25 +5,22 @@ using System.Linq;
 namespace Emby.Server.Implementations.Data
 {
     /// <summary>
-    /// Class TypeMapper
+    /// Class TypeMapper.
     /// </summary>
     public class TypeMapper
     {
         /// <summary>
-        /// This holds all the types in the running assemblies so that we can de-serialize properly when we don't have strong types
+        /// This holds all the types in the running assemblies
+        /// so that we can de-serialize properly when we don't have strong types.
         /// </summary>
         private readonly ConcurrentDictionary<string, Type> _typeMap = new ConcurrentDictionary<string, Type>();
 
-        public TypeMapper()
-        {
-        }
-
         /// <summary>
         /// Gets the type.
         /// </summary>
         /// <param name="typeName">Name of the type.</param>
         /// <returns>Type.</returns>
-        /// <exception cref="ArgumentNullException"></exception>
+        /// <exception cref="ArgumentNullException"><c>typeName</c> is null.</exception>
         public Type GetType(string typeName)
         {
             if (string.IsNullOrEmpty(typeName))

+ 2 - 0
Emby.Server.Implementations/Devices/DeviceId.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Globalization;
 using System.IO;

+ 2 - 0
Emby.Server.Implementations/Devices/DeviceManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/Diagnostics/CommonProcess.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Diagnostics;
 using System.IO;

+ 2 - 0
Emby.Server.Implementations/Diagnostics/ProcessFactory.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using MediaBrowser.Model.Diagnostics;
 
 namespace Emby.Server.Implementations.Diagnostics

+ 2 - 0
Emby.Server.Implementations/Dto/DtoService.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Linq;
 using System.Threading;

+ 2 - 0
Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Net;

+ 2 - 0
Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/EntryPoints/RecordingNotifier.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Linq;
 using System.Threading;

+ 23 - 14
Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Library;
@@ -12,42 +11,51 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.EntryPoints
 {
     /// <summary>
-    /// Class RefreshUsersMetadata
+    /// Class RefreshUsersMetadata.
     /// </summary>
     public class RefreshUsersMetadata : IScheduledTask, IConfigurableScheduledTask
     {
         private readonly ILogger _logger;
+
         /// <summary>
-        /// The _user manager
+        /// The _user manager.
         /// </summary>
         private readonly IUserManager _userManager;
 
         private IFileSystem _fileSystem;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="RefreshUsersMetadata" /> class.
+        /// </summary>
+        public RefreshUsersMetadata(ILogger logger, IUserManager userManager, IFileSystem fileSystem)
+        {
+            _logger = logger;
+            _userManager = userManager;
+            _fileSystem = fileSystem;
+        }
+
+        /// <inheritdoc />
         public string Name => "Refresh Users";
 
+        /// <inheritdoc />
         public string Key => "RefreshUsers";
 
+        /// <inheritdoc />
         public string Description => "Refresh user infos";
 
+        /// <inheritdoc />
         public string Category => "Library";
 
+        /// <inheritdoc />
         public bool IsHidden => true;
 
+        /// <inheritdoc />
         public bool IsEnabled => true;
 
+        /// <inheritdoc />
         public bool IsLogged => true;
 
-        /// <summary>
-        /// Initializes a new instance of the <see cref="RefreshUsersMetadata" /> class.
-        /// </summary>
-        public RefreshUsersMetadata(ILogger logger, IUserManager userManager, IFileSystem fileSystem)
-        {
-            _logger = logger;
-            _userManager = userManager;
-            _fileSystem = fileSystem;
-        }
-
+        /// <inheritdoc />
         public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
         {
             foreach (var user in _userManager.Users)
@@ -58,9 +66,10 @@ namespace Emby.Server.Implementations.EntryPoints
             }
         }
 
+        /// <inheritdoc />
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
         {
-            return new List<TaskTriggerInfo>
+            return new[]
             {
                 new TaskTriggerInfo
                 {

+ 63 - 44
Emby.Server.Implementations/EntryPoints/ServerEventNotifier.cs

@@ -16,33 +16,46 @@ using MediaBrowser.Model.Tasks;
 namespace Emby.Server.Implementations.EntryPoints
 {
     /// <summary>
-    /// Class WebSocketEvents
+    /// Class WebSocketEvents.
     /// </summary>
     public class ServerEventNotifier : IServerEntryPoint
     {
         /// <summary>
-        /// The _user manager
+        /// The _user manager.
         /// </summary>
         private readonly IUserManager _userManager;
 
         /// <summary>
-        /// The _installation manager
+        /// The _installation manager.
         /// </summary>
         private readonly IInstallationManager _installationManager;
 
         /// <summary>
-        /// The _kernel
+        /// The _kernel.
         /// </summary>
         private readonly IServerApplicationHost _appHost;
 
         /// <summary>
-        /// The _task manager
+        /// The _task manager.
         /// </summary>
         private readonly ITaskManager _taskManager;
 
         private readonly ISessionManager _sessionManager;
 
-        public ServerEventNotifier(IServerApplicationHost appHost, IUserManager userManager, IInstallationManager installationManager, ITaskManager taskManager, ISessionManager sessionManager)
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ServerEventNotifier"/> class.
+        /// </summary>
+        /// <param name="appHost">The application host.</param>
+        /// <param name="userManager">The user manager.</param>
+        /// <param name="installationManager">The installation manager.</param>
+        /// <param name="taskManager">The task manager.</param>
+        /// <param name="sessionManager">The session manager.</param>
+        public ServerEventNotifier(
+            IServerApplicationHost appHost,
+            IUserManager userManager,
+            IInstallationManager installationManager,
+            ITaskManager taskManager,
+            ISessionManager sessionManager)
         {
             _userManager = userManager;
             _installationManager = installationManager;
@@ -51,47 +64,48 @@ namespace Emby.Server.Implementations.EntryPoints
             _sessionManager = sessionManager;
         }
 
+        /// <inheritdoc />
         public Task RunAsync()
         {
-            _userManager.UserDeleted += userManager_UserDeleted;
-            _userManager.UserUpdated += userManager_UserUpdated;
-            _userManager.UserPolicyUpdated += _userManager_UserPolicyUpdated;
-            _userManager.UserConfigurationUpdated += _userManager_UserConfigurationUpdated;
+            _userManager.UserDeleted += OnUserDeleted;
+            _userManager.UserUpdated += OnUserUpdated;
+            _userManager.UserPolicyUpdated += OnUserPolicyUpdated;
+            _userManager.UserConfigurationUpdated += OnUserConfigurationUpdated;
 
-            _appHost.HasPendingRestartChanged += kernel_HasPendingRestartChanged;
+            _appHost.HasPendingRestartChanged += OnHasPendingRestartChanged;
 
-            _installationManager.PluginUninstalled += InstallationManager_PluginUninstalled;
-            _installationManager.PackageInstalling += _installationManager_PackageInstalling;
-            _installationManager.PackageInstallationCancelled += _installationManager_PackageInstallationCancelled;
-            _installationManager.PackageInstallationCompleted += _installationManager_PackageInstallationCompleted;
-            _installationManager.PackageInstallationFailed += _installationManager_PackageInstallationFailed;
+            _installationManager.PluginUninstalled += OnPluginUninstalled;
+            _installationManager.PackageInstalling += OnPackageInstalling;
+            _installationManager.PackageInstallationCancelled += OnPackageInstallationCancelled;
+            _installationManager.PackageInstallationCompleted += OnPackageInstallationCompleted;
+            _installationManager.PackageInstallationFailed += OnPackageInstallationFailed;
 
-            _taskManager.TaskCompleted += _taskManager_TaskCompleted;
+            _taskManager.TaskCompleted += OnTaskCompleted;
 
             return Task.CompletedTask;
         }
 
-        void _installationManager_PackageInstalling(object sender, InstallationEventArgs e)
+        private void OnPackageInstalling(object sender, InstallationEventArgs e)
         {
             SendMessageToAdminSessions("PackageInstalling", e.InstallationInfo);
         }
 
-        void _installationManager_PackageInstallationCancelled(object sender, InstallationEventArgs e)
+        private void OnPackageInstallationCancelled(object sender, InstallationEventArgs e)
         {
             SendMessageToAdminSessions("PackageInstallationCancelled", e.InstallationInfo);
         }
 
-        void _installationManager_PackageInstallationCompleted(object sender, InstallationEventArgs e)
+        private void OnPackageInstallationCompleted(object sender, InstallationEventArgs e)
         {
             SendMessageToAdminSessions("PackageInstallationCompleted", e.InstallationInfo);
         }
 
-        void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e)
+        private void OnPackageInstallationFailed(object sender, InstallationFailedEventArgs e)
         {
             SendMessageToAdminSessions("PackageInstallationFailed", e.InstallationInfo);
         }
 
-        void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
+        private void OnTaskCompleted(object sender, TaskCompletionEventArgs e)
         {
             SendMessageToAdminSessions("ScheduledTaskEnded", e.Result);
         }
@@ -101,7 +115,7 @@ namespace Emby.Server.Implementations.EntryPoints
         /// </summary>
         /// <param name="sender">The sender.</param>
         /// <param name="e">The e.</param>
-        void InstallationManager_PluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
+        private void OnPluginUninstalled(object sender, GenericEventArgs<IPlugin> e)
         {
             SendMessageToAdminSessions("PluginUninstalled", e.Argument.GetPluginInfo());
         }
@@ -111,7 +125,7 @@ namespace Emby.Server.Implementations.EntryPoints
         /// </summary>
         /// <param name="sender">The source of the event.</param>
         /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
-        void kernel_HasPendingRestartChanged(object sender, EventArgs e)
+        private void OnHasPendingRestartChanged(object sender, EventArgs e)
         {
             _sessionManager.SendRestartRequiredNotification(CancellationToken.None);
         }
@@ -121,7 +135,7 @@ namespace Emby.Server.Implementations.EntryPoints
         /// </summary>
         /// <param name="sender">The sender.</param>
         /// <param name="e">The e.</param>
-        void userManager_UserUpdated(object sender, GenericEventArgs<User> e)
+        private void OnUserUpdated(object sender, GenericEventArgs<User> e)
         {
             var dto = _userManager.GetUserDto(e.Argument);
 
@@ -133,19 +147,19 @@ namespace Emby.Server.Implementations.EntryPoints
         /// </summary>
         /// <param name="sender">The sender.</param>
         /// <param name="e">The e.</param>
-        void userManager_UserDeleted(object sender, GenericEventArgs<User> e)
+        private void OnUserDeleted(object sender, GenericEventArgs<User> e)
         {
             SendMessageToUserSession(e.Argument, "UserDeleted", e.Argument.Id.ToString("N", CultureInfo.InvariantCulture));
         }
 
-        void _userManager_UserPolicyUpdated(object sender, GenericEventArgs<User> e)
+        private void OnUserPolicyUpdated(object sender, GenericEventArgs<User> e)
         {
             var dto = _userManager.GetUserDto(e.Argument);
 
             SendMessageToUserSession(e.Argument, "UserPolicyUpdated", dto);
         }
 
-        void _userManager_UserConfigurationUpdated(object sender, GenericEventArgs<User> e)
+        private void OnUserConfigurationUpdated(object sender, GenericEventArgs<User> e)
         {
             var dto = _userManager.GetUserDto(e.Argument);
 
@@ -168,7 +182,11 @@ namespace Emby.Server.Implementations.EntryPoints
         {
             try
             {
-                await _sessionManager.SendMessageToUserSessions(new List<Guid> { user.Id }, name, data, CancellationToken.None);
+                await _sessionManager.SendMessageToUserSessions(
+                    new List<Guid> { user.Id },
+                    name,
+                    data,
+                    CancellationToken.None).ConfigureAwait(false);
             }
             catch (Exception)
             {
@@ -176,12 +194,11 @@ namespace Emby.Server.Implementations.EntryPoints
             }
         }
 
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
+        /// <inheritdoc />
         public void Dispose()
         {
             Dispose(true);
+            GC.SuppressFinalize(this);
         }
 
         /// <summary>
@@ -192,18 +209,20 @@ namespace Emby.Server.Implementations.EntryPoints
         {
             if (dispose)
             {
-                _userManager.UserDeleted -= userManager_UserDeleted;
-                _userManager.UserUpdated -= userManager_UserUpdated;
-                _userManager.UserPolicyUpdated -= _userManager_UserPolicyUpdated;
-                _userManager.UserConfigurationUpdated -= _userManager_UserConfigurationUpdated;
-
-                _installationManager.PluginUninstalled -= InstallationManager_PluginUninstalled;
-                _installationManager.PackageInstalling -= _installationManager_PackageInstalling;
-                _installationManager.PackageInstallationCancelled -= _installationManager_PackageInstallationCancelled;
-                _installationManager.PackageInstallationCompleted -= _installationManager_PackageInstallationCompleted;
-                _installationManager.PackageInstallationFailed -= _installationManager_PackageInstallationFailed;
-
-                _appHost.HasPendingRestartChanged -= kernel_HasPendingRestartChanged;
+                _userManager.UserDeleted -= OnUserDeleted;
+                _userManager.UserUpdated -= OnUserUpdated;
+                _userManager.UserPolicyUpdated -= OnUserPolicyUpdated;
+                _userManager.UserConfigurationUpdated -= OnUserConfigurationUpdated;
+
+                _installationManager.PluginUninstalled -= OnPluginUninstalled;
+                _installationManager.PackageInstalling -= OnPackageInstalling;
+                _installationManager.PackageInstallationCancelled -= OnPackageInstallationCancelled;
+                _installationManager.PackageInstallationCompleted -= OnPackageInstallationCompleted;
+                _installationManager.PackageInstallationFailed -= OnPackageInstallationFailed;
+
+                _appHost.HasPendingRestartChanged -= OnHasPendingRestartChanged;
+
+                _taskManager.TaskCompleted -= OnTaskCompleted;
             }
         }
     }

+ 12 - 9
Emby.Server.Implementations/EntryPoints/StartupWizard.cs

@@ -8,21 +8,28 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.EntryPoints
 {
     /// <summary>
-    /// Class StartupWizard
+    /// Class StartupWizard.
     /// </summary>
     public class StartupWizard : IServerEntryPoint
     {
         /// <summary>
-        /// The _app host
+        /// The _app host.
         /// </summary>
         private readonly IServerApplicationHost _appHost;
+
         /// <summary>
-        /// The _user manager
+        /// The _user manager.
         /// </summary>
         private readonly ILogger _logger;
 
         private IServerConfigurationManager _config;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="StartupWizard"/> class.
+        /// </summary>
+        /// <param name="appHost">The application host.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="config">The configuration manager.</param>
         public StartupWizard(IServerApplicationHost appHost, ILogger logger, IServerConfigurationManager config)
         {
             _appHost = appHost;
@@ -30,9 +37,7 @@ namespace Emby.Server.Implementations.EntryPoints
             _config = config;
         }
 
-        /// <summary>
-        /// Runs this instance.
-        /// </summary>
+        /// <inheritdoc />
         public Task RunAsync()
         {
             if (!_appHost.CanLaunchWebBrowser)
@@ -57,9 +62,7 @@ namespace Emby.Server.Implementations.EntryPoints
             return Task.CompletedTask;
         }
 
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
+        /// <inheritdoc />
         public void Dispose()
         {
         }

+ 19 - 16
Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs

@@ -10,30 +10,36 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.EntryPoints
 {
     /// <summary>
-    /// Class UdpServerEntryPoint
+    /// Class UdpServerEntryPoint.
     /// </summary>
     public class UdpServerEntryPoint : IServerEntryPoint
     {
         /// <summary>
-        /// Gets or sets the UDP server.
+        /// The port of the UDP server.
         /// </summary>
-        /// <value>The UDP server.</value>
-        private UdpServer UdpServer { get; set; }
+        public const int PortNumber = 7359;
 
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
         private readonly ISocketFactory _socketFactory;
         private readonly IServerApplicationHost _appHost;
         private readonly IJsonSerializer _json;
 
-        public const int PortNumber = 7359;
+        /// <summary>
+        /// The UDP server.
+        /// </summary>
+        private UdpServer _udpServer;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="UdpServerEntryPoint" /> class.
         /// </summary>
-        public UdpServerEntryPoint(ILogger logger, IServerApplicationHost appHost, IJsonSerializer json, ISocketFactory socketFactory)
+        public UdpServerEntryPoint(
+            ILogger logger,
+            IServerApplicationHost appHost,
+            IJsonSerializer json,
+            ISocketFactory socketFactory)
         {
             _logger = logger;
             _appHost = appHost;
@@ -41,9 +47,7 @@ namespace Emby.Server.Implementations.EntryPoints
             _socketFactory = socketFactory;
         }
 
-        /// <summary>
-        /// Runs this instance.
-        /// </summary>
+        /// <inheritdoc />
         public Task RunAsync()
         {
             var udpServer = new UdpServer(_logger, _appHost, _json, _socketFactory);
@@ -52,7 +56,7 @@ namespace Emby.Server.Implementations.EntryPoints
             {
                 udpServer.Start(PortNumber);
 
-                UdpServer = udpServer;
+                _udpServer = udpServer;
             }
             catch (Exception ex)
             {
@@ -62,12 +66,11 @@ namespace Emby.Server.Implementations.EntryPoints
             return Task.CompletedTask;
         }
 
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
+        /// <inheritdoc />
         public void Dispose()
         {
             Dispose(true);
+            GC.SuppressFinalize(this);
         }
 
         /// <summary>
@@ -78,9 +81,9 @@ namespace Emby.Server.Implementations.EntryPoints
         {
             if (dispose)
             {
-                if (UdpServer != null)
+                if (_udpServer != null)
                 {
-                    UdpServer.Dispose();
+                    _udpServer.Dispose();
                 }
             }
         }

+ 2 - 0
Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 1 - 0
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -282,6 +282,7 @@ namespace Emby.Server.Implementations.HttpClientManager
             };
         }
 
+        /// <inheritdoc />
         public Task<HttpResponseInfo> Post(HttpRequestOptions options)
             => SendAsync(options, HttpMethod.Post);
 

+ 2 - 0
Emby.Server.Implementations/HttpServer/FileWriter.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;

+ 4 - 4
Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -5,12 +7,10 @@ using System.IO;
 using System.IO.Compression;
 using System.Net;
 using System.Runtime.Serialization;
-using System.Security.Cryptography;
 using System.Text;
 using System.Threading.Tasks;
 using System.Xml;
 using Emby.Server.Implementations.Services;
-using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Serialization;
@@ -24,12 +24,12 @@ using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
 namespace Emby.Server.Implementations.HttpServer
 {
     /// <summary>
-    /// Class HttpResultFactory
+    /// Class HttpResultFactory.
     /// </summary>
     public class HttpResultFactory : IHttpResultFactory
     {
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
         private readonly IFileSystem _fileSystem;

+ 2 - 0
Emby.Server.Implementations/HttpServer/IHttpListener.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Threading;
 using System.Threading.Tasks;

+ 2 - 0
Emby.Server.Implementations/HttpServer/RangeRequestWriter.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 9 - 3
Emby.Server.Implementations/HttpServer/ResponseFilter.cs

@@ -8,11 +8,17 @@ using Microsoft.Net.Http.Headers;
 
 namespace Emby.Server.Implementations.HttpServer
 {
+    /// <summary>
+    /// Class ResponseFilter.
+    /// </summary>
     public class ResponseFilter
     {
-        private static readonly CultureInfo _usCulture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
         private readonly ILogger _logger;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ResponseFilter"/> class.
+        /// </summary>
+        /// <param name="logger">The logger.</param>
         public ResponseFilter(ILogger logger)
         {
             _logger = logger;
@@ -37,7 +43,7 @@ namespace Emby.Server.Implementations.HttpServer
 
                 if (!string.IsNullOrEmpty(exception.Message))
                 {
-                    var error = exception.Message.Replace(Environment.NewLine, " ");
+                    var error = exception.Message.Replace(Environment.NewLine, " ", StringComparison.Ordinal);
                     error = RemoveControlCharacters(error);
 
                     res.Headers.Add("X-Application-Error-Code", error);
@@ -55,7 +61,7 @@ namespace Emby.Server.Implementations.HttpServer
                 if (hasHeaders.Headers.TryGetValue(HeaderNames.ContentLength, out string contentLength)
                     && !string.IsNullOrEmpty(contentLength))
                 {
-                    var length = long.Parse(contentLength, _usCulture);
+                    var length = long.Parse(contentLength, CultureInfo.InvariantCulture);
 
                     if (length > 0)
                     {

+ 2 - 0
Emby.Server.Implementations/HttpServer/Security/AuthService.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Linq;
 using Emby.Server.Implementations.SocketSharp;

+ 2 - 0
Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;

+ 2 - 0
Emby.Server.Implementations/HttpServer/Security/SessionContext.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;

+ 30 - 27
Emby.Server.Implementations/HttpServer/StreamWriter.cs

@@ -10,37 +10,20 @@ using Microsoft.Net.Http.Headers;
 namespace Emby.Server.Implementations.HttpServer
 {
     /// <summary>
-    /// Class StreamWriter
+    /// Class StreamWriter.
     /// </summary>
     public class StreamWriter : IAsyncStreamWriter, IHasHeaders
     {
         /// <summary>
-        /// Gets or sets the source stream.
-        /// </summary>
-        /// <value>The source stream.</value>
-        private Stream SourceStream { get; set; }
-
-        private byte[] SourceBytes { get; set; }
-
-        /// <summary>
-        /// The _options
+        /// The _options.
         /// </summary>
         private readonly IDictionary<string, string> _options = new Dictionary<string, string>();
-        /// <summary>
-        /// Gets the options.
-        /// </summary>
-        /// <value>The options.</value>
-        public IDictionary<string, string> Headers => _options;
-
-        public Action OnComplete { get; set; }
-        public Action OnError { get; set; }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="StreamWriter" /> class.
         /// </summary>
         /// <param name="source">The source.</param>
         /// <param name="contentType">Type of the content.</param>
-        /// <param name="logger">The logger.</param>
         public StreamWriter(Stream source, string contentType)
         {
             if (string.IsNullOrEmpty(contentType))
@@ -65,6 +48,7 @@ namespace Emby.Server.Implementations.HttpServer
         /// </summary>
         /// <param name="source">The source.</param>
         /// <param name="contentType">Type of the content.</param>
+        /// <param name="contentLength">The content length.</param>
         public StreamWriter(byte[] source, string contentType, int contentLength)
         {
             if (string.IsNullOrEmpty(contentType))
@@ -78,6 +62,31 @@ namespace Emby.Server.Implementations.HttpServer
             Headers[HeaderNames.ContentType] = contentType;
         }
 
+        /// <summary>
+        /// Gets or sets the source stream.
+        /// </summary>
+        /// <value>The source stream.</value>
+        private Stream SourceStream { get; set; }
+
+        private byte[] SourceBytes { get; set; }
+
+        /// <summary>
+        /// Gets the options.
+        /// </summary>
+        /// <value>The options.</value>
+        public IDictionary<string, string> Headers => _options;
+
+        /// <summary>
+        /// Fires when complete.
+        /// </summary>
+        public Action OnComplete { get; set; }
+
+        /// <summary>
+        /// Fires when an error occours.
+        /// </summary>
+        public Action OnError { get; set; }
+
+        /// <inheritdoc />
         public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken)
         {
             try
@@ -98,19 +107,13 @@ namespace Emby.Server.Implementations.HttpServer
             }
             catch
             {
-                if (OnError != null)
-                {
-                    OnError();
-                }
+                OnError?.Invoke();
 
                 throw;
             }
             finally
             {
-                if (OnComplete != null)
-                {
-                    OnComplete();
-                }
+                OnComplete?.Invoke();
             }
         }
     }

+ 57 - 53
Emby.Server.Implementations/HttpServer/WebSocketConnection.cs

@@ -7,7 +7,6 @@ using Emby.Server.Implementations.Net;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Services;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Logging;
 using UtfUnknown;
@@ -15,60 +14,24 @@ using UtfUnknown;
 namespace Emby.Server.Implementations.HttpServer
 {
     /// <summary>
-    /// Class WebSocketConnection
+    /// Class WebSocketConnection.
     /// </summary>
     public class WebSocketConnection : IWebSocketConnection
     {
-        public event EventHandler<EventArgs> Closed;
-
-        /// <summary>
-        /// The _socket
-        /// </summary>
-        private readonly IWebSocket _socket;
-
         /// <summary>
-        /// The _remote end point
-        /// </summary>
-        public string RemoteEndPoint { get; private set; }
-
-        /// <summary>
-        /// The logger
+        /// The logger.
         /// </summary>
         private readonly ILogger _logger;
 
         /// <summary>
-        /// The _json serializer
+        /// The _json serializer.
         /// </summary>
         private readonly IJsonSerializer _jsonSerializer;
 
         /// <summary>
-        /// Gets or sets the receive action.
-        /// </summary>
-        /// <value>The receive action.</value>
-        public Func<WebSocketMessageInfo, Task> OnReceive { get; set; }
-
-        /// <summary>
-        /// Gets the last activity date.
-        /// </summary>
-        /// <value>The last activity date.</value>
-        public DateTime LastActivityDate { get; private set; }
-
-        /// <summary>
-        /// Gets the id.
+        /// The _socket.
         /// </summary>
-        /// <value>The id.</value>
-        public Guid Id { get; private set; }
-
-        /// <summary>
-        /// Gets or sets the URL.
-        /// </summary>
-        /// <value>The URL.</value>
-        public string Url { get; set; }
-        /// <summary>
-        /// Gets or sets the query string.
-        /// </summary>
-        /// <value>The query string.</value>
-        public IQueryCollection QueryString { get; set; }
+        private readonly IWebSocket _socket;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="WebSocketConnection" /> class.
@@ -84,14 +47,17 @@ namespace Emby.Server.Implementations.HttpServer
             {
                 throw new ArgumentNullException(nameof(socket));
             }
+
             if (string.IsNullOrEmpty(remoteEndPoint))
             {
                 throw new ArgumentNullException(nameof(remoteEndPoint));
             }
+
             if (jsonSerializer == null)
             {
                 throw new ArgumentNullException(nameof(jsonSerializer));
             }
+
             if (logger == null)
             {
                 throw new ArgumentNullException(nameof(logger));
@@ -105,10 +71,54 @@ namespace Emby.Server.Implementations.HttpServer
             RemoteEndPoint = remoteEndPoint;
             _logger = logger;
 
-            socket.Closed += socket_Closed;
+            socket.Closed += OnSocketClosed;
         }
 
-        void socket_Closed(object sender, EventArgs e)
+        /// <inheritdoc />
+        public event EventHandler<EventArgs> Closed;
+
+        /// <summary>
+        /// Gets or sets the _remote end point.
+        /// </summary>
+        public string RemoteEndPoint { get; private set; }
+
+        /// <summary>
+        /// Gets or sets the receive action.
+        /// </summary>
+        /// <value>The receive action.</value>
+        public Func<WebSocketMessageInfo, Task> OnReceive { get; set; }
+
+        /// <summary>
+        /// Gets the last activity date.
+        /// </summary>
+        /// <value>The last activity date.</value>
+        public DateTime LastActivityDate { get; private set; }
+
+        /// <summary>
+        /// Gets the id.
+        /// </summary>
+        /// <value>The id.</value>
+        public Guid Id { get; private set; }
+
+        /// <summary>
+        /// Gets or sets the URL.
+        /// </summary>
+        /// <value>The URL.</value>
+        public string Url { get; set; }
+
+        /// <summary>
+        /// Gets or sets the query string.
+        /// </summary>
+        /// <value>The query string.</value>
+        public IQueryCollection QueryString { get; set; }
+
+        /// <summary>
+        /// Gets the state.
+        /// </summary>
+        /// <value>The state.</value>
+        public WebSocketState State => _socket.State;
+
+        void OnSocketClosed(object sender, EventArgs e)
         {
             Closed?.Invoke(this, EventArgs.Empty);
         }
@@ -210,6 +220,7 @@ namespace Emby.Server.Implementations.HttpServer
             return _socket.SendAsync(buffer, true, cancellationToken);
         }
 
+        /// <inheritdoc />
         public Task SendAsync(string text, CancellationToken cancellationToken)
         {
             if (string.IsNullOrEmpty(text))
@@ -222,18 +233,11 @@ namespace Emby.Server.Implementations.HttpServer
             return _socket.SendAsync(text, true, cancellationToken);
         }
 
-        /// <summary>
-        /// Gets the state.
-        /// </summary>
-        /// <value>The state.</value>
-        public WebSocketState State => _socket.State;
-
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
+        /// <inheritdoc />
         public void Dispose()
         {
             Dispose(true);
+            GC.SuppressFinalize(this);
         }
 
         /// <summary>

+ 2 - 0
Emby.Server.Implementations/IO/ExtendedFileSystemInfo.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 namespace Emby.Server.Implementations.IO
 {
     public class ExtendedFileSystemInfo

+ 2 - 0
Emby.Server.Implementations/IO/FileRefresher.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;

+ 6 - 4
Emby.Server.Implementations/IO/LibraryMonitor.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -16,22 +18,22 @@ namespace Emby.Server.Implementations.IO
     public class LibraryMonitor : ILibraryMonitor
     {
         /// <summary>
-        /// The file system watchers
+        /// The file system watchers.
         /// </summary>
         private readonly ConcurrentDictionary<string, FileSystemWatcher> _fileSystemWatchers = new ConcurrentDictionary<string, FileSystemWatcher>(StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
-        /// The affected paths
+        /// The affected paths.
         /// </summary>
         private readonly List<FileRefresher> _activeRefreshers = new List<FileRefresher>();
 
         /// <summary>
-        /// A dynamic list of paths that should be ignored.  Added to during our own file sytem modifications.
+        /// A dynamic list of paths that should be ignored.  Added to during our own file system modifications.
         /// </summary>
         private readonly ConcurrentDictionary<string, string> _tempIgnoredPaths = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
-        /// Any file name ending in any of these will be ignored by the watchers
+        /// Any file name ending in any of these will be ignored by the watchers.
         /// </summary>
         private static readonly HashSet<string> _alwaysIgnoreFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
         {

+ 2 - 0
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.IO;
 using MediaBrowser.Model.IO;

+ 2 - 0
Emby.Server.Implementations/IO/StreamHelper.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Buffers;
 using System.IO;

+ 2 - 0
Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 4 - 0
Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs

@@ -42,6 +42,10 @@ namespace Emby.Server.Implementations.Library
                 ".grab",
         };
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="CoreResolutionIgnoreRule"/> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
         public CoreResolutionIgnoreRule(ILibraryManager libraryManager)
         {
             _libraryManager = libraryManager;

+ 9 - 1
Emby.Server.Implementations/Library/DefaultAuthenticationProvider.cs

@@ -10,10 +10,17 @@ using MediaBrowser.Model.Cryptography;
 
 namespace Emby.Server.Implementations.Library
 {
+    /// <summary>
+    /// The default authentication provider.
+    /// </summary>
     public class DefaultAuthenticationProvider : IAuthenticationProvider, IRequiresResolvedUser
     {
         private readonly ICryptoProvider _cryptographyProvider;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultAuthenticationProvider"/> class.
+        /// </summary>
+        /// <param name="cryptographyProvider">The cryptography provider.</param>
         public DefaultAuthenticationProvider(ICryptoProvider cryptographyProvider)
         {
             _cryptographyProvider = cryptographyProvider;
@@ -38,12 +45,13 @@ namespace Emby.Server.Implementations.Library
         // This is the version that we need to use for local users. Because reasons.
         public Task<ProviderAuthenticationResult> Authenticate(string username, string password, User resolvedUser)
         {
-            bool success = false;
             if (resolvedUser == null)
             {
                 throw new ArgumentNullException(nameof(resolvedUser));
             }
 
+            bool success = false;
+
             // As long as jellyfin supports passwordless users, we need this little block here to accommodate
             if (!HasPassword(resolvedUser) && string.IsNullOrEmpty(password))
             {

+ 11 - 2
Emby.Server.Implementations/Library/DefaultPasswordResetProvider.cs

@@ -12,6 +12,9 @@ using MediaBrowser.Model.Users;
 
 namespace Emby.Server.Implementations.Library
 {
+    /// <summary>
+    /// The default password reset provider.
+    /// </summary>
     public class DefaultPasswordResetProvider : IPasswordResetProvider
     {
         private const string BaseResetFileName = "passwordreset";
@@ -22,6 +25,12 @@ namespace Emby.Server.Implementations.Library
         private readonly string _passwordResetFileBase;
         private readonly string _passwordResetFileBaseDir;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultPasswordResetProvider"/> class.
+        /// </summary>
+        /// <param name="configurationManager">The configuration manager.</param>
+        /// <param name="jsonSerializer">The JSON serializer.</param>
+        /// <param name="userManager">The user manager.</param>
         public DefaultPasswordResetProvider(
             IServerConfigurationManager configurationManager,
             IJsonSerializer jsonSerializer,
@@ -56,8 +65,8 @@ namespace Emby.Server.Implementations.Library
                     File.Delete(resetfile);
                 }
                 else if (string.Equals(
-                    spr.Pin.Replace("-", string.Empty),
-                    pin.Replace("-", string.Empty),
+                    spr.Pin.Replace("-", string.Empty, StringComparison.Ordinal),
+                    pin.Replace("-", string.Empty, StringComparison.Ordinal),
                     StringComparison.InvariantCultureIgnoreCase))
                 {
                     var resetUser = _userManager.GetUserByName(spr.UserName);

+ 2 - 0
Emby.Server.Implementations/Library/ExclusiveLiveStream.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Globalization;
 using System.Threading;

+ 11 - 0
Emby.Server.Implementations/Library/InvalidAuthProvider.cs

@@ -4,37 +4,48 @@ using MediaBrowser.Controller.Entities;
 
 namespace Emby.Server.Implementations.Library
 {
+    /// <summary>
+    /// An invalid authentication provider.
+    /// </summary>
     public class InvalidAuthProvider : IAuthenticationProvider
     {
+        /// <inheritdoc />
         public string Name => "InvalidOrMissingAuthenticationProvider";
 
+        /// <inheritdoc />
         public bool IsEnabled => true;
 
+        /// <inheritdoc />
         public Task<ProviderAuthenticationResult> Authenticate(string username, string password)
         {
             throw new AuthenticationException("User Account cannot login with this provider. The Normal provider for this user cannot be found");
         }
 
+        /// <inheritdoc />
         public bool HasPassword(User user)
         {
             return true;
         }
 
+        /// <inheritdoc />
         public Task ChangePassword(User user, string newPassword)
         {
             return Task.CompletedTask;
         }
 
+        /// <inheritdoc />
         public void ChangeEasyPassword(User user, string newPassword, string newPasswordHash)
         {
             // Nothing here
         }
 
+        /// <inheritdoc />
         public string GetPasswordHash(User user)
         {
             return string.Empty;
         }
 
+        /// <inheritdoc />
         public string GetEasyPasswordHash(User user)
         {
             return string.Empty;

+ 2 - 0
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;

+ 2 - 0
Emby.Server.Implementations/Library/LiveStreamHelper.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/Library/MediaSourceManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 2 - 0
Emby.Server.Implementations/Library/MediaStreamSelector.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;

+ 2 - 0
Emby.Server.Implementations/Library/MusicManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;

+ 4 - 0
Emby.Server.Implementations/Library/PathExtensions.cs

@@ -3,6 +3,9 @@ using System.Text.RegularExpressions;
 
 namespace Emby.Server.Implementations.Library
 {
+    /// <summary>
+    /// Class providing extension methods for working with paths.
+    /// </summary>
     public static class PathExtensions
     {
         /// <summary>
@@ -32,6 +35,7 @@ namespace Emby.Server.Implementations.Library
                 int end = str.IndexOf(']', start);
                 return str.Substring(start, end - start);
             }
+
             // for imdbid we also accept pattern matching
             if (string.Equals(attrib, "imdbid", StringComparison.OrdinalIgnoreCase))
             {

+ 3 - 1
Emby.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -13,7 +15,7 @@ using MediaBrowser.Model.IO;
 namespace Emby.Server.Implementations.Library.Resolvers.Audio
 {
     /// <summary>
-    /// Class AudioResolver
+    /// Class AudioResolver.
     /// </summary>
     public class AudioResolver : ItemResolver<MediaBrowser.Controller.Entities.Audio.Audio>, IMultiItemResolver
     {

+ 27 - 8
Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs

@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Resolvers.Audio
 {
     /// <summary>
-    /// Class MusicAlbumResolver
+    /// Class MusicAlbumResolver.
     /// </summary>
     public class MusicAlbumResolver : ItemResolver<MusicAlbum>
     {
@@ -21,6 +21,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
         private readonly IFileSystem _fileSystem;
         private readonly ILibraryManager _libraryManager;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MusicAlbumResolver"/> class.
+        /// </summary>
+        /// <param name="logger">The logger.</param>
+        /// <param name="fileSystem">The file system.</param>
+        /// <param name="libraryManager">The library manager.</param>
         public MusicAlbumResolver(ILogger logger, IFileSystem fileSystem, ILibraryManager libraryManager)
         {
             _logger = logger;
@@ -50,16 +56,25 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
                 return null;
             }
 
-            if (!args.IsDirectory) return null;
+            if (!args.IsDirectory)
+            {
+                return null;
+            }
 
             // Avoid mis-identifying top folders
-            if (args.HasParent<MusicAlbum>()) return null;
-            if (args.Parent.IsRoot) return null;
+            if (args.HasParent<MusicAlbum>())
+            {
+                return null;
+            }
+
+            if (args.Parent.IsRoot)
+            {
+                return null;
+            }
 
             return IsMusicAlbum(args) ? new MusicAlbum() : null;
         }
 
-
         /// <summary>
         /// Determine if the supplied file data points to a music album
         /// </summary>
@@ -78,8 +93,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
             // Args points to an album if parent is an Artist folder or it directly contains music
             if (args.IsDirectory)
             {
-                //if (args.Parent is MusicArtist) return true;  //saves us from testing children twice
-                if (ContainsMusic(args.FileSystemChildren, true, args.DirectoryService, _logger, _fileSystem, args.GetLibraryOptions(), _libraryManager)) return true;
+                // if (args.Parent is MusicArtist) return true;  //saves us from testing children twice
+                if (ContainsMusic(args.FileSystemChildren, true, args.DirectoryService, _logger, _fileSystem, args.GetLibraryOptions(), _libraryManager))
+                {
+                    return true;
+                }
             }
 
             return false;
@@ -88,7 +106,8 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
         /// <summary>
         /// Determine if the supplied list contains what we should consider music
         /// </summary>
-        private bool ContainsMusic(IEnumerable<FileSystemMetadata> list,
+        private bool ContainsMusic(
+            IEnumerable<FileSystemMetadata> list,
             bool allowSubfolders,
             IDirectoryService directoryService,
             ILogger logger,

+ 12 - 3
Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs

@@ -11,7 +11,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Resolvers.Audio
 {
     /// <summary>
-    /// Class MusicArtistResolver
+    /// Class MusicArtistResolver.
     /// </summary>
     public class MusicArtistResolver : ItemResolver<MusicArtist>
     {
@@ -20,6 +20,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
         private readonly ILibraryManager _libraryManager;
         private readonly IServerConfigurationManager _config;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MusicArtistResolver"/> class.
+        /// </summary>
+        /// <param name="logger">The logger.</param>
+        /// <param name="fileSystem">The file system.</param>
+        /// <param name="libraryManager">The library manager.</param>
+        /// <param name="config">The configuration manager.</param>
         public MusicArtistResolver(ILogger logger, IFileSystem fileSystem, ILibraryManager libraryManager, IServerConfigurationManager config)
         {
             _logger = logger;
@@ -41,7 +48,10 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
         /// <returns>MusicArtist.</returns>
         protected override MusicArtist Resolve(ItemResolveArgs args)
         {
-            if (!args.IsDirectory) return null;
+            if (!args.IsDirectory)
+            {
+                return null;
+            }
 
             // Don't allow nested artists
             if (args.HasParent<MusicArtist>() || args.HasParent<MusicAlbum>())
@@ -79,6 +89,5 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
             // If we contain an album assume we are an artist folder
             return args.FileSystemChildren.Where(i => i.IsDirectory).Any(i => albumResolver.IsMusicAlbum(i.FullName, directoryService, args.GetLibraryOptions())) ? new MusicArtist() : null;
         }
-
     }
 }

+ 3 - 1
Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.IO;
 using System.Linq;
@@ -10,7 +12,7 @@ using MediaBrowser.Model.Entities;
 namespace Emby.Server.Implementations.Library.Resolvers
 {
     /// <summary>
-    /// Resolves a Path into a Video or Video subclass
+    /// Resolves a Path into a Video or Video subclass.
     /// </summary>
     /// <typeparam name="T"></typeparam>
     public abstract class BaseVideoResolver<T> : MediaBrowser.Controller.Resolvers.ItemResolver<T>

+ 2 - 13
Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.IO;
 using System.Linq;
@@ -7,18 +9,10 @@ using MediaBrowser.Model.Entities;
 
 namespace Emby.Server.Implementations.Library.Resolvers.Books
 {
-    /// <summary>
-    ///
-    /// </summary>
     public class BookResolver : MediaBrowser.Controller.Resolvers.ItemResolver<Book>
     {
         private readonly string[] _validExtensions = { ".pdf", ".epub", ".mobi", ".cbr", ".cbz", ".azw3" };
 
-        /// <summary>
-        ///
-        /// </summary>
-        /// <param name="args"></param>
-        /// <returns></returns>
         protected override Book Resolve(ItemResolveArgs args)
         {
             var collectionType = args.GetCollectionType();
@@ -47,11 +41,6 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books
             return null;
         }
 
-        /// <summary>
-        ///
-        /// </summary>
-        /// <param name="args"></param>
-        /// <returns></returns>
         private Book GetBook(ItemResolveArgs args)
         {
             var bookFiles = args.FileSystemChildren.Where(f =>

+ 2 - 2
Emby.Server.Implementations/Library/Resolvers/FolderResolver.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Controller.Resolvers;
 namespace Emby.Server.Implementations.Library.Resolvers
 {
     /// <summary>
-    /// Class FolderResolver
+    /// Class FolderResolver.
     /// </summary>
     public class FolderResolver : FolderResolver<Folder>
     {
@@ -32,7 +32,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
     }
 
     /// <summary>
-    /// Class FolderResolver
+    /// Class FolderResolver.
     /// </summary>
     /// <typeparam name="TItemType">The type of the T item type.</typeparam>
     public abstract class FolderResolver<TItemType> : ItemResolver<TItemType>

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/ItemResolver.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Controller.Resolvers;
 namespace Emby.Server.Implementations.Library.Resolvers
 {
     /// <summary>
-    /// Class ItemResolver
+    /// Class ItemResolver.
     /// </summary>
     /// <typeparam name="T"></typeparam>
     public abstract class ItemResolver<T> : IItemResolver

+ 2 - 3
Emby.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs

@@ -4,12 +4,11 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Extensions;
 
 namespace Emby.Server.Implementations.Library.Resolvers.Movies
 {
     /// <summary>
-    /// Class BoxSetResolver
+    /// Class BoxSetResolver.
     /// </summary>
     public class BoxSetResolver : FolderResolver<BoxSet>
     {
@@ -63,7 +62,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
         /// <param name="item">The item.</param>
         private static void SetProviderIdFromPath(BaseItem item)
         {
-            //we need to only look at the name of this actual item (not parents)
+            // we need to only look at the name of this actual item (not parents)
             var justName = Path.GetFileName(item.Path);
 
             var id = justName.GetAttributeValue("tmdbid");

+ 8 - 2
Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -17,7 +17,7 @@ using MediaBrowser.Model.IO;
 namespace Emby.Server.Implementations.Library.Resolvers.Movies
 {
     /// <summary>
-    /// Class MovieResolver
+    /// Class MovieResolver.
     /// </summary>
     public class MovieResolver : BaseVideoResolver<Video>, IMultiItemResolver
     {
@@ -27,6 +27,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
         /// <value>The priority.</value>
         public override ResolverPriority Priority => ResolverPriority.Third;
 
+        /// <inheritdoc />
         public MultiItemResolverResult ResolveMultiple(
             Folder parent,
             List<FileSystemMetadata> files,
@@ -522,7 +523,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
                 CollectionType.MusicVideos,
                 CollectionType.Movies,
                 CollectionType.Photos
-            };
+        };
 
         private bool IsInvalid(Folder parent, string collectionType)
         {
@@ -544,6 +545,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
 
         private IImageProcessor _imageProcessor;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MovieResolver"/> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
+        /// <param name="imageProcessor">The image processor.</param>
         public MovieResolver(ILibraryManager libraryManager, IImageProcessor imageProcessor)
             : base(libraryManager)
         {

+ 10 - 0
Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs

@@ -7,11 +7,19 @@ using MediaBrowser.Model.Entities;
 
 namespace Emby.Server.Implementations.Library.Resolvers
 {
+    /// <summary>
+    /// Class PhotoAlbumResolver.
+    /// </summary>
     public class PhotoAlbumResolver : FolderResolver<PhotoAlbum>
     {
         private readonly IImageProcessor _imageProcessor;
         private ILibraryManager _libraryManager;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="PhotoAlbumResolver"/> class.
+        /// </summary>
+        /// <param name="imageProcessor">The image processor.</param>
+        /// <param name="libraryManager">The library manager.</param>
         public PhotoAlbumResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager)
         {
             _imageProcessor = imageProcessor;
@@ -74,9 +82,11 @@ namespace Emby.Server.Implementations.Library.Resolvers
                     }
                 }
             }
+
             return false;
         }
 
+        /// <inheritdoc />
         public override ResolverPriority Priority => ResolverPriority.Second;
     }
 }

+ 2 - 0
Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;

+ 2 - 1
Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs

@@ -1,10 +1,11 @@
+#pragma warning disable CS1591
+
 using System;
 using System.IO;
 using System.Linq;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Playlists;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Extensions;
 
 namespace Emby.Server.Implementations.Library.Resolvers
 {

+ 2 - 0
Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.IO;
 using System.Linq;

+ 6 - 1
Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs

@@ -7,7 +7,7 @@ using MediaBrowser.Model.Entities;
 namespace Emby.Server.Implementations.Library.Resolvers.TV
 {
     /// <summary>
-    /// Class EpisodeResolver
+    /// Class EpisodeResolver.
     /// </summary>
     public class EpisodeResolver : BaseVideoResolver<Episode>
     {
@@ -26,6 +26,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
             }
 
             var season = parent as Season;
+
             // Just in case the user decided to nest episodes.
             // Not officially supported but in some cases we can handle it.
             if (season == null)
@@ -73,6 +74,10 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
             return null;
         }
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="EpisodeResolver"/> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
         public EpisodeResolver(ILibraryManager libraryManager)
             : base(libraryManager)
         {

+ 9 - 1
Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -14,7 +16,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Resolvers.TV
 {
     /// <summary>
-    /// Class SeriesResolver
+    /// Class SeriesResolver.
     /// </summary>
     public class SeriesResolver : FolderResolver<Series>
     {
@@ -22,6 +24,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
         private readonly ILogger _logger;
         private readonly ILibraryManager _libraryManager;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="SeriesResolver"/> class.
+        /// </summary>
+        /// <param name="fileSystem">The file system.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="libraryManager">The library manager.</param>
         public SeriesResolver(IFileSystem fileSystem, ILogger logger, ILibraryManager libraryManager)
         {
             _fileSystem = fileSystem;

+ 2 - 0
Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 

+ 2 - 2
Emby.Server.Implementations/Library/SearchEngine.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -13,8 +15,6 @@ using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Library
 {
-    /// <summary>
-    /// </summary>
     public class SearchEngine : ISearchEngine
     {
         private readonly ILibraryManager _libraryManager;

+ 3 - 1
Emby.Server.Implementations/Library/UserDataManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -15,7 +17,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library
 {
     /// <summary>
-    /// Class UserDataManager
+    /// Class UserDataManager.
     /// </summary>
     public class UserDataManager : IUserDataManager
     {

+ 19 - 9
Emby.Server.Implementations/Library/UserManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -36,19 +38,19 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library
 {
     /// <summary>
-    /// Class UserManager
+    /// Class UserManager.
     /// </summary>
     public class UserManager : IUserManager
     {
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
 
         private readonly object _policySyncLock = new object();
 
         /// <summary>
-        /// Gets the active user repository
+        /// Gets the active user repository.
         /// </summary>
         /// <value>The user repository.</value>
         private readonly IUserRepository _userRepository;
@@ -358,6 +360,8 @@ namespace Emby.Server.Implementations.Library
             return success ? user : null;
         }
 
+#nullable enable
+
         private static string GetAuthenticationProviderId(IAuthenticationProvider provider)
         {
             return provider.GetType().FullName;
@@ -378,7 +382,7 @@ namespace Emby.Server.Implementations.Library
             return GetPasswordResetProviders(user)[0];
         }
 
-        private IAuthenticationProvider[] GetAuthenticationProviders(User user)
+        private IAuthenticationProvider[] GetAuthenticationProviders(User? user)
         {
             var authenticationProviderId = user?.Policy.AuthenticationProviderId;
 
@@ -399,7 +403,7 @@ namespace Emby.Server.Implementations.Library
             return providers;
         }
 
-        private IPasswordResetProvider[] GetPasswordResetProviders(User user)
+        private IPasswordResetProvider[] GetPasswordResetProviders(User? user)
         {
             var passwordResetProviderId = user?.Policy.PasswordResetProviderId;
 
@@ -418,7 +422,11 @@ namespace Emby.Server.Implementations.Library
             return providers;
         }
 
-        private async Task<(string username, bool success)> AuthenticateWithProvider(IAuthenticationProvider provider, string username, string password, User resolvedUser)
+        private async Task<(string username, bool success)> AuthenticateWithProvider(
+            IAuthenticationProvider provider,
+            string username,
+            string password,
+            User? resolvedUser)
         {
             try
             {
@@ -442,15 +450,15 @@ namespace Emby.Server.Implementations.Library
             }
         }
 
-        private async Task<(IAuthenticationProvider authenticationProvider, string username, bool success)> AuthenticateLocalUser(
+        private async Task<(IAuthenticationProvider? authenticationProvider, string username, bool success)> AuthenticateLocalUser(
             string username,
             string password,
             string hashedPassword,
-            User user,
+            User? user,
             string remoteEndPoint)
         {
             bool success = false;
-            IAuthenticationProvider authenticationProvider = null;
+            IAuthenticationProvider? authenticationProvider = null;
 
             foreach (var provider in GetAuthenticationProviders(user))
             {
@@ -547,6 +555,8 @@ namespace Emby.Server.Implementations.Library
             _users[user.Id] = user;
         }
 
+#nullable restore
+
         public UserDto GetUserDto(User user, string remoteEndPoint = null)
         {
             if (user == null)

+ 2 - 0
Emby.Server.Implementations/Library/UserViewManager.cs

@@ -1,3 +1,5 @@
+#pragma warning disable CS1591
+
 using System;
 using System.Collections.Generic;
 using System.Globalization;

+ 4 - 2
Emby.Server.Implementations/Library/Validators/ArtistsPostScanTask.cs

@@ -8,12 +8,12 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Validators
 {
     /// <summary>
-    /// Class ArtistsPostScanTask
+    /// Class ArtistsPostScanTask.
     /// </summary>
     public class ArtistsPostScanTask : ILibraryPostScanTask
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
         private readonly ILogger _logger;
@@ -23,6 +23,8 @@ namespace Emby.Server.Implementations.Library.Validators
         /// Initializes a new instance of the <see cref="ArtistsPostScanTask" /> class.
         /// </summary>
         /// <param name="libraryManager">The library manager.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="itemRepo">The item repository.</param>
         public ArtistsPostScanTask(ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo)
         {
             _libraryManager = libraryManager;

+ 3 - 3
Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs

@@ -12,17 +12,17 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Validators
 {
     /// <summary>
-    /// Class ArtistsValidator
+    /// Class ArtistsValidator.
     /// </summary>
     public class ArtistsValidator
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
         private readonly IItemRepository _itemRepo;

+ 3 - 0
Emby.Server.Implementations/Library/Validators/GenresPostScanTask.cs

@@ -7,6 +7,9 @@ using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Library.Validators
 {
+    /// <summary>
+    /// Class GenresPostScanTask.
+    /// </summary>
     public class GenresPostScanTask : ILibraryPostScanTask
     {
         /// <summary>

+ 12 - 3
Emby.Server.Implementations/Library/Validators/GenresValidator.cs

@@ -7,19 +7,28 @@ using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Library.Validators
 {
-    class GenresValidator
+    /// <summary>
+    /// Class GenresValidator.
+    /// </summary>
+    public class GenresValidator
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
         private readonly IItemRepository _itemRepo;
 
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="GenresValidator"/> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="itemRepo">The item repository.</param>
         public GenresValidator(ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo)
         {
             _libraryManager = libraryManager;

+ 2 - 2
Emby.Server.Implementations/Library/Validators/MusicGenresPostScanTask.cs

@@ -8,12 +8,12 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Validators
 {
     /// <summary>
-    /// Class MusicGenresPostScanTask
+    /// Class MusicGenresPostScanTask.
     /// </summary>
     public class MusicGenresPostScanTask : ILibraryPostScanTask
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
         private readonly ILogger _logger;

+ 12 - 3
Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs

@@ -7,19 +7,28 @@ using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Library.Validators
 {
-    class MusicGenresValidator
+    /// <summary>
+    /// Class MusicGenresValidator.
+    /// </summary>
+    public class MusicGenresValidator
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
         private readonly IItemRepository _itemRepo;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MusicGenresValidator" /> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="itemRepo">The item repository.</param>
         public MusicGenresValidator(ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo)
         {
             _libraryManager = libraryManager;

+ 1 - 0
Emby.Server.Implementations/Library/Validators/PeopleValidator.cs

@@ -32,6 +32,7 @@ namespace Emby.Server.Implementations.Library.Validators
         /// </summary>
         /// <param name="libraryManager">The library manager.</param>
         /// <param name="logger">The logger.</param>
+        /// <param name="fileSystem">The file system.</param>
         public PeopleValidator(ILibraryManager libraryManager, ILogger logger, IFileSystem fileSystem)
         {
             _libraryManager = libraryManager;

+ 3 - 3
Emby.Server.Implementations/Library/Validators/StudiosPostScanTask.cs

@@ -8,12 +8,12 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Validators
 {
     /// <summary>
-    /// Class MusicGenresPostScanTask
+    /// Class MusicGenresPostScanTask.
     /// </summary>
     public class StudiosPostScanTask : ILibraryPostScanTask
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.Library.Validators
         /// </summary>
         /// <param name="libraryManager">The library manager.</param>
         /// <param name="logger">The logger.</param>
-        /// <param name="itemRepo">Th item repository.</param>
+        /// <param name="itemRepo">The item repository.</param>
         public StudiosPostScanTask(ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo)
         {
             _libraryManager = libraryManager;

+ 13 - 3
Emby.Server.Implementations/Library/Validators/StudiosValidator.cs

@@ -9,19 +9,29 @@ using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Library.Validators
 {
-    class StudiosValidator
+    /// <summary>
+    /// Class StudiosValidator.
+    /// </summary>
+    public class StudiosValidator
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
         private readonly IItemRepository _itemRepo;
+
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
 
+        /// <summary>
+        /// Initializes a new instance of the <see cref="StudiosValidator" /> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
+        /// <param name="logger">The logger.</param>
+        /// <param name="itemRepo">The item repository.</param>
         public StudiosValidator(ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo)
         {
             _libraryManager = libraryManager;