Browse Source

Merge pull request #1852 from Bond-009/warn9

Fix some more warnings
dkanada 5 years ago
parent
commit
89a21c96c0
79 changed files with 878 additions and 695 deletions
  1. 2 2
      Emby.Server.Implementations/ApplicationHost.cs
  2. 2 2
      Emby.Server.Implementations/Channels/ChannelManager.cs
  3. 5 5
      Emby.Server.Implementations/Collections/CollectionManager.cs
  4. 5 5
      Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
  5. 52 64
      Emby.Server.Implementations/Data/SqliteExtensions.cs
  6. 24 21
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  7. 5 10
      Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
  8. 1 1
      Emby.Server.Implementations/Data/SqliteUserRepository.cs
  9. 1 1
      Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs
  10. 0 1
      Emby.Server.Implementations/Library/InvalidAuthProvider.cs
  11. 8 8
      Emby.Server.Implementations/Library/LibraryManager.cs
  12. 7 6
      Emby.Server.Implementations/Library/MediaSourceManager.cs
  13. 1 1
      Emby.Server.Implementations/Library/UserManager.cs
  14. 18 10
      Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
  15. 11 9
      Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
  16. 16 13
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  17. 13 16
      Emby.Server.Implementations/Playlists/PlaylistManager.cs
  18. 8 7
      Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
  19. 5 31
      Emby.Server.Implementations/Serialization/MyXmlSerializer.cs
  20. 1 1
      Emby.Server.Implementations/ServerApplicationPaths.cs
  21. 2 1
      MediaBrowser.Api/IHasItemFields.cs
  22. 14 17
      MediaBrowser.Api/ItemLookupService.cs
  23. 1 1
      MediaBrowser.Api/ItemRefreshService.cs
  24. 9 7
      MediaBrowser.Api/ItemUpdateService.cs
  25. 1 2
      MediaBrowser.Api/Subtitles/SubtitleService.cs
  26. 1 1
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  27. 11 13
      MediaBrowser.Common/Cryptography/PasswordHash.cs
  28. 1 1
      MediaBrowser.Controller/Entities/AggregateFolder.cs
  29. 2 2
      MediaBrowser.Controller/Entities/BaseItem.cs
  30. 1 1
      MediaBrowser.Controller/Entities/CollectionFolder.cs
  31. 1 1
      MediaBrowser.Controller/Entities/Folder.cs
  32. 1 1
      MediaBrowser.Controller/Entities/User.cs
  33. 2 7
      MediaBrowser.Controller/Providers/DirectoryService.cs
  34. 6 4
      MediaBrowser.Controller/Subtitles/ISubtitleManager.cs
  35. 3 3
      MediaBrowser.Model/IO/StreamDefaults.cs
  36. 1 2
      MediaBrowser.Providers/Books/AudioBookMetadataService.cs
  37. 11 4
      MediaBrowser.Providers/Books/BookMetadataService.cs
  38. 25 12
      MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
  39. 10 3
      MediaBrowser.Providers/Channels/ChannelMetadataService.cs
  40. 10 3
      MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs
  41. 12 4
      MediaBrowser.Providers/Folders/FolderMetadataService.cs
  42. 10 3
      MediaBrowser.Providers/Folders/UserViewMetadataService.cs
  43. 10 3
      MediaBrowser.Providers/Genres/GenreMetadataService.cs
  44. 10 3
      MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs
  45. 1 1
      MediaBrowser.Providers/Manager/ItemImageProvider.cs
  46. 2 4
      MediaBrowser.Providers/Manager/MetadataService.cs
  47. 2 2
      MediaBrowser.Providers/Manager/ProviderManager.cs
  48. 10 7
      MediaBrowser.Providers/Movies/MovieExternalIds.cs
  49. 12 36
      MediaBrowser.Providers/Movies/MovieMetadataService.cs
  50. 49 0
      MediaBrowser.Providers/Movies/TrailerMetadataService.cs
  51. 8 14
      MediaBrowser.Providers/Music/AlbumMetadataService.cs
  52. 20 11
      MediaBrowser.Providers/Music/ArtistMetadataService.cs
  53. 12 8
      MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs
  54. 23 22
      MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
  55. 11 8
      MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs
  56. 29 35
      MediaBrowser.Providers/Music/AudioDbArtistProvider.cs
  57. 20 15
      MediaBrowser.Providers/Music/AudioDbExternalIds.cs
  58. 1 2
      MediaBrowser.Providers/Music/AudioMetadataService.cs
  59. 46 32
      MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
  60. 10 17
      MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs
  61. 36 23
      MediaBrowser.Providers/Music/MusicExternalIds.cs
  62. 1 2
      MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
  63. 10 3
      MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
  64. 10 3
      MediaBrowser.Providers/People/PersonMetadataService.cs
  65. 10 12
      MediaBrowser.Providers/People/TvdbPersonImageProvider.cs
  66. 10 3
      MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs
  67. 10 3
      MediaBrowser.Providers/Photos/PhotoMetadataService.cs
  68. 21 12
      MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
  69. 9 3
      MediaBrowser.Providers/Studios/StudioMetadataService.cs
  70. 39 36
      MediaBrowser.Providers/Subtitles/SubtitleManager.cs
  71. 25 10
      MediaBrowser.Providers/TV/DummySeasonProvider.cs
  72. 12 4
      MediaBrowser.Providers/TV/EpisodeMetadataService.cs
  73. 14 16
      MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
  74. 16 7
      MediaBrowser.Providers/TV/SeasonMetadataService.cs
  75. 6 5
      MediaBrowser.Providers/TV/SeriesMetadataService.cs
  76. 21 16
      MediaBrowser.Providers/TV/TvExternalIds.cs
  77. 10 3
      MediaBrowser.Providers/Users/UserMetadataService.cs
  78. 12 4
      MediaBrowser.Providers/Videos/VideoMetadataService.cs
  79. 10 3
      MediaBrowser.Providers/Years/YearMetadataService.cs

+ 2 - 2
Emby.Server.Implementations/ApplicationHost.cs

@@ -362,7 +362,7 @@ namespace Emby.Server.Implementations
         {
             _configuration = configuration;
 
-            XmlSerializer = new MyXmlSerializer(fileSystem, loggerFactory);
+            XmlSerializer = new MyXmlSerializer();
 
             NetworkManager = networkManager;
             networkManager.LocalSubnetsFn = GetConfiguredLocalSubnets;
@@ -906,7 +906,7 @@ namespace Emby.Server.Implementations
 
             _displayPreferencesRepository.Initialize();
 
-            var userDataRepo = new SqliteUserDataRepository(LoggerFactory, ApplicationPaths);
+            var userDataRepo = new SqliteUserDataRepository(LoggerFactory.CreateLogger<SqliteUserDataRepository>(), ApplicationPaths);
 
             SetStaticProperties();
 

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

@@ -470,7 +470,7 @@ namespace Emby.Server.Implementations.Channels
                 _libraryManager.CreateItem(item, null);
             }
 
-            await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+            await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem))
             {
                 ForceSave = !isNew && forceUpdate
             }, cancellationToken);
@@ -1156,7 +1156,7 @@ namespace Emby.Server.Implementations.Channels
 
             if (isNew || forceUpdate || item.DateLastRefreshed == default(DateTime))
             {
-                _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.Normal);
+                _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.Normal);
             }
 
             return item;

+ 5 - 5
Emby.Server.Implementations/Collections/CollectionManager.cs

@@ -149,7 +149,7 @@ namespace Emby.Server.Implementations.Collections
 
                 if (options.ItemIdList.Length > 0)
                 {
-                    AddToCollection(collection.Id, options.ItemIdList, false, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+                    AddToCollection(collection.Id, options.ItemIdList, false, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         // The initial adding of items is going to create a local metadata file
                         // This will cause internet metadata to be skipped as a result
@@ -158,7 +158,7 @@ namespace Emby.Server.Implementations.Collections
                 }
                 else
                 {
-                    _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.High);
+                    _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.High);
                 }
 
                 CollectionCreated?.Invoke(this, new CollectionCreatedEventArgs
@@ -178,12 +178,12 @@ namespace Emby.Server.Implementations.Collections
 
         public void AddToCollection(Guid collectionId, IEnumerable<string> ids)
         {
-            AddToCollection(collectionId, ids, true, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)));
+            AddToCollection(collectionId, ids, true, new MetadataRefreshOptions(new DirectoryService(_fileSystem)));
         }
 
         public void AddToCollection(Guid collectionId, IEnumerable<Guid> ids)
         {
-            AddToCollection(collectionId, ids.Select(i => i.ToString("N", CultureInfo.InvariantCulture)), true, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)));
+            AddToCollection(collectionId, ids.Select(i => i.ToString("N", CultureInfo.InvariantCulture)), true, new MetadataRefreshOptions(new DirectoryService(_fileSystem)));
         }
 
         private void AddToCollection(Guid collectionId, IEnumerable<string> ids, bool fireEvent, MetadataRefreshOptions refreshOptions)
@@ -287,7 +287,7 @@ namespace Emby.Server.Implementations.Collections
             }
 
             collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
-            _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+            _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
             {
                 ForceSave = true
             }, RefreshPriority.High);

+ 5 - 5
Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs

