Răsfoiți Sursa

Merge pull request #4103 from Bond-009/warn30

Fix some warnings
Anthony Lavado 4 ani în urmă
părinte
comite
226316a486
21 a modificat fișierele cu 146 adăugiri și 121 ștergeri
  1. 1 1
      MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs
  2. 1 1
      MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Trailers.cs
  3. 1 1
      MediaBrowser.Providers/Plugins/Tmdb/Models/People/PersonImages.cs
  4. 3 2
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbImageProvider.cs
  5. 3 8
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbImageSettings.cs
  6. 15 13
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs
  7. 6 1
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSearch.cs
  8. 9 0
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSettingsResult.cs
  9. 2 2
      MediaBrowser.Providers/Plugins/Tmdb/Music/TmdbMusicVideoProvider.cs
  10. 4 7
      MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonProvider.cs
  11. 14 9
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs
  12. 8 7
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProvider.cs
  13. 9 4
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProviderBase.cs
  14. 16 7
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonProvider.cs
  15. 11 17
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs
  16. 16 21
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs
  17. 4 4
      MediaBrowser.Providers/Plugins/Tmdb/Trailers/TmdbTrailerProvider.cs
  18. 8 8
      MediaBrowser.Providers/Studios/StudiosImageProvider.cs
  19. 1 1
      MediaBrowser.Providers/Subtitles/SubtitleManager.cs
  20. 11 4
      MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
  21. 3 3
      MediaBrowser.Providers/TV/SeasonMetadataService.cs

+ 1 - 1
MediaBrowser.Providers/Plugins/Tmdb/Models/General/Videos.cs

@@ -6,6 +6,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Models.General
 {
     public class Videos
     {
-        public List<Video> Results { get; set; }
+        public IReadOnlyList<Video> Results { get; set; }
     }
 }

+ 1 - 1
MediaBrowser.Providers/Plugins/Tmdb/Models/Movies/Trailers.cs

@@ -6,6 +6,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Models.Movies
 {
     public class Trailers
     {
-        public List<Youtube> Youtube { get; set; }
+        public IReadOnlyList<Youtube> Youtube { get; set; }
     }
 }

+ 1 - 1
MediaBrowser.Providers/Plugins/Tmdb/Models/People/PersonImages.cs

@@ -7,6 +7,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Models.People
 {
     public class PersonImages
     {
-        public List<Profile> Profiles { get; set; }
+        public IReadOnlyList<Profile> Profiles { get; set; }
     }
 }

+ 3 - 2
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbImageProvider.cs

@@ -38,6 +38,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
 
         public static string ProviderName => TmdbUtils.ProviderName;
 
+        /// <inheritdoc />
+        public int Order => 0;
+
         public bool Supports(BaseItem item)
         {
             return item is Movie || item is MusicVideo || item is Trailer;
@@ -201,8 +204,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
             return null;
         }
 
-        public int Order => 0;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);

+ 3 - 8
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSettings.cs → MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbImageSettings.cs

@@ -6,22 +6,17 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
 {
     internal class TmdbImageSettings
     {
-        public List<string> backdrop_sizes { get; set; }
+        public IReadOnlyList<string> backdrop_sizes { get; set; }
 
         public string secure_base_url { get; set; }
 
-        public List<string> poster_sizes { get; set; }
+        public IReadOnlyList<string> poster_sizes { get; set; }
 
-        public List<string> profile_sizes { get; set; }
+        public IReadOnlyList<string> profile_sizes { get; set; }
 
         public string GetImageUrl(string image)
         {
             return secure_base_url + image;
         }
     }
-
-    internal class TmdbSettingsResult
-    {
-        public TmdbImageSettings images { get; set; }
-    }
 }

+ 15 - 13
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs

@@ -34,7 +34,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
         private const string TmdbConfigUrl = TmdbUtils.BaseTmdbApiUrl + "3/configuration?api_key={0}";
         private const string GetMovieInfo3 = TmdbUtils.BaseTmdbApiUrl + @"3/movie/{0}?api_key={1}&append_to_response=casts,releases,images,keywords,trailers";
 