@@ -110,8 +110,8 @@ namespace Emby.Server.Implementations.Data
 
             using (var statement = connection.PrepareStatement("replace into userdisplaypreferences (id, userid, client, data) values (@id, @userId, @client, @data)"))
             {
-                statement.TryBind("@id", displayPreferences.Id.ToGuidBlob());
-                statement.TryBind("@userId", userId.ToGuidBlob());
+                statement.TryBind("@id", new Guid(displayPreferences.Id).ToByteArray());
+                statement.TryBind("@userId", userId.ToByteArray());
                 statement.TryBind("@client", client);
                 statement.TryBind("@data", serialized);
 
@@ -170,8 +170,8 @@ namespace Emby.Server.Implementations.Data
             {
                 using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where id = @id and userId=@userId and client=@client"))
                 {
-                    statement.TryBind("@id", guidId.ToGuidBlob());
-                    statement.TryBind("@userId", userId.ToGuidBlob());
+                    statement.TryBind("@id", guidId.ToByteArray());
+                    statement.TryBind("@userId", userId.ToByteArray());
                     statement.TryBind("@client", client);
 
                     foreach (var row in statement.ExecuteQuery())
@@ -200,7 +200,7 @@ namespace Emby.Server.Implementations.Data
             using (var connection = GetConnection(true))
             using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where userId=@userId"))
             {
-                statement.TryBind("@userId", userId.ToGuidBlob());
+                statement.TryBind("@userId", userId.ToByteArray());
 
                 foreach (var row in statement.ExecuteQuery())
                 {

+ 52 - 64
Emby.Server.Implementations/Data/SqliteExtensions.cs

@@ -9,6 +9,47 @@ namespace Emby.Server.Implementations.Data
 {
     public static class SqliteExtensions
     {
+        private const string DatetimeFormatUtc = "yyyy-MM-dd HH:mm:ss.FFFFFFFK";
+        private const string DatetimeFormatLocal = "yyyy-MM-dd HH:mm:ss.FFFFFFF";
+
+        /// <summary>
+        /// An array of ISO-8601 DateTime formats that we support parsing.
+        /// </summary>
+        private static readonly string[] _datetimeFormats = new string[]
+        {
+            "THHmmssK",
+            "THHmmK",
+            "HH:mm:ss.FFFFFFFK",
+            "HH:mm:ssK",
+            "HH:mmK",
+            DatetimeFormatUtc,
+            "yyyy-MM-dd HH:mm:ssK",
+            "yyyy-MM-dd HH:mmK",
+            "yyyy-MM-ddTHH:mm:ss.FFFFFFFK",
+            "yyyy-MM-ddTHH:mmK",
+            "yyyy-MM-ddTHH:mm:ssK",
+            "yyyyMMddHHmmssK",
+            "yyyyMMddHHmmK",
+            "yyyyMMddTHHmmssFFFFFFFK",
+            "THHmmss",
+            "THHmm",
+            "HH:mm:ss.FFFFFFF",
+            "HH:mm:ss",
+            "HH:mm",
+            DatetimeFormatLocal,
+            "yyyy-MM-dd HH:mm:ss",
+            "yyyy-MM-dd HH:mm",
+            "yyyy-MM-ddTHH:mm:ss.FFFFFFF",
+            "yyyy-MM-ddTHH:mm",
+            "yyyy-MM-ddTHH:mm:ss",
+            "yyyyMMddHHmmss",
+            "yyyyMMddHHmm",
+            "yyyyMMddTHHmmssFFFFFFF",
+            "yyyy-MM-dd",
+            "yyyyMMdd",
+            "yy-MM-dd"
+        };
+
         public static void RunQueries(this SQLiteDatabaseConnection connection, string[] queries)
         {
             if (queries == null)
@@ -22,16 +63,6 @@ namespace Emby.Server.Implementations.Data
             });
         }
 
-        public static byte[] ToGuidBlob(this string str)
-        {
-            return ToGuidBlob(new Guid(str));
-        }
-
-        public static byte[] ToGuidBlob(this Guid guid)
-        {
-            return guid.ToByteArray();
-        }
-
         public static Guid ReadGuidFromBlob(this IResultSetValue result)
         {
             return new Guid(result.ToBlob());
@@ -50,58 +81,16 @@ namespace Emby.Server.Implementations.Data
                     CultureInfo.InvariantCulture);
         }
 
-        private static string GetDateTimeKindFormat(
-           DateTimeKind kind)
-        {
-            return (kind == DateTimeKind.Utc) ? _datetimeFormatUtc : _datetimeFormatLocal;
-        }
-
-        /// <summary>
-        /// An array of ISO-8601 DateTime formats that we support parsing.
-        /// </summary>
-        private static string[] _datetimeFormats = new string[] {
-      "THHmmssK",
-      "THHmmK",
-      "HH:mm:ss.FFFFFFFK",
-      "HH:mm:ssK",
-      "HH:mmK",
-      "yyyy-MM-dd HH:mm:ss.FFFFFFFK", /* NOTE: UTC default (5). */
-      "yyyy-MM-dd HH:mm:ssK",
-      "yyyy-MM-dd HH:mmK",
-      "yyyy-MM-ddTHH:mm:ss.FFFFFFFK",
-      "yyyy-MM-ddTHH:mmK",
-      "yyyy-MM-ddTHH:mm:ssK",
-      "yyyyMMddHHmmssK",
-      "yyyyMMddHHmmK",
-      "yyyyMMddTHHmmssFFFFFFFK",
-      "THHmmss",
-      "THHmm",
-      "HH:mm:ss.FFFFFFF",
-      "HH:mm:ss",
-      "HH:mm",
-      "yyyy-MM-dd HH:mm:ss.FFFFFFF", /* NOTE: Non-UTC default (19). */
-      "yyyy-MM-dd HH:mm:ss",
-      "yyyy-MM-dd HH:mm",
-      "yyyy-MM-ddTHH:mm:ss.FFFFFFF",
-      "yyyy-MM-ddTHH:mm",
-      "yyyy-MM-ddTHH:mm:ss",
-      "yyyyMMddHHmmss",
-      "yyyyMMddHHmm",
-      "yyyyMMddTHHmmssFFFFFFF",
-      "yyyy-MM-dd",
-      "yyyyMMdd",
-      "yy-MM-dd"
-    };
-
-        private static string _datetimeFormatUtc = _datetimeFormats[5];
-        private static string _datetimeFormatLocal = _datetimeFormats[19];
+        private static string GetDateTimeKindFormat(DateTimeKind kind)
+            => (kind == DateTimeKind.Utc) ? DatetimeFormatUtc : DatetimeFormatLocal;
 
         public static DateTime ReadDateTime(this IResultSetValue result)
         {
             var dateText = result.ToString();
 
             return DateTime.ParseExact(
-                dateText, _datetimeFormats,
+                dateText,
+                _datetimeFormats,
                 DateTimeFormatInfo.InvariantInfo,
                 DateTimeStyles.None).ToUniversalTime();
         }
@@ -139,7 +128,10 @@ namespace Emby.Server.Implementations.Data
 
         public static void Attach(SQLiteDatabaseConnection db, string path, string alias)
         {
-            var commandText = string.Format("attach @path as {0};", alias);
+            var commandText = string.Format(
+                CultureInfo.InvariantCulture,
+                "attach @path as {0};",
+                alias);
 
             using (var statement = db.PrepareStatement(commandText))
             {
@@ -186,10 +178,7 @@ namespace Emby.Server.Implementations.Data
         private static void CheckName(string name)
         {
 #if DEBUG
-            //if (!name.IndexOf("@", StringComparison.OrdinalIgnoreCase) != 0)
-            {
-                throw new Exception("Invalid param name: " + name);
-            }
+            throw new ArgumentException("Invalid param name: " + name, nameof(name));
 #endif
         }
 
@@ -264,7 +253,7 @@ namespace Emby.Server.Implementations.Data
         {
             if (statement.BindParameters.TryGetValue(name, out IBindParameter bindParam))
             {
-                bindParam.Bind(value.ToGuidBlob());
+                bindParam.Bind(value.ToByteArray());
             }
             else
             {
@@ -392,8 +381,7 @@ namespace Emby.Server.Implementations.Data
             }
         }
 
-        public static IEnumerable<IReadOnlyList<IResultSetValue>> ExecuteQuery(
-            this IStatement This)
+        public static IEnumerable<IReadOnlyList<IResultSetValue>> ExecuteQuery(this IStatement This)
         {
             while (This.MoveNext())
             {

+ 24 - 21
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -549,7 +549,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     using (var saveImagesStatement = base.PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
                     {
-                        saveImagesStatement.TryBind("@Id", item.Id.ToGuidBlob());
+                        saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
                         saveImagesStatement.TryBind("@Images", SerializeImages(item));
 
                         saveImagesStatement.MoveNext();
@@ -1989,7 +1989,7 @@ namespace Emby.Server.Implementations.Data
                 throw new ArgumentNullException(nameof(chapters));
             }
 
-            var idBlob = id.ToGuidBlob();
+            var idBlob = id.ToByteArray();
 
             using (var connection = GetConnection())
             {
@@ -3768,7 +3768,7 @@ namespace Emby.Server.Implementations.Data
 
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, personId.ToGuidBlob());
+                        statement.TryBind(paramName, personId.ToByteArray());
                     }
                     index++;
                 }
@@ -3979,7 +3979,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, artistId.ToGuidBlob());
+                        statement.TryBind(paramName, artistId.ToByteArray());
                     }
                     index++;
                 }
@@ -3998,7 +3998,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=1))");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, artistId.ToGuidBlob());
+                        statement.TryBind(paramName, artistId.ToByteArray());
                     }
                     index++;
                 }
@@ -4017,7 +4017,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("((select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type=0) AND (select CleanName from TypedBaseItems where guid=" + paramName + ") not in (select CleanValue from itemvalues where ItemId=Guid and Type=1))");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, artistId.ToGuidBlob());
+                        statement.TryBind(paramName, artistId.ToByteArray());
                     }
                     index++;
                 }
@@ -4036,7 +4036,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("Album in (select Name from typedbaseitems where guid=" + paramName + ")");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, albumId.ToGuidBlob());
+                        statement.TryBind(paramName, albumId.ToByteArray());
                     }
                     index++;
                 }
@@ -4055,7 +4055,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("(guid not in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, artistId.ToGuidBlob());
+                        statement.TryBind(paramName, artistId.ToByteArray());
                     }
                     index++;
                 }
@@ -4074,7 +4074,7 @@ namespace Emby.Server.Implementations.Data
                     clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=2))");
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, genreId.ToGuidBlob());
+                        statement.TryBind(paramName, genreId.ToByteArray());
                     }
                     index++;
                 }
@@ -4145,7 +4145,7 @@ namespace Emby.Server.Implementations.Data
 
                     if (statement != null)
                     {
-                        statement.TryBind(paramName, studioId.ToGuidBlob());
+                        statement.TryBind(paramName, studioId.ToByteArray());
                     }
                     index++;
                 }
@@ -4921,7 +4921,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
             {
                 connection.RunInTransaction(db =>
                 {
-                    var idBlob = id.ToGuidBlob();
+                    var idBlob = id.ToByteArray();
 
                     // Delete people
                     ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob);
@@ -5040,7 +5040,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 whereClauses.Add("ItemId=@ItemId");
                 if (statement != null)
                 {
-                    statement.TryBind("@ItemId", query.ItemId.ToGuidBlob());
+                    statement.TryBind("@ItemId", query.ItemId.ToByteArray());
                 }
             }
             if (!query.AppearsInItemId.Equals(Guid.Empty))
@@ -5048,7 +5048,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)");
                 if (statement != null)
                 {
-                    statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToGuidBlob());
+                    statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToByteArray());
                 }
             }
             var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList();
@@ -5117,7 +5117,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
             CheckDisposed();
 
-            var itemIdBlob = itemId.ToGuidBlob();
+            var itemIdBlob = itemId.ToByteArray();
 
             // First delete
             deleteAncestorsStatement.Reset();
@@ -5151,7 +5151,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
                     var ancestorId = ancestorIds[i];
 
-                    statement.TryBind("@AncestorId" + index, ancestorId.ToGuidBlob());
+                    statement.TryBind("@AncestorId" + index, ancestorId.ToByteArray());
                     statement.TryBind("@AncestorIdText" + index, ancestorId.ToString("N", CultureInfo.InvariantCulture));
                 }
 
@@ -5616,7 +5616,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
             CheckDisposed();
 
-            var guidBlob = itemId.ToGuidBlob();
+            var guidBlob = itemId.ToByteArray();
 
             // First delete
             db.Execute("delete from ItemValues where ItemId=@Id", guidBlob);
@@ -5640,10 +5640,13 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 {
                     if (isSubsequentRow)
                     {
-                        insertText.Append(",");
+                        insertText.Append(',');
                     }
 
-                    insertText.AppendFormat("(@ItemId, @Type{0}, @Value{0}, @CleanValue{0})", i.ToString(CultureInfo.InvariantCulture));
+                    insertText.AppendFormat(
+                        CultureInfo.InvariantCulture,
+                        "(@ItemId, @Type{0}, @Value{0}, @CleanValue{0})",
+                        i);
                     isSubsequentRow = true;
                 }
 
@@ -5696,7 +5699,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
             {
                 connection.RunInTransaction(db =>
                 {
-                    var itemIdBlob = itemId.ToGuidBlob();
+                    var itemIdBlob = itemId.ToByteArray();
 
                     // First delete chapters
                     db.Execute("delete from People where ItemId=@ItemId", itemIdBlob);
@@ -5815,7 +5818,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
                 using (var statement = PrepareStatement(connection, cmdText))
                 {
-                    statement.TryBind("@ItemId", query.ItemId.ToGuidBlob());
+                    statement.TryBind("@ItemId", query.ItemId.ToByteArray());
 
                     if (query.Type.HasValue)
                     {
@@ -5857,7 +5860,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
             {
                 connection.RunInTransaction(db =>
                 {
-                    var itemIdBlob = id.ToGuidBlob();
+                    var itemIdBlob = id.ToByteArray();
 
                     // First delete chapters
                     db.Execute("delete from mediastreams where ItemId=@ItemId", itemIdBlob);

+ 5 - 10
Emby.Server.Implementations/Data/SqliteUserDataRepository.cs

@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
-using System.Linq;
 using System.Threading;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Entities;
@@ -15,23 +14,19 @@ namespace Emby.Server.Implementations.Data
     public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
     {
         public SqliteUserDataRepository(
-            ILoggerFactory loggerFactory,
+            ILogger<SqliteUserDataRepository> logger,
             IApplicationPaths appPaths)
-            : base(loggerFactory.CreateLogger(nameof(SqliteUserDataRepository)))
+            : base(logger)
         {
             DbFilePath = Path.Combine(appPaths.DataPath, "library.db");
         }
 
-        /// <summary>
-        /// Gets the name of the repository
-        /// </summary>
-        /// <value>The name.</value>
+        /// <inheritdoc />
         public string Name => "SQLite";
 
         /// <summary>
-        /// Opens the connection to the database
+        /// Opens the connection to the database.
         /// </summary>
-        /// <returns>Task.</returns>
         public void Initialize(IUserManager userManager, SemaphoreSlim dbLock, SQLiteDatabaseConnection dbConnection)
         {
             WriteLock.Dispose();
@@ -97,7 +92,7 @@ namespace Emby.Server.Implementations.Data
                         continue;
                     }
 
-                    statement.TryBind("@UserId", user.Id.ToGuidBlob());
+                    statement.TryBind("@UserId", user.Id.ToByteArray());
                     statement.TryBind("@InternalUserId", user.InternalId);
 
                     statement.MoveNext();

+ 1 - 1
Emby.Server.Implementations/Data/SqliteUserRepository.cs

@@ -116,7 +116,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     using (var statement = db.PrepareStatement("insert into LocalUsersv2 (guid, data) values (@guid, @data)"))
                     {
-                        statement.TryBind("@guid", user.Id.ToGuidBlob());
+                        statement.TryBind("@guid", user.Id.ToByteArray());
                         statement.TryBind("@data", serialized);
 
                         statement.MoveNext();

+ 1 - 1
Emby.Server.Implementations/EntryPoints/RefreshUsersMetadata.cs

@@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.EntryPoints
             {
                 cancellationToken.ThrowIfCancellationRequested();
 
-                await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false);
+                await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
             }
         }
 

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

@@ -1,7 +1,6 @@
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Authentication;
 using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Net;
 
 namespace Emby.Server.Implementations.Library
 {

+ 8 - 8
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -519,7 +519,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null)
-            => ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), null, parent);
+            => ResolvePath(fileInfo, new DirectoryService(_fileSystem), null, parent);
 
         private BaseItem ResolvePath(
             FileSystemMetadata fileInfo,
@@ -1045,7 +1045,7 @@ namespace Emby.Server.Implementations.Library
             await RootFolder.ValidateChildren(
                 new SimpleProgress<double>(),
                 cancellationToken,
-                new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)),
+                new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
                 recursive: false).ConfigureAwait(false);
 
             await GetUserRootFolder().RefreshMetadata(cancellationToken).ConfigureAwait(false);
@@ -1053,7 +1053,7 @@ namespace Emby.Server.Implementations.Library
             await GetUserRootFolder().ValidateChildren(
                 new SimpleProgress<double>(),
                 cancellationToken,
-                new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)),
+                new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
                 recursive: false).ConfigureAwait(false);
 
             // Quickly scan CollectionFolders for changes
@@ -1074,7 +1074,7 @@ namespace Emby.Server.Implementations.Library
             innerProgress.RegisterAction(pct => progress.Report(pct * .96));
 
             // Now validate the entire media library
-            await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), recursive: true).ConfigureAwait(false);
+            await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), recursive: true).ConfigureAwait(false);
 
             progress.Report(96);
 
@@ -2135,7 +2135,7 @@ namespace Emby.Server.Implementations.Library
             if (refresh)
             {
                 item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None);
-                _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.Normal);
+                _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.Normal);
             }
 
             return item;
@@ -2193,7 +2193,7 @@ namespace Emby.Server.Implementations.Library
             {
                 _providerManagerFactory().QueueRefresh(
                     item.Id,
-                    new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         // Need to force save to increment DateLastSaved
                         ForceSave = true
@@ -2261,7 +2261,7 @@ namespace Emby.Server.Implementations.Library
             {
                 _providerManagerFactory().QueueRefresh(
                     item.Id,
-                    new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         // Need to force save to increment DateLastSaved
                         ForceSave = true
@@ -2338,7 +2338,7 @@ namespace Emby.Server.Implementations.Library
             {
                 _providerManagerFactory().QueueRefresh(
                     item.Id,
-                    new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         // Need to force save to increment DateLastSaved
                         ForceSave = true

+ 7 - 6
Emby.Server.Implementations/Library/MediaSourceManager.cs

@@ -134,12 +134,13 @@ namespace Emby.Server.Implementations.Library
 
             if (allowMediaProbe && mediaSources[0].Type != MediaSourceType.Placeholder && !mediaSources[0].MediaStreams.Any(i => i.Type == MediaStreamType.Audio || i.Type == MediaStreamType.Video))
             {
-                await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
-                {
-                    EnableRemoteContentProbe = true,
-                    MetadataRefreshMode = MediaBrowser.Controller.Providers.MetadataRefreshMode.FullRefresh
-
-                }, cancellationToken).ConfigureAwait(false);
+                await item.RefreshMetadata(
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
+                    {
+                        EnableRemoteContentProbe = true,
+                        MetadataRefreshMode = MetadataRefreshMode.FullRefresh
+                    },
+                    cancellationToken).ConfigureAwait(false);
 
                 mediaSources = GetStaticMediaSources(item, enablePathSubstitution, user);
             }

+ 1 - 1
Emby.Server.Implementations/Library/UserManager.cs

@@ -639,7 +639,7 @@ namespace Emby.Server.Implementations.Library
         {
             foreach (var user in Users)
             {
-                await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false);
+                await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
             }
         }
 

+ 18 - 10
Emby.Server.Implementations/Library/Validators/PeopleValidator.cs

@@ -11,16 +11,17 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Library.Validators
 {
     /// <summary>
-    /// Class PeopleValidator
+    /// Class PeopleValidator.
     /// </summary>
     public class PeopleValidator
     {
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
+
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
 
@@ -62,7 +63,7 @@ namespace Emby.Server.Implementations.Library.Validators
                 {
                     var item = _libraryManager.GetPerson(person);
 
-                    var options = new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+                    var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         ImageRefreshMode = MetadataRefreshMode.ValidationOnly,
                         MetadataRefreshMode = MetadataRefreshMode.ValidationOnly
@@ -96,12 +97,19 @@ namespace Emby.Server.Implementations.Library.Validators
 
             foreach (var item in deadEntities)
             {
-                _logger.LogInformation("Deleting dead {2} {0} {1}.", item.Id.ToString("N", CultureInfo.InvariantCulture), item.Name, item.GetType().Name);
-
-                _libraryManager.DeleteItem(item, new DeleteOptions
-                {
-                    DeleteFileLocation = false
-                }, false);
+                _logger.LogInformation(
+                    "Deleting dead {2} {0} {1}.",
+                    item.Id.ToString("N", CultureInfo.InvariantCulture),
+                    item.Name,
+                    item.GetType().Name);
+
+                _libraryManager.DeleteItem(
+                    item,
+                    new DeleteOptions
+                    {
+                        DeleteFileLocation = false
+                    },
+                    false);
             }
 
             progress.Report(100);

+ 11 - 9
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -1489,16 +1489,18 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             {
                 _logger.LogInformation("Refreshing recording parent {path}", item.Path);
 
-                _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
-                {
-                    RefreshPaths = new string[]
+                _providerManager.QueueRefresh(
+                    item.Id,
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
-                        path,
-                        Path.GetDirectoryName(path),
-                        Path.GetDirectoryName(Path.GetDirectoryName(path))
-                    }
-
-                }, RefreshPriority.High);
+                        RefreshPaths = new string[]
+                        {
+                            path,
+                            Path.GetDirectoryName(path),
+                            Path.GetDirectoryName(Path.GetDirectoryName(path))
+                        }
+                    },
+                    RefreshPriority.High);
             }
         }
 

+ 16 - 13
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1226,12 +1226,13 @@ namespace Emby.Server.Implementations.LiveTv
                         currentChannel.AddTag("Kids");
                     }
 
-                    //currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken);
-                    await currentChannel.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
-                    {
-                        ForceSave = true
-
-                    }, cancellationToken).ConfigureAwait(false);
+                    currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken);
+                    await currentChannel.RefreshMetadata(
+                        new MetadataRefreshOptions(new DirectoryService(_fileSystem))
+                        {
+                            ForceSave = true
+                        },
+                        cancellationToken).ConfigureAwait(false);
                 }
                 catch (OperationCanceledException)
                 {
@@ -1245,7 +1246,7 @@ namespace Emby.Server.Implementations.LiveTv
                 numComplete++;
                 double percent = numComplete / (double)allChannelsList.Count;
 
-                progress.Report(85 * percent + 15);
+                progress.Report((85 * percent) + 15);
             }
 
             progress.Report(100);
@@ -1278,12 +1279,14 @@ namespace Emby.Server.Implementations.LiveTv
 
                     if (item != null)
                     {
-                        _libraryManager.DeleteItem(item, new DeleteOptions
-                        {
-                            DeleteFileLocation = false,
-                            DeleteFromExternalProvider = false
-
-                        }, false);
+                        _libraryManager.DeleteItem(
+                            item,
+                            new DeleteOptions
+                            {
+                                DeleteFileLocation = false,
+                                DeleteFromExternalProvider = false
+                            },
+                            false);
                     }
                 }
 

+ 13 - 16
Emby.Server.Implementations/Playlists/PlaylistManager.cs

@@ -90,8 +90,7 @@ namespace Emby.Server.Implementations.Playlists
                     }
                     else
                     {
-                        var folder = item as Folder;
-                        if (folder != null)
+                        if (item is Folder folder)
                         {
                             options.MediaType = folder.GetRecursiveChildren(i => !i.IsFolder && i.SupportsAddingToPlaylist)
                                 .Select(i => i.MediaType)
@@ -140,7 +139,7 @@ namespace Emby.Server.Implementations.Playlists
 
                 parentFolder.AddChild(playlist, CancellationToken.None);
 
-                await playlist.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) { ForceSave = true }, CancellationToken.None)
+                await playlist.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)) { ForceSave = true }, CancellationToken.None)
                     .ConfigureAwait(false);
 
                 if (options.ItemIdList.Length > 0)
@@ -201,7 +200,7 @@ namespace Emby.Server.Implementations.Playlists
 
             var list = new List<LinkedChild>();
 
-            var items = (GetPlaylistItems(itemIds, playlist.MediaType, user, options))
+            var items = GetPlaylistItems(itemIds, playlist.MediaType, user, options)
                 .Where(i => i.SupportsAddingToPlaylist)
                 .ToList();
 
@@ -221,18 +220,18 @@ namespace Emby.Server.Implementations.Playlists
                 SavePlaylistFile(playlist);
             }
 
-            _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
-            {
-                ForceSave = true
-
-            }, RefreshPriority.High);
+            _providerManager.QueueRefresh(
+                playlist.Id,
+                new MetadataRefreshOptions(new DirectoryService(_fileSystem))
+                {
+                    ForceSave = true
+                },
+                RefreshPriority.High);
         }
 
         public void RemoveFromPlaylist(string playlistId, IEnumerable<string> entryIds)
         {
-            var playlist = _libraryManager.GetItemById(playlistId) as Playlist;
-
-            if (playlist == null)
+            if (!(_libraryManager.GetItemById(playlistId) is Playlist playlist))
             {
                 throw new ArgumentException("No Playlist exists with the supplied Id");
             }
@@ -254,7 +253,7 @@ namespace Emby.Server.Implementations.Playlists
                 SavePlaylistFile(playlist);
             }
 
-            _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+            _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
             {
                 ForceSave = true
 
@@ -263,9 +262,7 @@ namespace Emby.Server.Implementations.Playlists
 
         public void MoveItem(string playlistId, string entryId, int newIndex)
         {
-            var playlist = _libraryManager.GetItemById(playlistId) as Playlist;
-
-            if (playlist == null)
+            if (!(_libraryManager.GetItemById(playlistId) is Playlist playlist))
             {
                 throw new ArgumentException("No Playlist exists with the supplied Id");
             }

+ 8 - 7
Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs

@@ -19,16 +19,17 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Class ChapterImagesTask
+    /// Class ChapterImagesTask.
     /// </summary>
     public class ChapterImagesTask : IScheduledTask
     {
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
+
         /// <summary>
-        /// The _library manager
+        /// The _library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
@@ -53,12 +54,12 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Creates the triggers that define when the task will run
+        /// Creates the triggers that define when the task will run.
         /// </summary>
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
         {
-            return new[] {
-
+            return new[]
+            {
                 new TaskTriggerInfo
                 {
                     Type = TaskTriggerInfo.TriggerDaily,
@@ -117,7 +118,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
                 previouslyFailedImages = new List<string>();
             }
 
-            var directoryService = new DirectoryService(_logger, _fileSystem);
+            var directoryService = new DirectoryService(_fileSystem);
 
             foreach (var video in videos)
             {

+ 5 - 31
Emby.Server.Implementations/Serialization/XmlSerializer.cs → Emby.Server.Implementations/Serialization/MyXmlSerializer.cs

@@ -1,11 +1,9 @@
 using System;
-using System.Collections.Generic;
+using System.Collections.Concurrent;
 using System.IO;
 using System.Xml;
 using System.Xml.Serialization;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Serialization;
-using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.Serialization
 {
@@ -14,35 +12,13 @@ namespace Emby.Server.Implementations.Serialization
     /// </summary>
     public class MyXmlSerializer : IXmlSerializer
     {
-        private readonly IFileSystem _fileSystem;
-        private readonly ILogger _logger;
-
-        public MyXmlSerializer(
-            IFileSystem fileSystem,
-            ILoggerFactory loggerFactory)
-        {
-            _fileSystem = fileSystem;
-            _logger = loggerFactory.CreateLogger("XmlSerializer");
-        }
-
         // Need to cache these
         // http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html
-        private readonly Dictionary<string, XmlSerializer> _serializers =
-            new Dictionary<string, XmlSerializer>();
+        private static readonly ConcurrentDictionary<string, XmlSerializer> _serializers =
+            new ConcurrentDictionary<string, XmlSerializer>();
 
-        private XmlSerializer GetSerializer(Type type)
-        {
-            var key = type.FullName;
-            lock (_serializers)
-            {
-                if (!_serializers.TryGetValue(key, out var serializer))
-                {
-                    serializer = new XmlSerializer(type);
-                    _serializers[key] = serializer;
-                }
-                return serializer;
-            }
-        }
+        private static XmlSerializer GetSerializer(Type type)
+            => _serializers.GetOrAdd(type.FullName, _ => new XmlSerializer(type));
 
         /// <summary>
         /// Serializes to writer.
@@ -91,7 +67,6 @@ namespace Emby.Server.Implementations.Serialization
         /// <param name="file">The file.</param>
         public void SerializeToFile(object obj, string file)
         {
-            _logger.LogDebug("Serializing to file {0}", file);
             using (var stream = new FileStream(file, FileMode.Create))
             {
                 SerializeToStream(obj, stream);
@@ -106,7 +81,6 @@ namespace Emby.Server.Implementations.Serialization
         /// <returns>System.Object.</returns>
         public object DeserializeFromFile(Type type, string file)
         {
-            _logger.LogDebug("Deserializing file {0}", file);
             using (var stream = File.OpenRead(file))
             {
                 return DeserializeFromStream(type, stream);

+ 1 - 1
Emby.Server.Implementations/ServerApplicationPaths.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Controller;
 namespace Emby.Server.Implementations
 {
     /// <summary>
-    /// Extends BaseApplicationPaths to add paths that are only applicable on the server
+    /// Extends BaseApplicationPaths to add paths that are only applicable on the server.
     /// </summary>
     public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
     {

+ 2 - 1
MediaBrowser.Api/IHasItemFields.cs

@@ -32,7 +32,7 @@ namespace MediaBrowser.Api
 
             if (string.IsNullOrEmpty(val))
             {
-                return new ItemFields[] { };
+                return Array.Empty<ItemFields>();
             }
 
             return val.Split(',').Select(v =>
@@ -41,6 +41,7 @@ namespace MediaBrowser.Api
                 {
                     return (ItemFields?)value;
                 }
+
                 return null;
 
             }).Where(i => i.HasValue).Select(i => i.Value).ToArray();

+ 14 - 17
MediaBrowser.Api/ItemLookupService.cs

@@ -227,15 +227,17 @@ namespace MediaBrowser.Api
             //item.ProductionYear = request.ProductionYear;
             //item.Name = request.Name;
 
-            return _providerManager.RefreshFullItem(item, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem))
-            {
-                MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
-                ImageRefreshMode = MetadataRefreshMode.FullRefresh,
-                ReplaceAllMetadata = true,
-                ReplaceAllImages = request.ReplaceAllImages,
-                SearchResult = request
-
-            }, CancellationToken.None);
+            return _providerManager.RefreshFullItem(
+                item,
+                new MetadataRefreshOptions(new DirectoryService(_fileSystem))
+                {
+                    MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
+                    ImageRefreshMode = MetadataRefreshMode.FullRefresh,
+                    ReplaceAllMetadata = true,
+                    ReplaceAllImages = request.ReplaceAllImages,
+                    SearchResult = request
+                },
+                CancellationToken.None);
         }
 
         /// <summary>
@@ -294,11 +296,9 @@ namespace MediaBrowser.Api
 
             Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
             using (var stream = result.Content)
+            using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
             {
-                using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
-                {
-                    await stream.CopyToAsync(filestream).ConfigureAwait(false);
-                }
+                await stream.CopyToAsync(filestream).ConfigureAwait(false);
             }
 
             Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
@@ -311,9 +311,6 @@ namespace MediaBrowser.Api
         /// <param name="filename">The filename.</param>
         /// <returns>System.String.</returns>
         private string GetFullCachePath(string filename)
-        {
-            return Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename);
-        }
-
+            => Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename);
     }
 }

+ 1 - 1
MediaBrowser.Api/ItemRefreshService.cs

@@ -63,7 +63,7 @@ namespace MediaBrowser.Api
 
         private MetadataRefreshOptions GetRefreshOptions(RefreshItem request)
         {
-            return new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))
+            return new MetadataRefreshOptions(new DirectoryService(_fileSystem))
             {
                 MetadataRefreshMode = request.MetadataRefreshMode,
                 ImageRefreshMode = request.ImageRefreshMode,

+ 9 - 7
MediaBrowser.Api/ItemUpdateService.cs

@@ -225,13 +225,15 @@ namespace MediaBrowser.Api
 
             if (displayOrderChanged)
             {
-                _providerManager.QueueRefresh(series.Id, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem))
-                {
-                    MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
-                    ImageRefreshMode = MetadataRefreshMode.FullRefresh,
-                    ReplaceAllMetadata = true
-
-                }, RefreshPriority.High);
+                _providerManager.QueueRefresh(
+                    series.Id,
+                    new MetadataRefreshOptions(new DirectoryService(_fileSystem))
+                    {
+                        MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
+                        ImageRefreshMode = MetadataRefreshMode.FullRefresh,
+                        ReplaceAllMetadata = true
+                    },
+                    RefreshPriority.High);
             }
         }
 

+ 1 - 2
MediaBrowser.Api/Subtitles/SubtitleService.cs

@@ -279,13 +279,12 @@ namespace MediaBrowser.Api.Subtitles
                     await _subtitleManager.DownloadSubtitles(video, request.SubtitleId, CancellationToken.None)
                         .ConfigureAwait(false);
 
-                    _providerManager.QueueRefresh(video.Id, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem)), RefreshPriority.High);
+                    _providerManager.QueueRefresh(video.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.High);
                 }
                 catch (Exception ex)
                 {
                     Logger.LogError(ex, "Error downloading subtitles");
                 }
-
             });
         }
     }