-        internal static TmdbMovieProvider Current { get; private set; }
+        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IHttpClientFactory _httpClientFactory;
@@ -44,7 +44,10 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
         private readonly ILibraryManager _libraryManager;
         private readonly IApplicationHost _appHost;
 
-        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+        /// <summary>
+        /// The _TMDB settings task.
+        /// </summary>
+        private TmdbSettingsResult _tmdbSettings;
 
         public TmdbMovieProvider(
             IJsonSerializer jsonSerializer,
@@ -65,6 +68,14 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
             Current = this;
         }
 
+        internal static TmdbMovieProvider Current { get; private set; }
+
+        /// <inheritdoc />
+        public string Name => TmdbUtils.ProviderName;
+
+        /// <inheritdoc />
+        public int Order => 1;
+
         public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
         {
             return GetMovieSearchResults(searchInfo, cancellationToken);
@@ -131,13 +142,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
             return movieDb.GetMetadata(id, cancellationToken);
         }
 
-        public string Name => TmdbUtils.ProviderName;
-
-        /// <summary>
-        /// The _TMDB settings task.
-        /// </summary>
-        private TmdbSettingsResult _tmdbSettings;
-
         /// <summary>
         /// Gets the TMDB settings.
         /// </summary>
@@ -272,7 +276,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
                 languages.Add("en");
             }
 
-            return string.Join(",", languages);
+            return string.Join(',', languages);
         }
 
         public static string NormalizeLanguage(string language)
@@ -381,15 +385,13 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
         /// <summary>
         /// Gets the movie db response.
         /// </summary>
+        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
         internal Task<HttpResponseMessage> GetMovieDbResponse(HttpRequestMessage message, CancellationToken cancellationToken = default)
         {
             message.Headers.UserAgent.ParseAdd(_appHost.ApplicationUserAgent);
             return _httpClientFactory.CreateClient(NamedClient.Default).SendAsync(message, cancellationToken);
         }
 
-        /// <inheritdoc />
-        public int Order => 1;
-
         /// <inheritdoc />
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {

+ 6 - 1
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSearch.cs

@@ -207,7 +207,12 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
             return results
                 .Select(i =>
                 {
-                    var remoteResult = new RemoteSearchResult {SearchProviderName = TmdbMovieProvider.Current.Name, Name = i.Title ?? i.Name ?? i.Original_Title, ImageUrl = string.IsNullOrWhiteSpace(i.Poster_Path) ? null : baseImageUrl + i.Poster_Path};
+                    var remoteResult = new RemoteSearchResult
+                    {
+                        SearchProviderName = TmdbMovieProvider.Current.Name,
+                        Name = i.Title ?? i.Name ?? i.Original_Title,
+                        ImageUrl = string.IsNullOrWhiteSpace(i.Poster_Path) ? null : baseImageUrl + i.Poster_Path
+                    };
 
                     if (!string.IsNullOrWhiteSpace(i.Release_Date))
                     {

+ 9 - 0
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbSettingsResult.cs

@@ -0,0 +1,9 @@
+#pragma warning disable CS1591
+
+namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
+{
+    internal class TmdbSettingsResult
+    {
+        public TmdbImageSettings images { get; set; }
+    }
+}

+ 2 - 2
MediaBrowser.Providers/Plugins/Tmdb/Music/TmdbMusicVideoProvider.cs

@@ -14,6 +14,8 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Music
 {
     public class TmdbMusicVideoProvider : IRemoteMetadataProvider<MusicVideo, MusicVideoInfo>
     {
+        public string Name => TmdbMovieProvider.Current.Name;
+
         public Task<MetadataResult<MusicVideo>> GetMetadata(MusicVideoInfo info, CancellationToken cancellationToken)
         {
             return TmdbMovieProvider.Current.GetItemMetadata<MusicVideo>(info, cancellationToken);
@@ -24,8 +26,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Music
             return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
         }
 
-        public string Name => TmdbMovieProvider.Current.Name;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             throw new NotImplementedException();

+ 4 - 7
MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonProvider.cs

@@ -31,7 +31,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
 {
     public class TmdbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>
     {
-        const string DataFileName = "info.json";
+        private const string DataFileName = "info.json";
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
@@ -39,20 +39,17 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
         private readonly IFileSystem _fileSystem;
         private readonly IServerConfigurationManager _configurationManager;
         private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TmdbPersonProvider> _logger;
 
         public TmdbPersonProvider(
             IFileSystem fileSystem,
             IServerConfigurationManager configurationManager,
             IJsonSerializer jsonSerializer,
-            IHttpClientFactory httpClientFactory,
-            ILogger<TmdbPersonProvider> logger)
+            IHttpClientFactory httpClientFactory)
         {
             _fileSystem = fileSystem;
             _configurationManager = configurationManager;
             _jsonSerializer = jsonSerializer;
             _httpClientFactory = httpClientFactory;
-            _logger = logger;
             Current = this;
         }
 
@@ -75,7 +72,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
                 var dataFilePath = GetPersonDataFilePath(_configurationManager.ApplicationPaths, tmdbId);
                 var info = _jsonSerializer.DeserializeFromFile<PersonResult>(dataFilePath);
 
-                var images = (info.Images ?? new PersonImages()).Profiles ?? new List<Profile>();
+                IReadOnlyList<Profile> images = info.Images?.Profiles ?? Array.Empty<Profile>();
 
                 var result = new RemoteSearchResult
                 {
@@ -95,7 +92,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
             if (searchInfo.IsAutomated)
             {
                 // Don't hammer moviedb searching by name
-                return new List<RemoteSearchResult>();
+                return Array.Empty<RemoteSearchResult>();
             }
 
             var url = string.Format(

+ 14 - 9
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs

@@ -28,7 +28,13 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
     {
         public TmdbEpisodeImageProvider(IHttpClientFactory httpClientFactory, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IFileSystem fileSystem, ILocalizationManager localization, ILoggerFactory loggerFactory)
             : base(httpClientFactory, configurationManager, jsonSerializer, fileSystem, localization, loggerFactory)
-        { }
+        {
+        }
+
+        public string Name => TmdbUtils.ProviderName;
+
+        // After TheTvDb
+        public int Order => 1;
 
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
@@ -43,7 +49,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             var episode = (Controller.Entities.TV.Episode)item;
             var series = episode.Series;
 
-            var seriesId = series != null ? series.GetProviderId(MetadataProvider.Tmdb) : null;
+            var seriesId = series?.GetProviderId(MetadataProvider.Tmdb);
 
             var list = new List<RemoteImageInfo>();
 
@@ -62,8 +68,12 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             var language = item.GetPreferredMetadataLanguage();
 
-            var response = await GetEpisodeInfo(seriesId, seasonNumber.Value, episodeNumber.Value,
-                        language, cancellationToken).ConfigureAwait(false);
+            var response = await GetEpisodeInfo(
+                seriesId,
+                seasonNumber.Value,
+                episodeNumber.Value,
+                language,
+                cancellationToken).ConfigureAwait(false);
 
             var tmdbSettings = await TmdbMovieProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
 
@@ -120,14 +130,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             return GetResponse(url, cancellationToken);
         }
 
-        public string Name => TmdbUtils.ProviderName;
-
         public bool Supports(BaseItem item)
         {
             return item is Controller.Entities.TV.Episode;
         }
-
-        // After TheTvDb
-        public int Order => 1;
     }
 }

+ 8 - 7
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProvider.cs

@@ -29,7 +29,13 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
     {
         public TmdbEpisodeProvider(IHttpClientFactory httpClientFactory, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IFileSystem fileSystem, ILocalizationManager localization, ILoggerFactory loggerFactory)
             : base(httpClientFactory, configurationManager, jsonSerializer, fileSystem, localization, loggerFactory)
-        { }
+        {
+        }
+
+        // After TheTvDb
+        public int Order => 1;
+
+        public string Name => TmdbUtils.ProviderName;
 
         public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
         {
@@ -41,7 +47,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
                 return list;
             }
 
-            var metadataResult = await GetMetadata(searchInfo, cancellationToken);
+            var metadataResult = await GetMetadata(searchInfo, cancellationToken).ConfigureAwait(false);
 
             if (metadataResult.HasMetadata)
             {
@@ -205,10 +211,5 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
         {
             return GetResponse(url, cancellationToken);
         }
-
-        // After TheTvDb
-        public int Order => 1;
-
-        public string Name => TmdbUtils.ProviderName;
     }
 }

+ 9 - 4
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeProviderBase.cs

@@ -21,11 +21,11 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
     public abstract class TmdbEpisodeProviderBase
     {
         private const string EpisodeUrlPattern = TmdbUtils.BaseTmdbApiUrl + @"3/tv/{0}/season/{1}/episode/{2}?api_key={3}&append_to_response=images,external_ids,credits,videos";
+
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly IServerConfigurationManager _configurationManager;
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IFileSystem _fileSystem;
-        private readonly ILocalizationManager _localization;
         private readonly ILogger<TmdbEpisodeProviderBase> _logger;
 
         protected TmdbEpisodeProviderBase(IHttpClientFactory httpClientFactory, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IFileSystem fileSystem, ILocalizationManager localization, ILoggerFactory loggerFactory)
@@ -34,13 +34,16 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             _configurationManager = configurationManager;
             _jsonSerializer = jsonSerializer;
             _fileSystem = fileSystem;
-            _localization = localization;
             _logger = loggerFactory.CreateLogger<TmdbEpisodeProviderBase>();
         }
 
         protected ILogger Logger => _logger;
 
-        protected async Task<EpisodeResult> GetEpisodeInfo(string seriesTmdbId, int season, int episodeNumber, string preferredMetadataLanguage,
+        protected async Task<EpisodeResult> GetEpisodeInfo(
+            string seriesTmdbId,
+            int season,
+            int episodeNumber,
+            string preferredMetadataLanguage,
             CancellationToken cancellationToken)
         {
             await EnsureEpisodeInfo(seriesTmdbId, season, episodeNumber, preferredMetadataLanguage, cancellationToken)
@@ -93,7 +96,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             var path = TmdbSeriesProvider.GetSeriesDataPath(_configurationManager.ApplicationPaths, tmdbId);
 
-            var filename = string.Format(CultureInfo.InvariantCulture, "season-{0}-episode-{1}-{2}.json",
+            var filename = string.Format(
+                CultureInfo.InvariantCulture,
+                "season-{0}-episode-{1}-{2}.json",
                 seasonNumber.ToString(CultureInfo.InvariantCulture),
                 episodeNumber.ToString(CultureInfo.InvariantCulture),
                 preferredLanguage);

+ 16 - 7
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonProvider.cs

@@ -28,26 +28,32 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
     public class TmdbSeasonProvider : IRemoteMetadataProvider<Season, SeasonInfo>
     {
         private const string GetTvInfo3 = TmdbUtils.BaseTmdbApiUrl + @"3/tv/{0}/season/{1}?api_key={2}&append_to_response=images,keywords,external_ids,credits,videos";
+
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly IServerConfigurationManager _configurationManager;
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IFileSystem _fileSystem;
-        private readonly ILocalizationManager _localization;
         private readonly ILogger<TmdbSeasonProvider> _logger;
 
         internal static TmdbSeasonProvider Current { get; private set; }
 
-        public TmdbSeasonProvider(IHttpClientFactory httpClientFactory, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILocalizationManager localization, IJsonSerializer jsonSerializer, ILogger<TmdbSeasonProvider> logger)
+        public TmdbSeasonProvider(
+            IHttpClientFactory httpClientFactory,
+            IServerConfigurationManager configurationManager,
+            IFileSystem fileSystem,
+            IJsonSerializer jsonSerializer,
+            ILogger<TmdbSeasonProvider> logger)
         {
             _httpClientFactory = httpClientFactory;
             _configurationManager = configurationManager;
             _fileSystem = fileSystem;
-            _localization = localization;
             _jsonSerializer = jsonSerializer;
             _logger = logger;
             Current = this;
         }
 
+        public string Name => TmdbUtils.ProviderName;
+
         public async Task<MetadataResult<Season>> GetMetadata(SeasonInfo info, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<Season>();
@@ -116,8 +122,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             return result;
         }
 
-        public string Name => TmdbUtils.ProviderName;
-
         public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeasonInfo searchInfo, CancellationToken cancellationToken)
         {
             return Task.FromResult<IEnumerable<RemoteSearchResult>>(new List<RemoteSearchResult>());
@@ -128,7 +132,10 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
         }
 
-        private async Task<SeasonResult> GetSeasonInfo(string seriesTmdbId, int season, string preferredMetadataLanguage,
+        private async Task<SeasonResult> GetSeasonInfo(
+            string seriesTmdbId,
+            int season,
+            string preferredMetadataLanguage,
             CancellationToken cancellationToken)
         {
             await EnsureSeasonInfo(seriesTmdbId, season, preferredMetadataLanguage, cancellationToken)
@@ -181,7 +188,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             var path = TmdbSeriesProvider.GetSeriesDataPath(_configurationManager.ApplicationPaths, tmdbId);
 
-            var filename = string.Format(CultureInfo.InvariantCulture, "season-{0}-{1}.json",
+            var filename = string.Format(
+                CultureInfo.InvariantCulture,
+                "season-{0}-{1}.json",
                 seasonNumber.ToString(CultureInfo.InvariantCulture),
                 preferredLanguage);
 

+ 11 - 17
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs

@@ -2,6 +2,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Threading;
@@ -12,7 +13,6 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Providers;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Providers.Plugins.Tmdb.Models.General;
@@ -25,19 +25,20 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
     {
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IHttpClientFactory _httpClientFactory;
-        private readonly IFileSystem _fileSystem;
 
-        public TmdbSeriesImageProvider(IJsonSerializer jsonSerializer, IHttpClientFactory httpClientFactory, IFileSystem fileSystem)
+        public TmdbSeriesImageProvider(IJsonSerializer jsonSerializer, IHttpClientFactory httpClientFactory)
         {
             _jsonSerializer = jsonSerializer;
             _httpClientFactory = httpClientFactory;
-            _fileSystem = fileSystem;
         }
 
         public string Name => ProviderName;
 
         public static string ProviderName => TmdbUtils.ProviderName;
 
+        // After tvdb and fanart
+        public int Order => 2;
+
         public bool Supports(BaseItem item)
         {
             return item is Series;
@@ -56,7 +57,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
         {
             var list = new List<RemoteImageInfo>();
 
-            var results = await FetchImages(item, null, _jsonSerializer, cancellationToken).ConfigureAwait(false);
+            var results = await FetchImages(item, null, cancellationToken).ConfigureAwait(false);
 
             if (results == null)
             {
@@ -148,10 +149,11 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="language">The language.</param>
-        /// <param name="jsonSerializer">The json serializer.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{MovieImages}.</returns>
-        private async Task<Images> FetchImages(BaseItem item, string language, IJsonSerializer jsonSerializer,
+        private async Task<Images> FetchImages(
+            BaseItem item,
+            string language,
             CancellationToken cancellationToken)
         {
             var tmdbId = item.GetProviderId(MetadataProvider.Tmdb);
@@ -165,22 +167,14 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             var path = TmdbSeriesProvider.Current.GetDataFilePath(tmdbId, language);
 
-            if (!string.IsNullOrEmpty(path))
+            if (!string.IsNullOrEmpty(path) && File.Exists(path))
             {
-                var fileInfo = _fileSystem.GetFileInfo(path);
-
-                if (fileInfo.Exists)
-                {
-                    return jsonSerializer.DeserializeFromFile<SeriesResult>(path).Images;
-                }
+                return _jsonSerializer.DeserializeFromFile<SeriesResult>(path).Images;
             }
 
             return null;
         }
 
-        // After tvdb and fanart
-        public int Order => 2;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);

+ 16 - 21
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs

@@ -17,8 +17,6 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Globalization;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Providers;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Providers.Plugins.Tmdb.Models.Search;
@@ -33,38 +31,35 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
         private const string GetTvInfo3 = TmdbUtils.BaseTmdbApiUrl + @"3/tv/{0}?api_key={1}&append_to_response=credits,images,keywords,external_ids,videos,content_ratings";
 
         private readonly IJsonSerializer _jsonSerializer;
-        private readonly IFileSystem _fileSystem;
         private readonly IServerConfigurationManager _configurationManager;
         private readonly ILogger<TmdbSeriesProvider> _logger;
-        private readonly ILocalizationManager _localization;
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly ILibraryManager _libraryManager;
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
-        internal static TmdbSeriesProvider Current { get; private set; }
-
         public TmdbSeriesProvider(
             IJsonSerializer jsonSerializer,
-            IFileSystem fileSystem,
             IServerConfigurationManager configurationManager,
             ILogger<TmdbSeriesProvider> logger,
-            ILocalizationManager localization,
             IHttpClientFactory httpClientFactory,
             ILibraryManager libraryManager)
         {
             _jsonSerializer = jsonSerializer;
-            _fileSystem = fileSystem;
             _configurationManager = configurationManager;
             _logger = logger;
-            _localization = localization;
             _httpClientFactory = httpClientFactory;
             _libraryManager = libraryManager;
             Current = this;
         }
 
+        internal static TmdbSeriesProvider Current { get; private set; }
+
         public string Name => TmdbUtils.ProviderName;
 
+        // After TheTVDB
+        public int Order => 1;
+
         public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
         {
             var tmdbId = searchInfo.GetProviderId(MetadataProvider.Tmdb);
@@ -129,8 +124,10 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
         public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken cancellationToken)
         {
-            var result = new MetadataResult<Series>();
-            result.QueriedById = true;
+            var result = new MetadataResult<Series>
+            {
+                QueriedById = true
+            };
 
             var tmdbId = info.GetProviderId(MetadataProvider.Tmdb);
 
@@ -206,9 +203,11 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             await EnsureSeriesInfo(tmdbId, language, cancellationToken).ConfigureAwait(false);
 
-            var result = new MetadataResult<Series>();
-            result.Item = new Series();
-            result.ResultLanguage = seriesInfo.ResultLanguage;
+            var result = new MetadataResult<Series>
+            {
+                Item = new Series(),
+                ResultLanguage = seriesInfo.ResultLanguage
+            };
 
             var settings = await TmdbMovieProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
 
@@ -474,12 +473,11 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             var path = GetDataFilePath(tmdbId, language);
 
-            var fileInfo = _fileSystem.GetFileSystemInfo(path);
-
+            var fileInfo = new FileInfo(path);
             if (fileInfo.Exists)
             {
                 // If it's recent or automatic updates are enabled, don't re-download
-                if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2)
+                if ((DateTime.UtcNow - fileInfo.LastWriteTimeUtc).TotalDays <= 2)
                 {
                     return Task.CompletedTask;
                 }
@@ -549,9 +547,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             return null;
         }
 
-        // After TheTVDB
-        public int Order => 1;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);

+ 4 - 4
MediaBrowser.Providers/Plugins/Tmdb/Trailers/TmdbTrailerProvider.cs

@@ -21,6 +21,10 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Trailers
             _httpClientFactory = httpClientFactory;
         }
 
+        public string Name => TmdbMovieProvider.Current.Name;
+
+        public int Order => 0;
+
         public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TrailerInfo searchInfo, CancellationToken cancellationToken)
         {
             return TmdbMovieProvider.Current.GetMovieSearchResults(searchInfo, cancellationToken);
@@ -31,10 +35,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Trailers
             return TmdbMovieProvider.Current.GetItemMetadata<Trailer>(info, cancellationToken);
         }
 
-        public string Name => TmdbMovieProvider.Current.Name;
-
-        public int Order => 0;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);

+ 8 - 8
MediaBrowser.Providers/Studios/StudiosImageProvider.cs

@@ -33,6 +33,8 @@ namespace MediaBrowser.Providers.Studios
 
         public string Name => "Emby Designs";
 
+        public int Order => 0;
+
         public bool Supports(BaseItem item)
         {
             return item is Studio;
@@ -119,8 +121,6 @@ namespace MediaBrowser.Providers.Studios
             return EnsureList(url, file, _fileSystem, cancellationToken);
         }
 
-        public int Order => 0;
-
         public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
         {
             var httpClient = _httpClientFactory.CreateClient(NamedClient.Default);
@@ -161,12 +161,12 @@ namespace MediaBrowser.Providers.Studios
 
         private string GetComparableName(string name)
         {
-            return name.Replace(" ", string.Empty)
-                .Replace(".", string.Empty)
-                .Replace("&", string.Empty)
-                .Replace("!", string.Empty)
-                .Replace(",", string.Empty)
-                .Replace("/", string.Empty);
+            return name.Replace(" ", string.Empty, StringComparison.Ordinal)
+                .Replace(".", string.Empty, StringComparison.Ordinal)
+                .Replace("&", string.Empty, StringComparison.Ordinal)
+                .Replace("!", string.Empty, StringComparison.Ordinal)
+                .Replace(",", string.Empty, StringComparison.Ordinal)
+                .Replace("/", string.Empty, StringComparison.Ordinal);
         }
 
         public IEnumerable<string> GetAvailableImages(string file)

+ 1 - 1
MediaBrowser.Providers/Subtitles/SubtitleManager.cs

@@ -303,7 +303,7 @@ namespace MediaBrowser.Providers.Subtitles
 
         private ISubtitleProvider GetProvider(string id)
         {
-            return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name)));
+            return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name), StringComparison.Ordinal));
         }
 
         /// <inheritdoc />

+ 11 - 4
MediaBrowser.Providers/TV/MissingEpisodeProvider.cs

@@ -48,18 +48,25 @@ namespace MediaBrowser.Providers.TV
 
         public async Task<bool> Run(Series series, bool addNewItems, CancellationToken cancellationToken)
         {
-            var tvdbId = series.GetProviderId(MetadataProvider.Tvdb);
-            if (string.IsNullOrEmpty(tvdbId))
+            var tvdbIdString = series.GetProviderId(MetadataProvider.Tvdb);
+            if (string.IsNullOrEmpty(tvdbIdString))
             {
                 return false;
             }
 
-            var episodes = await _tvdbClientManager.GetAllEpisodesAsync(Convert.ToInt32(tvdbId), series.GetPreferredMetadataLanguage(), cancellationToken);
+            var episodes = await _tvdbClientManager.GetAllEpisodesAsync(
+                int.Parse(tvdbIdString, CultureInfo.InvariantCulture),
+                series.GetPreferredMetadataLanguage(),
+                cancellationToken).ConfigureAwait(false);
 
             var episodeLookup = episodes
                 .Select(i =>
                 {
-                    DateTime.TryParse(i.FirstAired, out var firstAired);
+                    if (!DateTime.TryParse(i.FirstAired, out var firstAired))
+                    {
+                        firstAired = default;
+                    }
+
                     var seasonNumber = i.AiredSeason.GetValueOrDefault(-1);
                     var episodeNumber = i.AiredEpisodeNumber.GetValueOrDefault(-1);
                     return (seasonNumber, episodeNumber, firstAired);

+ 3 - 3
MediaBrowser.Providers/TV/SeasonMetadataService.cs

@@ -27,6 +27,9 @@ namespace MediaBrowser.Providers.TV
         {
         }
 
+        /// <inheritdoc />
+        protected override bool EnableUpdatingPremiereDateFromChildren => true;
+
         /// <inheritdoc />
         protected override ItemUpdateType BeforeSaveInternal(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType)
         {
@@ -67,9 +70,6 @@ namespace MediaBrowser.Providers.TV
             return updateType;
         }
 
-        /// <inheritdoc />
-        protected override bool EnableUpdatingPremiereDateFromChildren => true;
-
         /// <inheritdoc />
         protected override IList<BaseItem> GetChildrenForMetadataUpdates(Season item)
             => item.GetEpisodes();