+ 1 - 1
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -413,7 +413,7 @@ namespace MediaBrowser.Api.UserLibrary
 
                 if (!hasMetdata)
                 {
-                    var options = new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem))
+                    var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem))
                     {
                         MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
                         ImageRefreshMode = MetadataRefreshMode.FullRefresh,

+ 11 - 13
MediaBrowser.Common/Cryptography/PasswordHash.cs

@@ -124,10 +124,10 @@ namespace MediaBrowser.Common.Cryptography
             stringBuilder.Append('$');
             foreach (var pair in _parameters)
             {
-                stringBuilder.Append(pair.Key);
-                stringBuilder.Append('=');
-                stringBuilder.Append(pair.Value);
-                stringBuilder.Append(',');
+                stringBuilder.Append(pair.Key)
+                    .Append('=')
+                    .Append(pair.Value)
+                    .Append(',');
             }
 
             // Remove last ','
@@ -137,21 +137,19 @@ namespace MediaBrowser.Common.Cryptography
         /// <inheritdoc />
         public override string ToString()
         {
-            var str = new StringBuilder();
-            str.Append('$');
-            str.Append(Id);
+            var str = new StringBuilder()
+                .Append('$')
+                .Append(Id);
             SerializeParameters(str);
 
             if (Salt.Length != 0)
             {
-                str.Append('$');
-                str.Append(ToHexString(Salt));
+                str.Append('$')
+                    .Append(ToHexString(Salt));
             }
 
-            str.Append('$');
-            str.Append(ToHexString(Hash));
-
-            return str.ToString();
+            return str.Append('$')
+                .Append(ToHexString(Hash)).ToString();
         }
     }
 }

+ 1 - 1
MediaBrowser.Controller/Entities/AggregateFolder.cs

@@ -89,7 +89,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 var locations = PhysicalLocations;
 
-                var newLocations = CreateResolveArgs(new DirectoryService(Logger, FileSystem), false).PhysicalLocations;
+                var newLocations = CreateResolveArgs(new DirectoryService(FileSystem), false).PhysicalLocations;
 
                 if (!locations.SequenceEqual(newLocations))
                 {

+ 2 - 2
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -1344,7 +1344,7 @@ namespace MediaBrowser.Controller.Entities
 
         public Task RefreshMetadata(CancellationToken cancellationToken)
         {
-            return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)), cancellationToken);
+            return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken);
         }
 
         protected virtual void TriggerOnRefreshStart()
@@ -2197,7 +2197,7 @@ namespace MediaBrowser.Controller.Entities
         /// <returns>Task.</returns>
         public virtual void ChangedExternally()
         {
-            ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem))
+            ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(new DirectoryService(FileSystem))
             {
 
             }, RefreshPriority.High);

+ 1 - 1
MediaBrowser.Controller/Entities/CollectionFolder.cs

@@ -171,7 +171,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 var locations = PhysicalLocations;
 
-                var newLocations = CreateResolveArgs(new DirectoryService(Logger, FileSystem), false).PhysicalLocations;
+                var newLocations = CreateResolveArgs(new DirectoryService(FileSystem), false).PhysicalLocations;
 
                 if (!locations.SequenceEqual(newLocations))
                 {

+ 1 - 1
MediaBrowser.Controller/Entities/Folder.cs

@@ -216,7 +216,7 @@ namespace MediaBrowser.Controller.Entities
 
         public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken)
         {
-            return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)));
+            return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(FileSystem)));
         }
 
         /// <summary>

+ 1 - 1
MediaBrowser.Controller/Entities/User.cs

@@ -148,7 +148,7 @@ namespace MediaBrowser.Controller.Entities
             Name = newName;
 
             return RefreshMetadata(
-                new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem))
+                new MetadataRefreshOptions(new DirectoryService(FileSystem))
                 {
                     ReplaceAllMetadata = true,
                     ImageRefreshMode = MetadataRefreshMode.FullRefresh,

+ 2 - 7
MediaBrowser.Controller/Providers/DirectoryService.cs

@@ -2,13 +2,11 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using MediaBrowser.Model.IO;
-using Microsoft.Extensions.Logging;
 
 namespace MediaBrowser.Controller.Providers
 {
     public class DirectoryService : IDirectoryService
     {
-        private readonly ILogger _logger;
         private readonly IFileSystem _fileSystem;
 
         private readonly Dictionary<string, FileSystemMetadata[]> _cache = new Dictionary<string, FileSystemMetadata[]>(StringComparer.OrdinalIgnoreCase);
@@ -17,9 +15,8 @@ namespace MediaBrowser.Controller.Providers
 
         private readonly Dictionary<string, List<string>> _filePathCache = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
 
-        public DirectoryService(ILogger logger, IFileSystem fileSystem)
+        public DirectoryService(IFileSystem fileSystem)
         {
-            _logger = logger;
             _fileSystem = fileSystem;
         }
 
@@ -27,8 +24,6 @@ namespace MediaBrowser.Controller.Providers
         {
             if (!_cache.TryGetValue(path, out FileSystemMetadata[] entries))
             {
-                //_logger.LogDebug("Getting files for " + path);
-
                 entries = _fileSystem.GetFileSystemEntries(path).ToArray();
 
                 //_cache.TryAdd(path, entries);
@@ -49,6 +44,7 @@ namespace MediaBrowser.Controller.Providers
                     list.Add(item);
                 }
             }
+
             return list;
         }
 
@@ -89,6 +85,5 @@ namespace MediaBrowser.Controller.Providers
 
             return result;
         }
-
     }
 }

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

@@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Subtitles
         /// <summary>
         /// Searches the subtitles.
         /// </summary>
-        Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video,
+        Task<RemoteSubtitleInfo[]> SearchSubtitles(
+            Video video,
             string language,
             bool? isPerfectMatch,
             CancellationToken cancellationToken);
@@ -34,8 +35,9 @@ namespace MediaBrowser.Controller.Subtitles
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{IEnumerable{RemoteSubtitleInfo}}.</returns>
-        Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request,
+        /// <returns>Task{RemoteSubtitleInfo[]}.</returns>
+        Task<RemoteSubtitleInfo[]> SearchSubtitles(
+            SubtitleSearchRequest request,
             CancellationToken cancellationToken);
 
         /// <summary>
@@ -53,7 +55,7 @@ namespace MediaBrowser.Controller.Subtitles
         /// </summary>
         /// <param name="id">The identifier.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{SubtitleResponse}.</returns>
+        /// <returns><see cref="Task{SubtitleResponse}" />.</returns>
         Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken);
 
         /// <summary>

+ 3 - 3
MediaBrowser.Model/IO/StreamDefaults.cs

@@ -1,17 +1,17 @@
 namespace MediaBrowser.Model.IO
 {
     /// <summary>
-    /// Class StreamDefaults
+    /// Class StreamDefaults.
     /// </summary>
     public static class StreamDefaults
     {
         /// <summary>
-        /// The default copy to buffer size
+        /// The default copy to buffer size.
         /// </summary>
         public const int DefaultCopyToBufferSize = 81920;
 
         /// <summary>
-        /// The default file stream buffer size
+        /// The default file stream buffer size.
         /// </summary>
         public const int DefaultFileStreamBufferSize = 4096;
     }

+ 1 - 2
MediaBrowser.Providers/Books/AudioBookMetadataService.cs

@@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Books
             ILogger logger,
             IProviderManager providerManager,
             IFileSystem fileSystem,
-            IUserDataManager userDataManager,
             ILibraryManager libraryManager)
-            : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
         }
 

+ 11 - 4
MediaBrowser.Providers/Books/BookMetadataService.cs

@@ -11,6 +11,17 @@ namespace MediaBrowser.Providers.Books
 {
     public class BookMetadataService : MetadataService<Book, BookInfo>
     {
+        public BookMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Book> source, MetadataResult<Book> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -20,9 +31,5 @@ namespace MediaBrowser.Providers.Books
                 target.Item.SeriesName = source.Item.SeriesName;
             }
         }
-
-        public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
 }

+ 25 - 12
MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs

@@ -14,11 +14,35 @@ namespace MediaBrowser.Providers.BoxSets
 {
     public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo>
     {
+        public BoxSetMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingGenresFromChildren => true;
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingOfficialRatingFromChildren => true;
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingStudiosFromChildren => true;
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingPremiereDateFromChildren => true;
+
+        /// <inheritdoc />
         protected override IList<BaseItem> GetChildrenForMetadataUpdates(BoxSet item)
         {
             return item.GetLinkedChildren();
         }
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<BoxSet> source, MetadataResult<BoxSet> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -32,6 +56,7 @@ namespace MediaBrowser.Providers.BoxSets
             }
         }
 
+        /// <inheritdoc />
         protected override ItemUpdateType BeforeSaveInternal(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType)
         {
             var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@@ -47,17 +72,5 @@ namespace MediaBrowser.Providers.BoxSets
 
             return updateType;
         }
-
-        public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
-
-        protected override bool EnableUpdatingGenresFromChildren => true;
-
-        protected override bool EnableUpdatingOfficialRatingFromChildren => true;
-
-        protected override bool EnableUpdatingStudiosFromChildren => true;
-
-        protected override bool EnableUpdatingPremiereDateFromChildren => true;
     }
 }

+ 10 - 3
MediaBrowser.Providers/Channels/ChannelMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Channels
 {
     public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public ChannelMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 3
MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs

@@ -12,13 +12,20 @@ namespace MediaBrowser.Providers.Folders
 {
     public class CollectionFolderMetadataService : MetadataService<CollectionFolder, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<CollectionFolder> source, MetadataResult<CollectionFolder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public CollectionFolderMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public CollectionFolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<CollectionFolder> source, MetadataResult<CollectionFolder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 12 - 4
MediaBrowser.Providers/Folders/FolderMetadataService.cs

@@ -11,16 +11,24 @@ namespace MediaBrowser.Providers.Folders
 {
     public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
     {
+        public FolderMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         // Make sure the type-specific services get picked first
         public override int Order => 10;
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Folder> source, MetadataResult<Folder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
-
-        public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
 }

+ 10 - 3
MediaBrowser.Providers/Folders/UserViewMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Folders
 {
     public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public UserViewMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 3
MediaBrowser.Providers/Genres/GenreMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Genres
 {
     public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public GenreMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 3
MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.LiveTv
 {
     public class LiveTvMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public LiveTvMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public LiveTvMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 1 - 1
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -340,7 +340,7 @@ namespace MediaBrowser.Providers.Manager
 
             if (deleted)
             {
-                item.ValidateImages(new DirectoryService(_logger, _fileSystem));
+                item.ValidateImages(new DirectoryService(_fileSystem));
             }
         }
 

+ 2 - 4
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -23,16 +23,14 @@ namespace MediaBrowser.Providers.Manager
         protected readonly ILogger Logger;
         protected readonly IProviderManager ProviderManager;
         protected readonly IFileSystem FileSystem;
-        protected readonly IUserDataManager UserDataManager;
         protected readonly ILibraryManager LibraryManager;
 
-        protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager)
+        protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, ILibraryManager libraryManager)
         {
             ServerConfigurationManager = serverConfigurationManager;
             Logger = logger;
             ProviderManager = providerManager;
             FileSystem = fileSystem;
-            UserDataManager = userDataManager;
             LibraryManager = libraryManager;
         }
 
@@ -44,7 +42,7 @@ namespace MediaBrowser.Providers.Manager
             }
             catch (Exception ex)
             {
-                Logger.LogError(ex, "Error getting file {path}", path);
+                Logger.LogError(ex, "Error getting file {Path}", path);
                 return null;
             }
         }

+ 2 - 2
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -328,7 +328,7 @@ namespace MediaBrowser.Providers.Manager
 
             return GetImageProviders(item, libraryOptions, options,
                     new ImageRefreshOptions(
-                        new DirectoryService(_logger, _fileSystem)),
+                        new DirectoryService(_fileSystem)),
                     includeDisabled)
                 .OfType<IRemoteImageProvider>();
         }
@@ -507,7 +507,7 @@ namespace MediaBrowser.Providers.Manager
 
             var imageProviders = GetImageProviders(dummy, libraryOptions, options,
                                     new ImageRefreshOptions(
-                                        new DirectoryService(_logger, _fileSystem)),
+                                        new DirectoryService(_fileSystem)),
                                     true)
                                 .ToList();
 

+ 10 - 7
MediaBrowser.Providers/Movies/MovieExternalIds.cs

@@ -9,17 +9,20 @@ namespace MediaBrowser.Providers.Movies
 {
     public class ImdbExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "IMDb";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Imdb.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.imdb.com/title/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
         {
             // Supports images for tv movies
-            var tvProgram = item as LiveTvProgram;
-            if (tvProgram != null && tvProgram.IsMovie)
+            if (item is LiveTvProgram tvProgram && tvProgram.IsMovie)
             {
                 return true;
             }
@@ -28,18 +31,18 @@ namespace MediaBrowser.Providers.Movies
         }
     }
 
-
     public class ImdbPersonExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "IMDb";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Imdb.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.imdb.com/name/{0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Person;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Person;
     }
 }

+ 12 - 36
MediaBrowser.Providers/Movies/MovieMetadataService.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
@@ -12,6 +11,17 @@ namespace MediaBrowser.Providers.Movies
 {
     public class MovieMetadataService : MetadataService<Movie, MovieInfo>
     {
+        public MovieMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         protected override bool IsFullLocalMetadata(Movie item)
         {
             if (string.IsNullOrWhiteSpace(item.Overview))
@@ -25,6 +35,7 @@ namespace MediaBrowser.Providers.Movies
             return base.IsFullLocalMetadata(item);
         }
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Movie> source, MetadataResult<Movie> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -37,40 +48,5 @@ namespace MediaBrowser.Providers.Movies
                 targetItem.CollectionName = sourceItem.CollectionName;
             }
         }
-
-        public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
-
-    public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
-    {
-        protected override bool IsFullLocalMetadata(Trailer item)
-        {
-            if (string.IsNullOrWhiteSpace(item.Overview))
-            {
-                return false;
-            }
-            if (!item.ProductionYear.HasValue)
-            {
-                return false;
-            }
-            return base.IsFullLocalMetadata(item);
-        }
-
-        protected override void MergeData(MetadataResult<Trailer> source, MetadataResult<Trailer> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
-        {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
-
-            if (replaceData || target.Item.TrailerTypes.Length == 0)
-            {
-                target.Item.TrailerTypes = source.Item.TrailerTypes;
-            }
-        }
-
-        public TrailerMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
-    }
-
 }

+ 49 - 0
MediaBrowser.Providers/Movies/TrailerMetadataService.cs

@@ -0,0 +1,49 @@
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Providers.Manager;
+using Microsoft.Extensions.Logging;
+
+namespace MediaBrowser.Providers.Movies
+{
+    public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
+    {
+        public TrailerMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
+        protected override bool IsFullLocalMetadata(Trailer item)
+        {
+            if (string.IsNullOrWhiteSpace(item.Overview))
+            {
+                return false;
+            }
+            if (!item.ProductionYear.HasValue)
+            {
+                return false;
+            }
+            return base.IsFullLocalMetadata(item);
+        }
+
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Trailer> source, MetadataResult<Trailer> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
+
+            if (replaceData || target.Item.TrailerTypes.Length == 0)
+            {
+                target.Item.TrailerTypes = source.Item.TrailerTypes;
+            }
+        }
+    }
+}

+ 8 - 14
MediaBrowser.Providers/Music/AlbumMetadataService.cs

@@ -20,9 +20,8 @@ namespace MediaBrowser.Providers.Music
             ILogger logger,
             IProviderManager providerManager,
             IFileSystem fileSystem,
-            IUserDataManager userDataManager,
             ILibraryManager libraryManager)
-            : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
         }
 
@@ -37,10 +36,7 @@ namespace MediaBrowser.Providers.Music
 
         /// <inheritdoc />
         protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicAlbum item)
-        {
-            return item.GetRecursiveChildren(i => i is Audio)
-                        .ToList();
-        }
+            => item.GetRecursiveChildren(i => i is Audio);
 
         /// <inheritdoc />
         protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
@@ -53,20 +49,18 @@ namespace MediaBrowser.Providers.Music
                 {
                     var name = children.Select(i => i.Album).FirstOrDefault(i => !string.IsNullOrEmpty(i));
 
-                    if (!string.IsNullOrEmpty(name))
+                    if (!string.IsNullOrEmpty(name)
+                        && !string.Equals(item.Name, name, StringComparison.Ordinal))
                     {
-                        if (!string.Equals(item.Name, name, StringComparison.Ordinal))
-                        {
-                            item.Name = name;
-                            updateType = updateType | ItemUpdateType.MetadataEdit;
-                        }
+                        item.Name = name;
+                        updateType |= ItemUpdateType.MetadataEdit;
                     }
                 }
 
                 var songs = children.Cast<Audio>().ToArray();
 
-                updateType = updateType | SetAlbumArtistFromSongs(item, songs);
-                updateType = updateType | SetArtistsFromSongs(item, songs);
+                updateType |= SetAlbumArtistFromSongs(item, songs);
+                updateType |= SetArtistsFromSongs(item, songs);
             }
 
             return updateType;

+ 20 - 11
MediaBrowser.Providers/Music/ArtistMetadataService.cs

@@ -13,26 +13,35 @@ namespace MediaBrowser.Providers.Music
 {
     public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo>
     {
-        protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicArtist item)
+        public ArtistMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            return item.IsAccessedByName ?
-                item.GetTaggedItems(new InternalItemsQuery
-                {
-                    Recursive = true,
-                    IsFolder = false
-                }) :
-                item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder);
         }
 
+        /// <inheritdoc />
         protected override bool EnableUpdatingGenresFromChildren => true;
 
-        protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        /// <inheritdoc />
+        protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicArtist item)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
+            return item.IsAccessedByName
+                ? item.GetTaggedItems(new InternalItemsQuery
+                    {
+                        Recursive = true,
+                        IsFolder = false
+                    })
+                : item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder);
         }
 
-        public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 12 - 8
MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs

@@ -25,6 +25,14 @@ namespace MediaBrowser.Providers.Music
             _json = json;
         }
 
+        /// <inheritdoc />
+        public string Name => "TheAudioDB";
+
+        /// <inheritdoc />
+        // After embedded and fanart
+        public int Order => 2;
+
+        /// <inheritdoc />
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
             return new List<ImageType>
@@ -34,6 +42,7 @@ namespace MediaBrowser.Providers.Music
             };
         }
 
+        /// <inheritdoc />
         public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
         {
             var id = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
@@ -82,6 +91,7 @@ namespace MediaBrowser.Providers.Music
             return list;
         }
 
+        /// <inheritdoc />
         public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClient.GetResponse(new HttpRequestOptions
@@ -91,13 +101,7 @@ namespace MediaBrowser.Providers.Music
             });
         }
 
-        public string Name => "TheAudioDB";
-        // After embedded and fanart
-        public int Order => 2;
-
-        public bool Supports(BaseItem item)
-        {
-            return item is MusicAlbum;
-        }
+        /// <inheritdoc />
+        public bool Supports(BaseItem item) => item is MusicAlbum;
     }
 }

+ 23 - 22
MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs

@@ -2,6 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
+using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
@@ -26,8 +27,6 @@ namespace MediaBrowser.Providers.Music
 
         public static AudioDbAlbumProvider Current;
 
-        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-
         public AudioDbAlbumProvider(IServerConfigurationManager config, IFileSystem fileSystem, IHttpClient httpClient, IJsonSerializer json)
         {
             _config = config;
@@ -38,11 +37,18 @@ namespace MediaBrowser.Providers.Music
             Current = this;
         }
 
+        /// <inheritdoc />
+        public string Name => "TheAudioDB";
+
+        /// <inheritdoc />
+        // After music brainz
+        public int Order => 1;
+
+        /// <inheritdoc />
         public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
-        {
-            return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
-        }
+            => Task.FromResult(Enumerable.Empty<RemoteSearchResult>());
 
+        /// <inheritdoc />
         public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo info, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<MusicAlbum>();
@@ -77,7 +83,7 @@ namespace MediaBrowser.Providers.Music
 
             if (!string.IsNullOrEmpty(result.intYearReleased))
             {
-                item.ProductionYear = int.Parse(result.intYearReleased, _usCulture);
+                item.ProductionYear = int.Parse(result.intYearReleased, CultureInfo.InvariantCulture);
             }
 
             if (!string.IsNullOrEmpty(result.strGenre))
@@ -126,8 +132,6 @@ namespace MediaBrowser.Providers.Music
             item.Overview = (overview ?? string.Empty).StripHtml();
         }
 
-        public string Name => "TheAudioDB";
-
         internal Task EnsureInfo(string musicBrainzReleaseGroupId, CancellationToken cancellationToken)
         {
             var xmlPath = GetAlbumInfoPath(_config.ApplicationPaths, musicBrainzReleaseGroupId);
@@ -155,20 +159,18 @@ namespace MediaBrowser.Providers.Music
 
             Directory.CreateDirectory(Path.GetDirectoryName(path));
 
-            using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions
-            {
-                Url = url,
-                CancellationToken = cancellationToken
+            using (var httpResponse = await _httpClient.SendAsync(
+                new HttpRequestOptions
+                {
+                    Url = url,
+                    CancellationToken = cancellationToken
 
-            }, "GET").ConfigureAwait(false))
+                },
+                "GET").ConfigureAwait(false))
+            using (var response = httpResponse.Content)
+            using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
             {
-                using (var response = httpResponse.Content)
-                {
-                    using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
-                    {
-                        await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
-                    }
-                }
+                await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
             }
         }
 
@@ -192,8 +194,6 @@ namespace MediaBrowser.Providers.Music
 
             return Path.Combine(dataPath, "album.json");
         }
-        // After music brainz
-        public int Order => 1;
 
         public class Album
         {
@@ -242,6 +242,7 @@ namespace MediaBrowser.Providers.Music
             public List<Album> album { get; set; }
         }
 
+        /// <inheritdoc />
         public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();

+ 11 - 8
MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs

@@ -25,6 +25,14 @@ namespace MediaBrowser.Providers.Music
             _httpClient = httpClient;
         }
 
+        /// <inheritdoc />
+        public string Name => "TheAudioDB";
+
+        /// <inheritdoc />
+        // After fanart
+        public int Order => 1;
+
+        /// <inheritdoc />
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
             return new List<ImageType>
@@ -36,6 +44,7 @@ namespace MediaBrowser.Providers.Music
             };
         }
 
+        /// <inheritdoc />
         public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
         {
             var id = item.GetProviderId(MetadataProviders.MusicBrainzArtist);
@@ -133,13 +142,7 @@ namespace MediaBrowser.Providers.Music
             });
         }
 
-        public string Name => "TheAudioDB";
-
-        public bool Supports(BaseItem item)
-        {
-            return item is MusicArtist;
-        }
-        // After fanart
-        public int Order => 1;
+        /// <inheritdoc />
+        public bool Supports(BaseItem item) => item is MusicArtist;
     }
 }

+ 29 - 35
MediaBrowser.Providers/Music/AudioDbArtistProvider.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
@@ -37,11 +38,18 @@ namespace MediaBrowser.Providers.Music
             Current = this;
         }
 
+        /// <inheritdoc />
+        public string Name => "TheAudioDB";
+
+        /// <inheritdoc />
+        // After musicbrainz
+        public int Order => 1;
+
+        /// <inheritdoc />
         public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
-        {
-            return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
-        }
+            => Task.FromResult(Enumerable.Empty<RemoteSearchResult>());
 
+        /// <inheritdoc />
         public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo info, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<MusicArtist>();
@@ -114,20 +122,16 @@ namespace MediaBrowser.Providers.Music
             item.Overview = (overview ?? string.Empty).StripHtml();
         }
 
-        public string Name => "TheAudioDB";
-
         internal Task EnsureArtistInfo(string musicBrainzId, CancellationToken cancellationToken)
         {
             var xmlPath = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
 
             var fileInfo = _fileSystem.GetFileSystemInfo(xmlPath);
 
-            if (fileInfo.Exists)
+            if (fileInfo.Exists
+                && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2)
             {
-                if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2)
-                {
-                    return Task.CompletedTask;
-                }
+                return Task.CompletedTask;
             }
 
             return DownloadArtistInfo(musicBrainzId, cancellationToken);
@@ -141,22 +145,21 @@ namespace MediaBrowser.Providers.Music
 
             var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
 
-            using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions
+            using (var httpResponse = await _httpClient.SendAsync(
+                new HttpRequestOptions
+                {
+                    Url = url,
+                    CancellationToken = cancellationToken,
+                    BufferContent = true
+                },
+                "GET").ConfigureAwait(false))
+            using (var response = httpResponse.Content)
             {
-                Url = url,
-                CancellationToken = cancellationToken,
-                BufferContent = true
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
-            }, "GET").ConfigureAwait(false))
-            {
-                using (var response = httpResponse.Content)
+                using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
                 {
-                    Directory.CreateDirectory(Path.GetDirectoryName(path));
-
-                    using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
-                    {
-                        await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
-                    }
+                    await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
                 }
             }
         }
@@ -168,11 +171,7 @@ namespace MediaBrowser.Providers.Music
         /// <param name="musicBrainzArtistId">The music brainz artist identifier.</param>
         /// <returns>System.String.</returns>
         private static string GetArtistDataPath(IApplicationPaths appPaths, string musicBrainzArtistId)
-        {
-            var dataPath = Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId);
-
-            return dataPath;
-        }
+            => Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId);
 
         /// <summary>
         /// Gets the artist data path.
@@ -180,11 +179,7 @@ namespace MediaBrowser.Providers.Music
         /// <param name="appPaths">The application paths.</param>
         /// <returns>System.String.</returns>
         private static string GetArtistDataPath(IApplicationPaths appPaths)
-        {
-            var dataPath = Path.Combine(appPaths.CachePath, "audiodb-artist");
-
-            return dataPath;
-        }
+            => Path.Combine(appPaths.CachePath, "audiodb-artist");
 
         internal static string GetArtistInfoPath(IApplicationPaths appPaths, string musicBrainzArtistId)
         {
@@ -242,9 +237,8 @@ namespace MediaBrowser.Providers.Music
         {
             public List<Artist> artists { get; set; }
         }
-        // After musicbrainz
-        public int Order => 1;
 
+        /// <inheritdoc />
         public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();

+ 20 - 15
MediaBrowser.Providers/Music/AudioDbExternalIds.cs

@@ -6,58 +6,63 @@ namespace MediaBrowser.Providers.Music
 {
     public class AudioDbAlbumExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheAudioDb";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.AudioDbAlbum.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is MusicAlbum;
-        }
+            => item is MusicAlbum;
     }
 
     public class AudioDbOtherAlbumExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheAudioDb Album";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.AudioDbAlbum.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Audio;
     }
 
     public class AudioDbArtistExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheAudioDb";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.AudioDbArtist.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is MusicArtist;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is MusicArtist;
     }
 
     public class AudioDbOtherArtistExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheAudioDb Artist";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.AudioDbArtist.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio || item is MusicAlbum;
-        }
+            => item is Audio || item is MusicAlbum;
     }
-
 }

+ 1 - 2
MediaBrowser.Providers/Music/AudioMetadataService.cs

@@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Music
             ILogger logger,
             IProviderManager providerManager,
             IFileSystem fileSystem,
-            IUserDataManager userDataManager,
             ILibraryManager libraryManager)
-            : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
         }
 

+ 46 - 32
MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Net;
@@ -14,7 +15,6 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Logging;
 
@@ -22,16 +22,6 @@ namespace MediaBrowser.Providers.Music
 {
     public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
     {
-        internal static MusicBrainzAlbumProvider Current;
-
-        private readonly IHttpClient _httpClient;
-        private readonly IApplicationHost _appHost;
-        private readonly ILogger _logger;
-        private readonly IJsonSerializer _json;
-        private Stopwatch _stopWatchMusicBrainz = new Stopwatch();
-
-        public readonly string MusicBrainzBaseUrl;
-
         /// <summary>
         /// The Jellyfin user-agent is unrestricted but source IP must not exceed
         /// one request per second, therefore we rate limit to avoid throttling.
@@ -47,19 +37,27 @@ namespace MediaBrowser.Providers.Music
         /// </summary>
         private const uint MusicBrainzQueryAttempts = 5u;
 
+        internal static MusicBrainzAlbumProvider Current;
+
+        private readonly IHttpClient _httpClient;
+        private readonly IApplicationHost _appHost;
+        private readonly ILogger _logger;
+
+        private readonly string _musicBrainzBaseUrl;
+
+        private Stopwatch _stopWatchMusicBrainz = new Stopwatch();
+
         public MusicBrainzAlbumProvider(
             IHttpClient httpClient,
             IApplicationHost appHost,
             ILogger logger,
-            IJsonSerializer json,
             IConfiguration configuration)
         {
             _httpClient = httpClient;
             _appHost = appHost;
             _logger = logger;
-            _json = json;
 
-            MusicBrainzBaseUrl = configuration["MusicBrainz:BaseUrl"];
+            _musicBrainzBaseUrl = configuration["MusicBrainz:BaseUrl"];
 
             // Use a stopwatch to ensure we don't exceed the MusicBrainz rate limit
             _stopWatchMusicBrainz.Start();
@@ -67,6 +65,13 @@ namespace MediaBrowser.Providers.Music
             Current = this;
         }
 
+        /// <inheritdoc />
+        public string Name => "MusicBrainz";
+
+        /// <inheritdoc />
+        public int Order => 0;
+
+        /// <inheritdoc />
         public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
         {
             var releaseId = searchInfo.GetReleaseId();
@@ -76,11 +81,11 @@ namespace MediaBrowser.Providers.Music
 
             if (!string.IsNullOrEmpty(releaseId))
             {
-                url = string.Format("/ws/2/release/?query=reid:{0}", releaseId);
+                url = "/ws/2/release/?query=reid:" + releaseId.ToString(CultureInfo.InvariantCulture);
             }
             else if (!string.IsNullOrEmpty(releaseGroupId))
             {
-                url = string.Format("/ws/2/release?release-group={0}", releaseGroupId);
+                url = "/ws/2/release?release-group=" + releaseGroupId.ToString(CultureInfo.InvariantCulture);
             }
             else
             {
@@ -88,7 +93,9 @@ namespace MediaBrowser.Providers.Music
 
                 if (!string.IsNullOrWhiteSpace(artistMusicBrainzId))
                 {
-                    url = string.Format("/ws/2/release/?query=\"{0}\" AND arid:{1}",
+                    url = string.Format(
+                        CultureInfo.InvariantCulture,
+                        "/ws/2/release/?query=\"{0}\" AND arid:{1}",
                         WebUtility.UrlEncode(searchInfo.Name),
                         artistMusicBrainzId);
                 }
@@ -97,7 +104,9 @@ namespace MediaBrowser.Providers.Music
                     // I'm sure there is a better way but for now it resolves search for 12" Mixes
                     var queryName = searchInfo.Name.Replace("\"", string.Empty);
 
-                    url = string.Format("/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
+                    url = string.Format(
+                        CultureInfo.InvariantCulture,
+                        "/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
                        WebUtility.UrlEncode(queryName),
                        WebUtility.UrlEncode(searchInfo.GetAlbumArtist()));
                 }
@@ -106,11 +115,9 @@ namespace MediaBrowser.Providers.Music
             if (!string.IsNullOrWhiteSpace(url))
             {
                 using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
+                using (var stream = response.Content)
                 {
-                    using (var stream = response.Content)
-                    {
-                        return GetResultsFromResponse(stream);
-                    }
+                    return GetResultsFromResponse(stream);
                 }
             }
 
@@ -156,6 +163,7 @@ namespace MediaBrowser.Providers.Music
                         {
                             result.SetProviderId(MetadataProviders.MusicBrainzAlbum, i.ReleaseId);
                         }
+
                         if (!string.IsNullOrWhiteSpace(i.ReleaseGroupId))
                         {
                             result.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, i.ReleaseGroupId);
@@ -168,6 +176,7 @@ namespace MediaBrowser.Providers.Music
             }
         }
 
+        /// <inheritdoc />
         public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
         {
             var releaseId = id.GetReleaseId();
@@ -238,8 +247,6 @@ namespace MediaBrowser.Providers.Music
             return result;
         }
 
-        public string Name => "MusicBrainz";
-
         private Task<ReleaseResult> GetReleaseResult(string artistMusicBrainId, string artistName, string albumName, CancellationToken cancellationToken)
         {
             if (!string.IsNullOrEmpty(artistMusicBrainId))
@@ -282,7 +289,9 @@ namespace MediaBrowser.Providers.Music
 
         private async Task<ReleaseResult> GetReleaseResultByArtistName(string albumName, string artistName, CancellationToken cancellationToken)
         {
-            var url = string.Format("/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
+            var url = string.Format(
+                CultureInfo.InvariantCulture,
+                "/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
                 WebUtility.UrlEncode(albumName),
                 WebUtility.UrlEncode(artistName));
 
@@ -334,6 +343,7 @@ namespace MediaBrowser.Providers.Music
                                         reader.Read();
                                         continue;
                                     }
+
                                     using (var subReader = reader.ReadSubtree())
                                     {
                                         return ParseReleaseList(subReader).ToList();
@@ -601,7 +611,7 @@ namespace MediaBrowser.Providers.Music
 
         private async Task<string> GetReleaseIdFromReleaseGroupId(string releaseGroupId, CancellationToken cancellationToken)
         {
-            var url = string.Format("/ws/2/release?release-group={0}", releaseGroupId);
+            var url = "/ws/2/release?release-group=" + releaseGroupId.ToString(CultureInfo.InvariantCulture);
 
             using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
             using (var stream = response.Content)
@@ -637,7 +647,7 @@ namespace MediaBrowser.Providers.Music
         /// <returns>Task{System.String}.</returns>
         private async Task<string> GetReleaseGroupFromReleaseId(string releaseEntryId, CancellationToken cancellationToken)
         {
-            var url = string.Format("/ws/2/release-group/?query=reid:{0}", releaseEntryId);
+            var url = "/ws/2/release-group/?query=reid:" + releaseEntryId.ToString(CultureInfo.InvariantCulture);
 
             using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
             using (var stream = response.Content)
@@ -687,6 +697,7 @@ namespace MediaBrowser.Providers.Music
                             reader.Read();
                         }
                     }
+
                     return null;
                 }
             }
@@ -734,11 +745,15 @@ namespace MediaBrowser.Providers.Music
         {
             var options = new HttpRequestOptions
             {
-                Url = MusicBrainzBaseUrl.TrimEnd('/') + url,
+                Url = _musicBrainzBaseUrl.TrimEnd('/') + url,
                 CancellationToken = cancellationToken,
                 // MusicBrainz request a contact email address is supplied, as comment, in user agent field:
                 // https://musicbrainz.org/doc/XML_Web_Service/Rate_Limiting#User-Agent
-                UserAgent = string.Format("{0} ( {1} )", _appHost.ApplicationUserAgent, _appHost.ApplicationUserAgentAddress),
+                UserAgent = string.Format(
+                    CultureInfo.InvariantCulture,
+                    "{0} ( {1} )",
+                    _appHost.ApplicationUserAgent,
+                    _appHost.ApplicationUserAgentAddress),
                 BufferContent = false
             };
 
@@ -768,7 +783,7 @@ namespace MediaBrowser.Providers.Music
             while (attempts < MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable);
 
             // Log error if unable to query MB database due to throttling
-            if (attempts == MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable )
+            if (attempts == MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable)
             {
                 _logger.LogError("GetMusicBrainzResponse: 503 Service Unavailable (throttled) response received {0} times whilst requesting {1}", attempts, options.Url);
             }
@@ -776,8 +791,7 @@ namespace MediaBrowser.Providers.Music
             return response;
         }
 
-        public int Order => 0;
-
+        /// <inheritdoc />
         public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();

+ 10 - 17
MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Net;
@@ -18,25 +19,19 @@ namespace MediaBrowser.Providers.Music
 {
     public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>
     {
-        public MusicBrainzArtistProvider()
-        {
-
-        }
-
+        /// <inheritdoc />
         public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
         {
             var musicBrainzId = searchInfo.GetMusicBrainzArtistId();
 
             if (!string.IsNullOrWhiteSpace(musicBrainzId))
             {
-                var url = string.Format("/ws/2/artist/?query=arid:{0}", musicBrainzId);
+                var url = "/ws/2/artist/?query=arid:{0}" + musicBrainzId.ToString(CultureInfo.InvariantCulture);
 
                 using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
+                using (var stream = response.Content)
                 {
-                    using (var stream = response.Content)
-                    {
-                        return GetResultsFromResponse(stream);
-                    }
+                    return GetResultsFromResponse(stream);
                 }
             }
             else
@@ -47,15 +42,13 @@ namespace MediaBrowser.Providers.Music
                 var url = string.Format("/ws/2/artist/?query=\"{0}\"&dismax=true", UrlEncode(nameToSearch));
 
                 using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
+                using (var stream = response.Content)
                 {
-                    using (var stream = response.Content)
-                    {
-                        var results = GetResultsFromResponse(stream).ToList();
+                    var results = GetResultsFromResponse(stream).ToList();
 
-                        if (results.Count > 0)
-                        {
-                            return results;
-                        }
+                    if (results.Count > 0)
+                    {
+                        return results;
                     }
                 }
 

+ 36 - 23
MediaBrowser.Providers/Music/MusicExternalIds.cs

@@ -7,99 +7,112 @@ namespace MediaBrowser.Providers.Music
 {
     public class MusicBrainzReleaseGroupExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz Release Group";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.MusicBrainzReleaseGroup.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/release-group/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio || item is MusicAlbum;
-        }
+            => item is Audio || item is MusicAlbum;
     }
 
     public class MusicBrainzAlbumArtistExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz Album Artist";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.MusicBrainzAlbumArtist.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio;
-        }
+            => item is Audio;
     }
 
     public class MusicBrainzAlbumExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz Album";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.MusicBrainzAlbum.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/release/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio || item is MusicAlbum;
-        }
+            => item is Audio || item is MusicAlbum;
     }
 
     public class MusicBrainzArtistExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.MusicBrainzArtist.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is MusicArtist;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is MusicArtist;
     }
 
     public class MusicBrainzOtherArtistExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz Artist";
 
+        /// <inheritdoc />
+
         public string Key => MetadataProviders.MusicBrainzArtist.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio || item is MusicAlbum;
-        }
+            => item is Audio || item is MusicAlbum;
     }
 
     public class MusicBrainzTrackId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "MusicBrainz Track";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.MusicBrainzTrack.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "https://musicbrainz.org/track/{0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Audio;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Audio;
     }
 
     public class ImvdbId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "IMVDb";
 
+        /// <inheritdoc />
         public string Key => "IMVDb";
 
+        /// <inheritdoc />
         public string UrlFormatString => null;
 
+        /// <inheritdoc />
         public bool Supports(IHasProviderIds item)
-        {
-            return item is MusicVideo;
-        }
+            => item is MusicVideo;
     }
 }

+ 1 - 2
MediaBrowser.Providers/Music/MusicVideoMetadataService.cs

@@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Music
             ILogger logger,
             IProviderManager providerManager,
             IFileSystem fileSystem,
-            IUserDataManager userDataManager,
             ILibraryManager libraryManager)
-            : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
         }
 

+ 10 - 3
MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.MusicGenres
 {
     public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public MusicGenreMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 3
MediaBrowser.Providers/People/PersonMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.People
 {
     public class PersonMetadataService : MetadataService<Person, PersonLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public PersonMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 12
MediaBrowser.Providers/People/TvdbPersonImageProvider.cs

@@ -32,23 +32,22 @@ namespace MediaBrowser.Providers.People
             _tvDbClientManager = tvDbClientManager;
         }
 
-        public string Name => ProviderName;
+        /// <inheritdoc />
+        public string Name => "TheTVDB";
 
-        public static string ProviderName => "TheTVDB";
+        /// <inheritdoc />
+        public int Order => 1;
 
-        public bool Supports(BaseItem item)
-        {
-            return item is Person;
-        }
+        /// <inheritdoc />
+        public bool Supports(BaseItem item) => item is Person;
 
+        /// <inheritdoc />
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
-            return new List<ImageType>
-            {
-                ImageType.Primary
-            };
+            yield return ImageType.Primary;
         }
 
+        /// <inheritdoc />
         public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
         {
             var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
@@ -104,8 +103,7 @@ namespace MediaBrowser.Providers.People
             }
         }
 
-        public int Order => 1;
-
+        /// <inheritdoc />
         public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClient.GetResponse(new HttpRequestOptions

+ 10 - 3
MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Photos
 {
     public class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public PhotoAlbumMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 10 - 3
MediaBrowser.Providers/Photos/PhotoMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Photos
 {
     public class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public PhotoMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 21 - 12
MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs

@@ -13,11 +13,30 @@ namespace MediaBrowser.Providers.Playlists
 {
     public class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo>
     {
-        protected override IList<BaseItem> GetChildrenForMetadataUpdates(Playlist item)
+        public PlaylistMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            return item.GetLinkedChildren();
         }
 
+        /// <inheritdoc />
+        protected override bool EnableUpdatingGenresFromChildren => true;
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingOfficialRatingFromChildren => true;
+
+        /// <inheritdoc />
+        protected override bool EnableUpdatingStudiosFromChildren => true;
+
+        /// <inheritdoc />
+        protected override IList<BaseItem> GetChildrenForMetadataUpdates(Playlist item)
+            => item.GetLinkedChildren();
+
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Playlist> source, MetadataResult<Playlist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -32,15 +51,5 @@ namespace MediaBrowser.Providers.Playlists
                 targetItem.Shares = sourceItem.Shares;
             }
         }
-
-        public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
-
-        protected override bool EnableUpdatingGenresFromChildren => true;
-
-        protected override bool EnableUpdatingOfficialRatingFromChildren => true;
-
-        protected override bool EnableUpdatingStudiosFromChildren => true;
     }
 }

+ 9 - 3
MediaBrowser.Providers/Studios/StudioMetadataService.cs

@@ -11,13 +11,19 @@ namespace MediaBrowser.Providers.Studios
 {
     public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public StudioMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem, ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 39 - 36
MediaBrowser.Providers/Subtitles/SubtitleManager.cs

@@ -19,6 +19,7 @@ using MediaBrowser.Model.Globalization;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Providers;
 using Microsoft.Extensions.Logging;
+using static MediaBrowser.Model.IO.StreamDefaults;
 
 namespace MediaBrowser.Providers.Subtitles
 {
@@ -30,8 +31,6 @@ namespace MediaBrowser.Providers.Subtitles
         private readonly ILibraryMonitor _monitor;
         private readonly IMediaSourceManager _mediaSourceManager;
 
-        public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
-
         private ILocalizationManager _localization;
 
         public SubtitleManager(
@@ -48,17 +47,18 @@ namespace MediaBrowser.Providers.Subtitles
             _localization = localizationManager;
         }
 
+        /// <inheritdoc />
+        public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
+
+        /// <inheritdoc />
         public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders)
         {
             _subtitleProviders = subtitleProviders
-                .OrderBy(i =>
-                {
-                    var hasOrder = i as IHasOrder;
-                    return hasOrder == null ? 0 : hasOrder.Order;
-                })
+                .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)
                 .ToArray();
         }
 
+        /// <inheritdoc />
         public async Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, CancellationToken cancellationToken)
         {
             if (request.Language != null)
@@ -104,7 +104,7 @@ namespace MediaBrowser.Providers.Subtitles
                         _logger.LogError(ex, "Error downloading subtitles from {Provider}", provider.Name);
                     }
                 }
-                return new RemoteSubtitleInfo[] { };
+                return Array.Empty<RemoteSubtitleInfo>();
             }
 
             var tasks = providers.Select(async i =>
@@ -120,7 +120,7 @@ namespace MediaBrowser.Providers.Subtitles
                 catch (Exception ex)
                 {
                     _logger.LogError(ex, "Error downloading subtitles from {0}", i.Name);
-                    return new RemoteSubtitleInfo[] { };
+                    return Array.Empty<RemoteSubtitleInfo>();
                 }
             });
 
@@ -129,6 +129,7 @@ namespace MediaBrowser.Providers.Subtitles
             return results.SelectMany(i => i).ToArray();
         }
 
+        /// <inheritdoc />
         public Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken)
         {
             var libraryOptions = BaseItem.LibraryManager.GetLibraryOptions(video);
@@ -136,7 +137,9 @@ namespace MediaBrowser.Providers.Subtitles
             return DownloadSubtitles(video, libraryOptions, subtitleId, cancellationToken);
         }
 
-        public async Task DownloadSubtitles(Video video,
+        /// <inheritdoc />
+        public async Task DownloadSubtitles(
+            Video video,
             LibraryOptions libraryOptions,
             string subtitleId,
             CancellationToken cancellationToken)
@@ -151,31 +154,29 @@ namespace MediaBrowser.Providers.Subtitles
                 var response = await GetRemoteSubtitles(subtitleId, cancellationToken).ConfigureAwait(false);
 
                 using (var stream = response.Stream)
+                using (var memoryStream = new MemoryStream())
                 {
-                    using (var memoryStream = new MemoryStream())
-                    {
-                        await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
-                        memoryStream.Position = 0;
+                    await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
+                    memoryStream.Position = 0;
 
-                        var savePaths = new List<string>();
-                        var saveFileName = Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLowerInvariant();
+                    var savePaths = new List<string>();
+                    var saveFileName = Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLowerInvariant();
 
-                        if (response.IsForced)
-                        {
-                            saveFileName += ".forced";
-                        }
+                    if (response.IsForced)
+                    {
+                        saveFileName += ".forced";
+                    }
 
-                        saveFileName += "." + response.Format.ToLowerInvariant();
+                    saveFileName += "." + response.Format.ToLowerInvariant();
 
-                        if (saveInMediaFolder)
-                        {
-                            savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName));
-                        }
+                    if (saveInMediaFolder)
+                    {
+                        savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName));
+                    }
 
-                        savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName));
+                    savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName));
 
-                        await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false);
-                    }
+                    await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false);
                 }
             }
             catch (RateLimitExceededException)
@@ -209,7 +210,7 @@ namespace MediaBrowser.Providers.Subtitles
                 {
                     Directory.CreateDirectory(Path.GetDirectoryName(savePath));
 
-                    using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
+                    using (var fs = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.Read, DefaultFileStreamBufferSize, true))
                     {
                         await stream.CopyToAsync(fs).ConfigureAwait(false);
                     }
@@ -237,11 +238,12 @@ namespace MediaBrowser.Providers.Subtitles
             }
         }
 
+        /// <inheritdoc />
         public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken)
         {
             if (video.VideoType != VideoType.VideoFile)
             {
-                return Task.FromResult(new RemoteSubtitleInfo[] { });
+                return Task.FromResult(Array.Empty<RemoteSubtitleInfo>());
             }
 
             VideoContentType mediaType;
@@ -257,7 +259,7 @@ namespace MediaBrowser.Providers.Subtitles
             else
             {
                 // These are the only supported types
-                return Task.FromResult(new RemoteSubtitleInfo[] { });
+                return Task.FromResult(Array.Empty<RemoteSubtitleInfo>());
             }
 
             var request = new SubtitleSearchRequest
@@ -274,9 +276,7 @@ namespace MediaBrowser.Providers.Subtitles
                 IsPerfectMatch = isPerfectMatch ?? false
             };
 
-            var episode = video as Episode;
-
-            if (episode != null)
+            if (video is Episode episode)
             {
                 request.IndexNumberEnd = episode.IndexNumberEnd;
                 request.SeriesName = episode.SeriesName;
@@ -303,6 +303,7 @@ namespace MediaBrowser.Providers.Subtitles
             return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name)));
         }
 
+        /// <inheritdoc />
         public Task DeleteSubtitles(BaseItem item, int index)
         {
             var stream = _mediaSourceManager.GetMediaStreams(new MediaStreamQuery
@@ -328,16 +329,18 @@ namespace MediaBrowser.Providers.Subtitles
             return item.RefreshMetadata(CancellationToken.None);
         }
 
+        /// <inheritdoc />
         public Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken)
         {
             var parts = id.Split(new[] { '_' }, 2);
 
-            var provider = GetProvider(parts.First());
+            var provider = GetProvider(parts[0]);
             id = parts.Last();
 
             return provider.GetSubtitles(id, cancellationToken);
         }
 
+        /// <inheritdoc />
         public SubtitleProviderInfo[] GetSupportedProviders(BaseItem video)
         {
             VideoContentType mediaType;
@@ -353,7 +356,7 @@ namespace MediaBrowser.Providers.Subtitles
             else
             {
                 // These are the only supported types
-                return new SubtitleProviderInfo[] { };
+                return Array.Empty<SubtitleProviderInfo>();
             }
 
             return _subtitleProviders

+ 25 - 10
MediaBrowser.Providers/TV/DummySeasonProvider.cs

@@ -16,17 +16,17 @@ namespace MediaBrowser.Providers.TV
 {
     public class DummySeasonProvider
     {
-        private readonly IServerConfigurationManager _config;
         private readonly ILogger _logger;
         private readonly ILocalizationManager _localization;
         private readonly ILibraryManager _libraryManager;
         private readonly IFileSystem _fileSystem;
 
-        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-
-        public DummySeasonProvider(IServerConfigurationManager config, ILogger logger, ILocalizationManager localization, ILibraryManager libraryManager, IFileSystem fileSystem)
+        public DummySeasonProvider(
+            ILogger logger,
+            ILocalizationManager localization,
+            ILibraryManager libraryManager,
+            IFileSystem fileSystem)
         {
-            _config = config;
             _logger = logger;
             _localization = localization;
             _libraryManager = libraryManager;
@@ -127,9 +127,22 @@ namespace MediaBrowser.Providers.TV
             bool isVirtualItem,
             CancellationToken cancellationToken)
         {
-            var seasonName = seasonNumber == 0 ?
-                _libraryManager.GetLibraryOptions(series).SeasonZeroDisplayName :
-                (seasonNumber.HasValue ? string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.Value.ToString(_usCulture)) : _localization.GetLocalizedString("NameSeasonUnknown"));
+            string seasonName;
+            if (seasonNumber == null)
+            {
+                seasonName = _localization.GetLocalizedString("NameSeasonUnknown");
+            }
+            else if (seasonNumber == 0)
+            {
+                seasonName = _libraryManager.GetLibraryOptions(series).SeasonZeroDisplayName;
+            }
+            else
+            {
+                seasonName = string.Format(
+                    CultureInfo.InvariantCulture,
+                    _localization.GetLocalizedString("NameSeasonNumber"),
+                    seasonNumber.Value);
+            }
 
             _logger.LogInformation("Creating Season {0} entry for {1}", seasonName, series.Name);
 
@@ -137,7 +150,9 @@ namespace MediaBrowser.Providers.TV
             {
                 Name = seasonName,
                 IndexNumber = seasonNumber,
-                Id = _libraryManager.GetNewItemId((series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName), typeof(Season)),
+                Id = _libraryManager.GetNewItemId(
+                    series.Id + (seasonNumber ?? -1).ToString(CultureInfo.InvariantCulture) + seasonName,
+                    typeof(Season)),
                 IsVirtualItem = isVirtualItem,
                 SeriesId = series.Id,
                 SeriesName = series.Name
@@ -147,7 +162,7 @@ namespace MediaBrowser.Providers.TV
 
             series.AddChild(season, cancellationToken);
 
-            await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false);
+            await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
 
             return season;
         }

+ 12 - 4
MediaBrowser.Providers/TV/EpisodeMetadataService.cs

@@ -12,6 +12,17 @@ namespace MediaBrowser.Providers.TV
 {
     public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
     {
+        public EpisodeMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         protected override ItemUpdateType BeforeSaveInternal(Episode item, bool isFullRefresh, ItemUpdateType currentUpdateType)
         {
             var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@@ -54,6 +65,7 @@ namespace MediaBrowser.Providers.TV
             return updateType;
         }
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Episode> source, MetadataResult<Episode> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -81,9 +93,5 @@ namespace MediaBrowser.Providers.TV
                 targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd;
             }
         }
-
-        public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
 }

+ 14 - 16
MediaBrowser.Providers/TV/MissingEpisodeProvider.cs

@@ -19,6 +19,8 @@ namespace MediaBrowser.Providers.TV
 {
     public class MissingEpisodeProvider
     {
+        private const double UnairedEpisodeThresholdDays = 2;
+
         private readonly IServerConfigurationManager _config;
         private readonly ILogger _logger;
         private readonly ILibraryManager _libraryManager;
@@ -26,9 +28,6 @@ namespace MediaBrowser.Providers.TV
         private readonly IFileSystem _fileSystem;
         private readonly TvDbClientManager _tvDbClientManager;
 
-        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-        private const double UnairedEpisodeThresholdDays = 2;
-
         public MissingEpisodeProvider(
             ILogger logger,
             IServerConfigurationManager config,
@@ -61,7 +60,7 @@ namespace MediaBrowser.Providers.TV
                     DateTime.TryParse(i.FirstAired, out var firstAired);
                     var seasonNumber = i.AiredSeason.GetValueOrDefault(-1);
                     var episodeNumber = i.AiredEpisodeNumber.GetValueOrDefault(-1);
-                    return (seasonNumber: seasonNumber, episodeNumber: episodeNumber, firstAired: firstAired);
+                    return (seasonNumber, episodeNumber, firstAired);
                 })
                 .Where(i => i.seasonNumber != -1 && i.episodeNumber != -1)
                 .OrderBy(i => i.seasonNumber)
@@ -247,8 +246,9 @@ namespace MediaBrowser.Providers.TV
         /// </summary>
         /// <param name="allRecursiveChildren"></param>
         /// <param name="episodeLookup">The episode lookup.</param>
-        /// <returns>Task{System.Boolean}.</returns>
-        private bool RemoveObsoleteOrMissingSeasons(IList<BaseItem> allRecursiveChildren,
+        /// <returns><see cref="bool" />.</returns>
+        private bool RemoveObsoleteOrMissingSeasons(
+            IList<BaseItem> allRecursiveChildren,
             IEnumerable<(int seasonNumber, int episodeNumber, DateTime firstAired)> episodeLookup)
         {
             var existingSeasons = allRecursiveChildren.OfType<Season>().ToList();
@@ -298,7 +298,6 @@ namespace MediaBrowser.Providers.TV
                 _libraryManager.DeleteItem(seasonToRemove, new DeleteOptions
                 {
                     DeleteFileLocation = true
-
                 }, false);
 
                 hasChanges = true;
@@ -322,18 +321,20 @@ namespace MediaBrowser.Providers.TV
 
             if (season == null)
             {
-                var provider = new DummySeasonProvider(_config, _logger, _localization, _libraryManager, _fileSystem);
+                var provider = new DummySeasonProvider(_logger, _localization, _libraryManager, _fileSystem);
                 season = await provider.AddSeason(series, seasonNumber, true, cancellationToken).ConfigureAwait(false);
             }
 
-            var name = $"Episode {episodeNumber.ToString(_usCulture)}";
+            var name = "Episode " + episodeNumber.ToString(CultureInfo.InvariantCulture);
 
             var episode = new Episode
             {
                 Name = name,
                 IndexNumber = episodeNumber,
                 ParentIndexNumber = seasonNumber,
-                Id = _libraryManager.GetNewItemId(series.Id + seasonNumber.ToString(_usCulture) + name, typeof(Episode)),
+                Id = _libraryManager.GetNewItemId(
+                    series.Id + seasonNumber.ToString(CultureInfo.InvariantCulture) + name,
+                    typeof(Episode)),
                 IsVirtualItem = true,
                 SeasonId = season?.Id ?? Guid.Empty,
                 SeriesId = series.Id
@@ -341,7 +342,7 @@ namespace MediaBrowser.Providers.TV
 
             season.AddChild(episode, cancellationToken);
 
-            await episode.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false);
+            await episode.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
         }
 
         /// <summary>
@@ -351,7 +352,7 @@ namespace MediaBrowser.Providers.TV
         /// <param name="seasonCounts"></param>
         /// <param name="episodeTuple"></param>
         /// <returns>Episode.</returns>
-        private Episode GetExistingEpisode(IList<Episode> existingEpisodes, IReadOnlyDictionary<int, int> seasonCounts, (int seasonNumber, int episodeNumber, DateTime firstAired) episodeTuple)
+        private Episode GetExistingEpisode(IEnumerable<Episode> existingEpisodes, IReadOnlyDictionary<int, int> seasonCounts, (int seasonNumber, int episodeNumber, DateTime firstAired) episodeTuple)
         {
             var seasonNumber = episodeTuple.seasonNumber;
             var episodeNumber = episodeTuple.episodeNumber;
@@ -380,9 +381,6 @@ namespace MediaBrowser.Providers.TV
         }
 
         private Episode GetExistingEpisode(IEnumerable<Episode> existingEpisodes, int season, int episode)
-        {
-            return existingEpisodes
-                .FirstOrDefault(i => i.ParentIndexNumber == season && i.ContainsEpisodeNumber(episode));
-        }
+            => existingEpisodes.FirstOrDefault(i => i.ParentIndexNumber == season && i.ContainsEpisodeNumber(episode));
     }
 }

+ 16 - 7
MediaBrowser.Providers/TV/SeasonMetadataService.cs

@@ -15,6 +15,17 @@ namespace MediaBrowser.Providers.TV
 {
     public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
     {
+        public SeasonMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         protected override ItemUpdateType BeforeSaveInternal(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType)
         {
             var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@@ -54,13 +65,14 @@ namespace MediaBrowser.Providers.TV
             return updateType;
         }
 
+        /// <inheritdoc />
         protected override bool EnableUpdatingPremiereDateFromChildren => true;
 
+        /// <inheritdoc />
         protected override IList<BaseItem> GetChildrenForMetadataUpdates(Season item)
-        {
-            return item.GetEpisodes();
-        }
+            => item.GetEpisodes();
 
+        /// <inheritdoc />
         protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
         {
             var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
@@ -73,6 +85,7 @@ namespace MediaBrowser.Providers.TV
             return updateType;
         }
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Season> source, MetadataResult<Season> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@@ -90,9 +103,5 @@ namespace MediaBrowser.Providers.TV
 
             return ItemUpdateType.None;
         }
-
-        public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
 }

+ 6 - 5
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -24,22 +24,21 @@ namespace MediaBrowser.Providers.TV
             ILogger logger,
             IProviderManager providerManager,
             IFileSystem fileSystem,
-            IUserDataManager userDataManager,
             ILibraryManager libraryManager,
             ILocalizationManager localization,
-            TvDbClientManager tvDbClientManager
-            )
-            : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+            TvDbClientManager tvDbClientManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
             _localization = localization;
             _tvDbClientManager = tvDbClientManager;
         }
 
+        /// <inheritdoc />
         protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
         {
             await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false);
 
-            var seasonProvider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, LibraryManager, FileSystem);
+            var seasonProvider = new DummySeasonProvider(Logger, _localization, LibraryManager, FileSystem);
             await seasonProvider.Run(item, cancellationToken).ConfigureAwait(false);
 
             // TODO why does it not register this itself omg
@@ -60,6 +59,7 @@ namespace MediaBrowser.Providers.TV
             }
         }
 
+        /// <inheritdoc />
         protected override bool IsFullLocalMetadata(Series item)
         {
             if (string.IsNullOrWhiteSpace(item.Overview))
@@ -73,6 +73,7 @@ namespace MediaBrowser.Providers.TV
             return base.IsFullLocalMetadata(item);
         }
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Series> source, MetadataResult<Series> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);

+ 21 - 16
MediaBrowser.Providers/TV/TvExternalIds.cs

@@ -7,57 +7,62 @@ namespace MediaBrowser.Providers.TV
 {
     public class Zap2ItExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "Zap2It";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Zap2It.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => "http://tvlistings.zap2it.com/overview.html?programSeriesId={0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Series;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Series;
     }
 
     public class TvdbExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheTVDB";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Tvdb.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=series&id={0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Series;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Series;
+
     }
 
     public class TvdbSeasonExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheTVDB";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Tvdb.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => null;
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Season;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Season;
     }
 
     public class TvdbEpisodeExternalId : IExternalId
     {
+        /// <inheritdoc />
         public string Name => "TheTVDB";
 
+        /// <inheritdoc />
         public string Key => MetadataProviders.Tvdb.ToString();
 
+        /// <inheritdoc />
         public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=episode&id={0}";
 
-        public bool Supports(IHasProviderIds item)
-        {
-            return item is Episode;
-        }
+        /// <inheritdoc />
+        public bool Supports(IHasProviderIds item) => item is Episode;
     }
 }

+ 10 - 3
MediaBrowser.Providers/Users/UserMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Users
 {
     public class UserMetadataService : MetadataService<User, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public UserMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }

+ 12 - 4
MediaBrowser.Providers/Videos/VideoMetadataService.cs

@@ -11,16 +11,24 @@ namespace MediaBrowser.Providers.Videos
 {
     public class VideoMetadataService : MetadataService<Video, ItemLookupInfo>
     {
+        public VideoMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
+        {
+        }
+
+        /// <inheritdoc />
         // Make sure the type-specific services get picked first
         public override int Order => 10;
 
+        /// <inheritdoc />
         protected override void MergeData(MetadataResult<Video> source, MetadataResult<Video> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
             ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
-
-        public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
-        {
-        }
     }
 }

+ 10 - 3
MediaBrowser.Providers/Years/YearMetadataService.cs

@@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Years
 {
     public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
     {
-        protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
+        public YearMetadataService(
+            IServerConfigurationManager serverConfigurationManager,
+            ILogger logger,
+            IProviderManager providerManager,
+            IFileSystem fileSystem,
+            ILibraryManager libraryManager)
+            : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
         {
-            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
 
-        public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
+        /// <inheritdoc />
+        protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
         {
+            ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
         }
     }
 }