Преглед на файлове

Merge pull request #4298 from crobibero/bye-tvdb

Remove TheTVDB plugin from server source.
Joshua M. Boniface преди 4 години
родител
ревизия
b5ff91c281

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

@@ -94,7 +94,6 @@ using MediaBrowser.Model.System;
 using MediaBrowser.Model.Tasks;
 using MediaBrowser.Providers.Chapters;
 using MediaBrowser.Providers.Manager;
-using MediaBrowser.Providers.Plugins.TheTvdb;
 using MediaBrowser.Providers.Plugins.Tmdb;
 using MediaBrowser.Providers.Subtitles;
 using MediaBrowser.XbmcMetadata.Providers;
@@ -520,7 +519,6 @@ namespace Emby.Server.Implementations
             ServiceCollection.AddSingleton<IJsonSerializer, JsonSerializer>();
 
             ServiceCollection.AddSingleton(_fileSystemManager);
-            ServiceCollection.AddSingleton<TvdbClientManager>();
             ServiceCollection.AddSingleton<TmdbClientManager>();
 
             ServiceCollection.AddSingleton(_networkManager);

+ 0 - 10
MediaBrowser.Providers/Plugins/TheTvdb/Configuration/PluginConfiguration.cs

@@ -1,10 +0,0 @@
-#pragma warning disable CS1591
-
-using MediaBrowser.Model.Plugins;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class PluginConfiguration : BasePluginConfiguration
-    {
-    }
-}

+ 0 - 29
MediaBrowser.Providers/Plugins/TheTvdb/Plugin.cs

@@ -1,29 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Plugins;
-using MediaBrowser.Model.Serialization;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class Plugin : BasePlugin<PluginConfiguration>
-    {
-        public static Plugin Instance { get; private set; }
-
-        public override Guid Id => new Guid("a677c0da-fac5-4cde-941a-7134223f14c8");
-
-        public override string Name => "TheTVDB";
-
-        public override string Description => "Get metadata for movies and other video content from TheTVDB.";
-
-        // TODO remove when plugin removed from server.
-        public override string ConfigurationFileName => "Jellyfin.Plugin.TheTvdb.xml";
-
-        public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
-            : base(applicationPaths, xmlSerializer)
-        {
-            Instance = this;
-        }
-    }
-}

+ 0 - 289
MediaBrowser.Providers/Plugins/TheTvdb/TvdbClientManager.cs

@@ -1,289 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using Microsoft.Extensions.Caching.Memory;
-using TvDbSharper;
-using TvDbSharper.Dto;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbClientManager
-    {
-        private const string DefaultLanguage = "en";
-
-        private readonly IMemoryCache _cache;
-        private readonly TvDbClient _tvDbClient;
-        private DateTime _tokenCreatedAt;
-
-        public TvdbClientManager(IMemoryCache memoryCache)
-        {
-            _cache = memoryCache;
-            _tvDbClient = new TvDbClient();
-        }
-
-        private TvDbClient TvDbClient
-        {
-            get
-            {
-                if (string.IsNullOrEmpty(_tvDbClient.Authentication.Token))
-                {
-                    _tvDbClient.Authentication.AuthenticateAsync(TvdbUtils.TvdbApiKey).GetAwaiter().GetResult();
-                    _tokenCreatedAt = DateTime.Now;
-                }
-
-                // Refresh if necessary
-                if (_tokenCreatedAt < DateTime.Now.Subtract(TimeSpan.FromHours(20)))
-                {
-                    try
-                    {
-                        _tvDbClient.Authentication.RefreshTokenAsync().GetAwaiter().GetResult();
-                    }
-                    catch
-                    {
-                        _tvDbClient.Authentication.AuthenticateAsync(TvdbUtils.TvdbApiKey).GetAwaiter().GetResult();
-                    }
-
-                    _tokenCreatedAt = DateTime.Now;
-                }
-
-                return _tvDbClient;
-            }
-        }
-
-        public Task<TvDbResponse<SeriesSearchResult[]>> GetSeriesByNameAsync(string name, string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("series", name, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Search.SearchSeriesByNameAsync(name, cancellationToken));
-        }
-
-        public Task<TvDbResponse<Series>> GetSeriesByIdAsync(int tvdbId, string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("series", tvdbId, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Series.GetAsync(tvdbId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<EpisodeRecord>> GetEpisodesAsync(int episodeTvdbId, string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("episode", episodeTvdbId, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Episodes.GetAsync(episodeTvdbId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<SeriesSearchResult[]>> GetSeriesByImdbIdAsync(
-            string imdbId,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("series", imdbId, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Search.SearchSeriesByImdbIdAsync(imdbId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<SeriesSearchResult[]>> GetSeriesByZap2ItIdAsync(
-            string zap2ItId,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("series", zap2ItId, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Search.SearchSeriesByZap2ItIdAsync(zap2ItId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<Actor[]>> GetActorsAsync(
-            int tvdbId,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("actors", tvdbId, language);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Series.GetActorsAsync(tvdbId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<Image[]>> GetImagesAsync(
-            int tvdbId,
-            ImagesQuery imageQuery,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("images", tvdbId, language, imageQuery);
-            return TryGetValue(cacheKey, language, () => TvDbClient.Series.GetImagesAsync(tvdbId, imageQuery, cancellationToken));
-        }
-
-        public Task<TvDbResponse<Language[]>> GetLanguagesAsync(CancellationToken cancellationToken)
-        {
-            return TryGetValue("languages", null, () => TvDbClient.Languages.GetAllAsync(cancellationToken));
-        }
-
-        public Task<TvDbResponse<EpisodesSummary>> GetSeriesEpisodeSummaryAsync(
-            int tvdbId,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey("seriesepisodesummary", tvdbId, language);
-            return TryGetValue(cacheKey, language,
-                () => TvDbClient.Series.GetEpisodesSummaryAsync(tvdbId, cancellationToken));
-        }
-
-        public Task<TvDbResponse<EpisodeRecord[]>> GetEpisodesPageAsync(
-            int tvdbId,
-            int page,
-            EpisodeQuery episodeQuery,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey(language, tvdbId, episodeQuery);
-
-            return TryGetValue(cacheKey, language,
-                () => TvDbClient.Series.GetEpisodesAsync(tvdbId, page, episodeQuery, cancellationToken));
-        }
-
-        public Task<string> GetEpisodeTvdbId(
-            EpisodeInfo searchInfo,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            searchInfo.SeriesProviderIds.TryGetValue(
-                nameof(MetadataProvider.Tvdb),
-                out var seriesTvdbId);
-
-            var episodeQuery = new EpisodeQuery();
-
-            // Prefer SxE over premiere date as it is more robust
-            if (searchInfo.IndexNumber.HasValue && searchInfo.ParentIndexNumber.HasValue)
-            {
-                switch (searchInfo.SeriesDisplayOrder)
-                {
-                    case "dvd":
-                        episodeQuery.DvdEpisode = searchInfo.IndexNumber.Value;
-                        episodeQuery.DvdSeason = searchInfo.ParentIndexNumber.Value;
-                        break;
-                    case "absolute":
-                        episodeQuery.AbsoluteNumber = searchInfo.IndexNumber.Value;
-                        break;
-                    default:
-                        // aired order
-                        episodeQuery.AiredEpisode = searchInfo.IndexNumber.Value;
-                        episodeQuery.AiredSeason = searchInfo.ParentIndexNumber.Value;
-                        break;
-                }
-            }
-            else if (searchInfo.PremiereDate.HasValue)
-            {
-                // tvdb expects yyyy-mm-dd format
-                episodeQuery.FirstAired = searchInfo.PremiereDate.Value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
-            }
-
-            return GetEpisodeTvdbId(Convert.ToInt32(seriesTvdbId, CultureInfo.InvariantCulture), episodeQuery, language, cancellationToken);
-        }
-
-        public async Task<string> GetEpisodeTvdbId(
-            int seriesTvdbId,
-            EpisodeQuery episodeQuery,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            var episodePage =
-                await GetEpisodesPageAsync(Convert.ToInt32(seriesTvdbId), episodeQuery, language, cancellationToken)
-                    .ConfigureAwait(false);
-            return episodePage.Data.FirstOrDefault()?.Id.ToString(CultureInfo.InvariantCulture);
-        }
-
-        public Task<TvDbResponse<EpisodeRecord[]>> GetEpisodesPageAsync(
-            int tvdbId,
-            EpisodeQuery episodeQuery,
-            string language,
-            CancellationToken cancellationToken)
-        {
-            return GetEpisodesPageAsync(tvdbId, 1, episodeQuery, language, cancellationToken);
-        }
-
-        public async IAsyncEnumerable<KeyType> GetImageKeyTypesForSeriesAsync(int tvdbId, string language, [EnumeratorCancellation] CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey(nameof(TvDbClient.Series.GetImagesSummaryAsync), tvdbId);
-            var imagesSummary = await TryGetValue(cacheKey, language, () => TvDbClient.Series.GetImagesSummaryAsync(tvdbId, cancellationToken)).ConfigureAwait(false);
-
-            if (imagesSummary.Data.Fanart > 0)
-            {
-                yield return KeyType.Fanart;
-            }
-
-            if (imagesSummary.Data.Series > 0)
-            {
-                yield return KeyType.Series;
-            }
-
-            if (imagesSummary.Data.Poster > 0)
-            {
-                yield return KeyType.Poster;
-            }
-        }
-
-        public async IAsyncEnumerable<KeyType> GetImageKeyTypesForSeasonAsync(int tvdbId, string language, [EnumeratorCancellation] CancellationToken cancellationToken)
-        {
-            var cacheKey = GenerateKey(nameof(TvDbClient.Series.GetImagesSummaryAsync), tvdbId);
-            var imagesSummary = await TryGetValue(cacheKey, language, () => TvDbClient.Series.GetImagesSummaryAsync(tvdbId, cancellationToken)).ConfigureAwait(false);
-
-            if (imagesSummary.Data.Season > 0)
-            {
-                yield return KeyType.Season;
-            }
-
-            if (imagesSummary.Data.Fanart > 0)
-            {
-                yield return KeyType.Fanart;
-            }
-
-            // TODO seasonwide is not supported in TvDbSharper
-        }
-
-        private async Task<T> TryGetValue<T>(string key, string language, Func<Task<T>> resultFactory)
-        {
-            if (_cache.TryGetValue(key, out T cachedValue))
-            {
-                return cachedValue;
-            }
-
-            _tvDbClient.AcceptedLanguage = TvdbUtils.NormalizeLanguage(language) ?? DefaultLanguage;
-            var result = await resultFactory.Invoke().ConfigureAwait(false);
-            _cache.Set(key, result, TimeSpan.FromHours(1));
-            return result;
-        }
-
-        private static string GenerateKey(params object[] objects)
-        {
-            var key = string.Empty;
-
-            foreach (var obj in objects)
-            {
-                var objType = obj.GetType();
-                if (objType.IsPrimitive || objType == typeof(string))
-                {
-                    key += obj + ";";
-                }
-                else
-                {
-                    foreach (PropertyInfo propertyInfo in objType.GetProperties())
-                    {
-                        var currentValue = propertyInfo.GetValue(obj, null);
-                        if (currentValue == null)
-                        {
-                            continue;
-                        }
-
-                        key += propertyInfo.Name + "=" + currentValue + ";";
-                    }
-                }
-            }
-
-            return key;
-        }
-    }
-}

+ 0 - 130
MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeImageProvider.cs

@@ -1,130 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Net.Http;
-using System.Globalization;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-using TvDbSharper.Dto;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbEpisodeImageProvider : IRemoteImageProvider
-    {
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbEpisodeImageProvider> _logger;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbEpisodeImageProvider(IHttpClientFactory httpClientFactory, ILogger<TvdbEpisodeImageProvider> logger, TvdbClientManager tvdbClientManager)
-        {
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        public string Name => "TheTVDB";
-
-        public bool Supports(BaseItem item)
-        {
-            return item is Episode;
-        }
-
-        public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
-        {
-            return new List<ImageType>
-            {
-                ImageType.Primary
-            };
-        }
-
-        public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
-        {
-            var episode = (Episode)item;
-            var series = episode.Series;
-            var imageResult = new List<RemoteImageInfo>();
-            var language = item.GetPreferredMetadataLanguage();
-            if (series != null && TvdbSeriesProvider.IsValidSeries(series.ProviderIds))
-            {
-                // Process images
-                try
-                {
-                    string episodeTvdbId = null;
-
-                    if (episode.IndexNumber.HasValue && episode.ParentIndexNumber.HasValue)
-                    {
-                        var episodeInfo = new EpisodeInfo
-                        {
-                            IndexNumber = episode.IndexNumber.Value,
-                            ParentIndexNumber = episode.ParentIndexNumber.Value,
-                            SeriesProviderIds = series.ProviderIds,
-                            SeriesDisplayOrder = series.DisplayOrder
-                        };
-
-                        episodeTvdbId = await _tvdbClientManager
-                            .GetEpisodeTvdbId(episodeInfo, language, cancellationToken).ConfigureAwait(false);
-                    }
-
-                    if (string.IsNullOrEmpty(episodeTvdbId))
-                    {
-                        _logger.LogError(
-                            "Episode {SeasonNumber}x{EpisodeNumber} not found for series {SeriesTvdbId}",
-                            episode.ParentIndexNumber,
-                            episode.IndexNumber,
-                            series.GetProviderId(MetadataProvider.Tvdb));
-                        return imageResult;
-                    }
-
-                    var episodeResult =
-                        await _tvdbClientManager
-                            .GetEpisodesAsync(Convert.ToInt32(episodeTvdbId, CultureInfo.InvariantCulture), language, cancellationToken)
-                            .ConfigureAwait(false);
-
-                    var image = GetImageInfo(episodeResult.Data);
-                    if (image != null)
-                    {
-                        imageResult.Add(image);
-                    }
-                }
-                catch (TvDbServerException e)
-                {
-                    _logger.LogError(e, "Failed to retrieve episode images for series {TvDbId}", series.GetProviderId(MetadataProvider.Tvdb));
-                }
-            }
-
-            return imageResult;
-        }
-
-        private RemoteImageInfo GetImageInfo(EpisodeRecord episode)
-        {
-            if (string.IsNullOrEmpty(episode.Filename))
-            {
-                return null;
-            }
-
-            return new RemoteImageInfo
-            {
-                Width = Convert.ToInt32(episode.ThumbWidth, CultureInfo.InvariantCulture),
-                Height = Convert.ToInt32(episode.ThumbHeight, CultureInfo.InvariantCulture),
-                ProviderName = Name,
-                Url = TvdbUtils.BannerUrl + episode.Filename,
-                Type = ImageType.Primary
-            };
-        }
-
-        public int Order => 0;
-
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-    }
-}

+ 0 - 262
MediaBrowser.Providers/Plugins/TheTvdb/TvdbEpisodeProvider.cs

@@ -1,262 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-using TvDbSharper.Dto;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    /// <summary>
-    /// Class RemoteEpisodeProvider.
-    /// </summary>
-    public class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode, EpisodeInfo>, IHasOrder
-    {
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbEpisodeProvider> _logger;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbEpisodeProvider(IHttpClientFactory httpClientFactory, ILogger<TvdbEpisodeProvider> logger, TvdbClientManager tvdbClientManager)
-        {
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
-        {
-            var list = new List<RemoteSearchResult>();
-
-            // Either an episode number or date must be provided; and the dictionary of provider ids must be valid
-            if ((searchInfo.IndexNumber == null && searchInfo.PremiereDate == null)
-                || !TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds))
-            {
-                return list;
-            }
-
-            var metadataResult = await GetEpisode(searchInfo, cancellationToken).ConfigureAwait(false);
-
-            if (!metadataResult.HasMetadata)
-            {
-                return list;
-            }
-
-            var item = metadataResult.Item;
-
-            list.Add(new RemoteSearchResult
-            {
-                IndexNumber = item.IndexNumber,
-                Name = item.Name,
-                ParentIndexNumber = item.ParentIndexNumber,
-                PremiereDate = item.PremiereDate,
-                ProductionYear = item.ProductionYear,
-                ProviderIds = item.ProviderIds,
-                SearchProviderName = Name,
-                IndexNumberEnd = item.IndexNumberEnd
-            });
-
-            return list;
-        }
-
-        public string Name => "TheTVDB";
-
-        public async Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo searchInfo, CancellationToken cancellationToken)
-        {
-            var result = new MetadataResult<Episode>
-            {
-                QueriedById = true
-            };
-
-            if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds) &&
-                (searchInfo.IndexNumber.HasValue || searchInfo.PremiereDate.HasValue))
-            {
-                result = await GetEpisode(searchInfo, cancellationToken).ConfigureAwait(false);
-            }
-            else
-            {
-                _logger.LogDebug("No series identity found for {EpisodeName}", searchInfo.Name);
-            }
-
-            return result;
-        }
-
-        private async Task<MetadataResult<Episode>> GetEpisode(EpisodeInfo searchInfo, CancellationToken cancellationToken)
-        {
-            var result = new MetadataResult<Episode>
-            {
-                QueriedById = true
-            };
-
-            string seriesTvdbId = searchInfo.GetProviderId(MetadataProvider.Tvdb);
-            string episodeTvdbId = null;
-            try
-            {
-                episodeTvdbId = await _tvdbClientManager
-                    .GetEpisodeTvdbId(searchInfo, searchInfo.MetadataLanguage, cancellationToken)
-                    .ConfigureAwait(false);
-                if (string.IsNullOrEmpty(episodeTvdbId))
-                {
-                    _logger.LogError(
-                        "Episode {SeasonNumber}x{EpisodeNumber} not found for series {SeriesTvdbId}",
-                        searchInfo.ParentIndexNumber, searchInfo.IndexNumber, seriesTvdbId);
-                    return result;
-                }
-
-                var episodeResult = await _tvdbClientManager.GetEpisodesAsync(
-                    Convert.ToInt32(episodeTvdbId), searchInfo.MetadataLanguage,
-                    cancellationToken).ConfigureAwait(false);
-
-                result = MapEpisodeToResult(searchInfo, episodeResult.Data);
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "Failed to retrieve episode with id {EpisodeTvDbId}, series id {SeriesTvdbId}", episodeTvdbId, seriesTvdbId);
-            }
-
-            return result;
-        }
-
-        private static MetadataResult<Episode> MapEpisodeToResult(EpisodeInfo id, EpisodeRecord episode)
-        {
-            var result = new MetadataResult<Episode>
-            {
-                HasMetadata = true,
-                Item = new Episode
-                {
-                    IndexNumber = id.IndexNumber,
-                    ParentIndexNumber = id.ParentIndexNumber,
-                    IndexNumberEnd = id.IndexNumberEnd,
-                    AirsBeforeEpisodeNumber = episode.AirsBeforeEpisode,
-                    AirsAfterSeasonNumber = episode.AirsAfterSeason,
-                    AirsBeforeSeasonNumber = episode.AirsBeforeSeason,
-                    Name = episode.EpisodeName,
-                    Overview = episode.Overview,
-                    CommunityRating = (float?)episode.SiteRating,
-                    OfficialRating = episode.ContentRating,
-                }
-            };
-            result.ResetPeople();
-
-            var item = result.Item;
-            item.SetProviderId(MetadataProvider.Tvdb, episode.Id.ToString());
-            item.SetProviderId(MetadataProvider.Imdb, episode.ImdbId);
-
-            if (string.Equals(id.SeriesDisplayOrder, "dvd", StringComparison.OrdinalIgnoreCase))
-            {
-                item.IndexNumber = Convert.ToInt32(episode.DvdEpisodeNumber ?? episode.AiredEpisodeNumber);
-                item.ParentIndexNumber = episode.DvdSeason ?? episode.AiredSeason;
-            }
-            else if (string.Equals(id.SeriesDisplayOrder, "absolute", StringComparison.OrdinalIgnoreCase))
-            {
-                if (episode.AbsoluteNumber.GetValueOrDefault() != 0)
-                {
-                    item.IndexNumber = episode.AbsoluteNumber;
-                }
-            }
-            else if (episode.AiredEpisodeNumber.HasValue)
-            {
-                item.IndexNumber = episode.AiredEpisodeNumber;
-            }
-            else if (episode.AiredSeason.HasValue)
-            {
-                item.ParentIndexNumber = episode.AiredSeason;
-            }
-
-            if (DateTime.TryParse(episode.FirstAired, out var date))
-            {
-                // dates from tvdb are UTC but without offset or Z
-                item.PremiereDate = date;
-                item.ProductionYear = date.Year;
-            }
-
-            foreach (var director in episode.Directors)
-            {
-                result.AddPerson(new PersonInfo
-                {
-                    Name = director,
-                    Type = PersonType.Director
-                });
-            }
-
-            // GuestStars is a weird list of names and roles
-            // Example:
-            // 1: Some Actor (Role1
-            // 2: Role2
-            // 3: Role3)
-            // 4: Another Actor (Role1
-            // ...
-            for (var i = 0; i < episode.GuestStars.Length; ++i)
-            {
-                var currentActor = episode.GuestStars[i];
-                var roleStartIndex = currentActor.IndexOf('(', StringComparison.Ordinal);
-
-                if (roleStartIndex == -1)
-                {
-                    result.AddPerson(new PersonInfo
-                    {
-                        Type = PersonType.GuestStar,
-                        Name = currentActor,
-                        Role = string.Empty
-                    });
-                    continue;
-                }
-
-                var roles = new List<string> { currentActor.Substring(roleStartIndex + 1) };
-
-                // Fetch all roles
-                for (var j = i + 1; j < episode.GuestStars.Length; ++j)
-                {
-                    var currentRole = episode.GuestStars[j];
-                    var roleEndIndex = currentRole.IndexOf(')', StringComparison.Ordinal);
-
-                    if (roleEndIndex == -1)
-                    {
-                        roles.Add(currentRole);
-                        continue;
-                    }
-
-                    roles.Add(currentRole.TrimEnd(')'));
-                    // Update the outer index (keep in mind it adds 1 after the iteration)
-                    i = j;
-                    break;
-                }
-
-                result.AddPerson(new PersonInfo
-                {
-                    Type = PersonType.GuestStar,
-                    Name = currentActor.Substring(0, roleStartIndex).Trim(),
-                    Role = string.Join(", ", roles)
-                });
-            }
-
-            foreach (var writer in episode.Writers)
-            {
-                result.AddPerson(new PersonInfo
-                {
-                    Name = writer,
-                    Type = PersonType.Writer
-                });
-            }
-
-            result.ResultLanguage = episode.Language.EpisodeName;
-            return result;
-        }
-
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-
-        public int Order => 0;
-    }
-}

+ 0 - 113
MediaBrowser.Providers/Plugins/TheTvdb/TvdbPersonImageProvider.cs

@@ -1,113 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder
-    {
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbPersonImageProvider> _logger;
-        private readonly ILibraryManager _libraryManager;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbPersonImageProvider(ILibraryManager libraryManager, IHttpClientFactory httpClientFactory, ILogger<TvdbPersonImageProvider> logger, TvdbClientManager tvdbClientManager)
-        {
-            _libraryManager = libraryManager;
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        /// <inheritdoc />
-        public string Name => "TheTVDB";
-
-        /// <inheritdoc />
-        public int Order => 1;
-
-        /// <inheritdoc />
-        public bool Supports(BaseItem item) => item is Person;
-
-        /// <inheritdoc />
-        public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
-        {
-            yield return ImageType.Primary;
-        }
-
-        /// <inheritdoc />
-        public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
-        {
-            var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
-            {
-                IncludeItemTypes = new[] { nameof(Series) },
-                PersonIds = new[] { item.Id },
-                DtoOptions = new DtoOptions(false)
-                {
-                    EnableImages = false
-                }
-            }).Cast<Series>()
-                .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds))
-                .ToList();
-
-            var infos = (await Task.WhenAll(seriesWithPerson.Select(async i =>
-                        await GetImageFromSeriesData(i, item.Name, cancellationToken).ConfigureAwait(false)))
-                    .ConfigureAwait(false))
-                .Where(i => i != null)
-                .Take(1);
-
-            return infos;
-        }
-
-        private async Task<RemoteImageInfo> GetImageFromSeriesData(Series series, string personName, CancellationToken cancellationToken)
-        {
-            var tvdbId = Convert.ToInt32(series.GetProviderId(MetadataProvider.Tvdb));
-
-            try
-            {
-                var actorsResult = await _tvdbClientManager
-                    .GetActorsAsync(tvdbId, series.GetPreferredMetadataLanguage(), cancellationToken)
-                    .ConfigureAwait(false);
-                var actor = actorsResult.Data.FirstOrDefault(a =>
-                    string.Equals(a.Name, personName, StringComparison.OrdinalIgnoreCase) &&
-                    !string.IsNullOrEmpty(a.Image));
-                if (actor == null)
-                {
-                    return null;
-                }
-
-                return new RemoteImageInfo
-                {
-                    Url = TvdbUtils.BannerUrl + actor.Image,
-                    Type = ImageType.Primary,
-                    ProviderName = Name
-                };
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "Failed to retrieve actor {ActorName} from series {SeriesTvdbId}", personName, tvdbId);
-                return null;
-            }
-        }
-
-        /// <inheritdoc />
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-    }
-}

+ 0 - 155
MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeasonImageProvider.cs

@@ -1,155 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-using TvDbSharper.Dto;
-using RatingType = MediaBrowser.Model.Dto.RatingType;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbSeasonImageProvider : IRemoteImageProvider, IHasOrder
-    {
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbSeasonImageProvider> _logger;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbSeasonImageProvider(IHttpClientFactory httpClientFactory, ILogger<TvdbSeasonImageProvider> logger, TvdbClientManager tvdbClientManager)
-        {
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        public string Name => ProviderName;
-
-        public static string ProviderName => "TheTVDB";
-
-        public bool Supports(BaseItem item)
-        {
-            return item is Season;
-        }
-
-        public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
-        {
-            return new List<ImageType>
-            {
-                ImageType.Primary,
-                ImageType.Banner,
-                ImageType.Backdrop
-            };
-        }
-
-        public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
-        {
-            var season = (Season)item;
-            var series = season.Series;
-
-            if (series == null || !season.IndexNumber.HasValue || !TvdbSeriesProvider.IsValidSeries(series.ProviderIds))
-            {
-                return Array.Empty<RemoteImageInfo>();
-            }
-
-            var tvdbId = Convert.ToInt32(series.GetProviderId(MetadataProvider.Tvdb));
-            var seasonNumber = season.IndexNumber.Value;
-            var language = item.GetPreferredMetadataLanguage();
-            var remoteImages = new List<RemoteImageInfo>();
-
-            var keyTypes = _tvdbClientManager.GetImageKeyTypesForSeasonAsync(tvdbId, language, cancellationToken).ConfigureAwait(false);
-            await foreach (var keyType in keyTypes)
-            {
-                var imageQuery = new ImagesQuery
-                {
-                    KeyType = keyType,
-                    SubKey = seasonNumber.ToString()
-                };
-                try
-                {
-                    var imageResults = await _tvdbClientManager
-                        .GetImagesAsync(tvdbId, imageQuery, language, cancellationToken).ConfigureAwait(false);
-                    remoteImages.AddRange(GetImages(imageResults.Data, language));
-                }
-                catch (TvDbServerException)
-                {
-                    _logger.LogDebug("No images of type {KeyType} found for series {TvdbId}", keyType, tvdbId);
-                }
-            }
-
-            return remoteImages;
-        }
-
-        private IEnumerable<RemoteImageInfo> GetImages(Image[] images, string preferredLanguage)
-        {
-            var list = new List<RemoteImageInfo>();
-            // any languages with null ids are ignored
-            var languages = _tvdbClientManager.GetLanguagesAsync(CancellationToken.None).Result.Data.Where(x => x.Id.HasValue);
-            foreach (Image image in images)
-            {
-                var imageInfo = new RemoteImageInfo
-                {
-                    RatingType = RatingType.Score,
-                    CommunityRating = (double?)image.RatingsInfo.Average,
-                    VoteCount = image.RatingsInfo.Count,
-                    Url = TvdbUtils.BannerUrl + image.FileName,
-                    ProviderName = ProviderName,
-                    Language = languages.FirstOrDefault(lang => lang.Id == image.LanguageId)?.Abbreviation,
-                    ThumbnailUrl = TvdbUtils.BannerUrl + image.Thumbnail
-                };
-
-                var resolution = image.Resolution.Split('x');
-                if (resolution.Length == 2)
-                {
-                    imageInfo.Width = Convert.ToInt32(resolution[0]);
-                    imageInfo.Height = Convert.ToInt32(resolution[1]);
-                }
-
-                imageInfo.Type = TvdbUtils.GetImageTypeFromKeyType(image.KeyType);
-                list.Add(imageInfo);
-            }
-
-            var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase);
-            return list.OrderByDescending(i =>
-                {
-                    if (string.Equals(preferredLanguage, i.Language, StringComparison.OrdinalIgnoreCase))
-                    {
-                        return 3;
-                    }
-
-                    if (!isLanguageEn)
-                    {
-                        if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase))
-                        {
-                            return 2;
-                        }
-                    }
-
-                    if (string.IsNullOrEmpty(i.Language))
-                    {
-                        return isLanguageEn ? 3 : 2;
-                    }
-
-                    return 0;
-                })
-                .ThenByDescending(i => i.CommunityRating ?? 0)
-                .ThenByDescending(i => i.VoteCount ?? 0);
-        }
-
-        public int Order => 0;
-
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-    }
-}

+ 0 - 153
MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesImageProvider.cs

@@ -1,153 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-using TvDbSharper.Dto;
-using RatingType = MediaBrowser.Model.Dto.RatingType;
-using Series = MediaBrowser.Controller.Entities.TV.Series;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbSeriesImageProvider : IRemoteImageProvider, IHasOrder
-    {
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbSeriesImageProvider> _logger;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbSeriesImageProvider(IHttpClientFactory httpClientFactory, ILogger<TvdbSeriesImageProvider> logger, TvdbClientManager tvdbClientManager)
-        {
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        public string Name => ProviderName;
-
-        public static string ProviderName => "TheTVDB";
-
-        public bool Supports(BaseItem item)
-        {
-            return item is Series;
-        }
-
-        public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
-        {
-            return new List<ImageType>
-            {
-                ImageType.Primary,
-                ImageType.Banner,
-                ImageType.Backdrop
-            };
-        }
-
-        public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
-        {
-            if (!TvdbSeriesProvider.IsValidSeries(item.ProviderIds))
-            {
-                return Array.Empty<RemoteImageInfo>();
-            }
-
-            var language = item.GetPreferredMetadataLanguage();
-            var remoteImages = new List<RemoteImageInfo>();
-            var tvdbId = Convert.ToInt32(item.GetProviderId(MetadataProvider.Tvdb));
-            var allowedKeyTypes = _tvdbClientManager.GetImageKeyTypesForSeriesAsync(tvdbId, language, cancellationToken)
-                .ConfigureAwait(false);
-            await foreach (KeyType keyType in allowedKeyTypes)
-            {
-                var imageQuery = new ImagesQuery
-                {
-                    KeyType = keyType
-                };
-                try
-                {
-                    var imageResults =
-                        await _tvdbClientManager.GetImagesAsync(tvdbId, imageQuery, language, cancellationToken)
-                            .ConfigureAwait(false);
-
-                    remoteImages.AddRange(GetImages(imageResults.Data, language));
-                }
-                catch (TvDbServerException)
-                {
-                    _logger.LogDebug("No images of type {KeyType} exist for series {TvDbId}", keyType,
-                        tvdbId);
-                }
-            }
-
-            return remoteImages;
-        }
-
-        private IEnumerable<RemoteImageInfo> GetImages(Image[] images, string preferredLanguage)
-        {
-            var list = new List<RemoteImageInfo>();
-            var languages = _tvdbClientManager.GetLanguagesAsync(CancellationToken.None).Result.Data;
-
-            foreach (Image image in images)
-            {
-                var imageInfo = new RemoteImageInfo
-                {
-                    RatingType = RatingType.Score,
-                    CommunityRating = (double?)image.RatingsInfo.Average,
-                    VoteCount = image.RatingsInfo.Count,
-                    Url = TvdbUtils.BannerUrl + image.FileName,
-                    ProviderName = Name,
-                    Language = languages.FirstOrDefault(lang => lang.Id == image.LanguageId)?.Abbreviation,
-                    ThumbnailUrl = TvdbUtils.BannerUrl + image.Thumbnail
-                };
-
-                var resolution = image.Resolution.Split('x');
-                if (resolution.Length == 2)
-                {
-                    imageInfo.Width = Convert.ToInt32(resolution[0]);
-                    imageInfo.Height = Convert.ToInt32(resolution[1]);
-                }
-
-                imageInfo.Type = TvdbUtils.GetImageTypeFromKeyType(image.KeyType);
-                list.Add(imageInfo);
-            }
-
-            var isLanguageEn = string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase);
-            return list.OrderByDescending(i =>
-                {
-                    if (string.Equals(preferredLanguage, i.Language, StringComparison.OrdinalIgnoreCase))
-                    {
-                        return 3;
-                    }
-
-                    if (!isLanguageEn)
-                    {
-                        if (string.Equals("en", i.Language, StringComparison.OrdinalIgnoreCase))
-                        {
-                            return 2;
-                        }
-                    }
-
-                    if (string.IsNullOrEmpty(i.Language))
-                    {
-                        return isLanguageEn ? 3 : 2;
-                    }
-
-                    return 0;
-                })
-                .ThenByDescending(i => i.CommunityRating ?? 0)
-                .ThenByDescending(i => i.VoteCount ?? 0);
-        }
-
-        public int Order => 0;
-
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-    }
-}

+ 0 - 419
MediaBrowser.Providers/Plugins/TheTvdb/TvdbSeriesProvider.cs

@@ -1,419 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Net.Http;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Globalization;
-using MediaBrowser.Model.Providers;
-using Microsoft.Extensions.Logging;
-using TvDbSharper;
-using TvDbSharper.Dto;
-using Series = MediaBrowser.Controller.Entities.TV.Series;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder
-    {
-        internal static TvdbSeriesProvider Current { get; private set; }
-
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly ILogger<TvdbSeriesProvider> _logger;
-        private readonly ILibraryManager _libraryManager;
-        private readonly ILocalizationManager _localizationManager;
-        private readonly TvdbClientManager _tvdbClientManager;
-
-        public TvdbSeriesProvider(IHttpClientFactory httpClientFactory, ILogger<TvdbSeriesProvider> logger, ILibraryManager libraryManager, ILocalizationManager localizationManager, TvdbClientManager tvdbClientManager)
-        {
-            _httpClientFactory = httpClientFactory;
-            _logger = logger;
-            _libraryManager = libraryManager;
-            _localizationManager = localizationManager;
-            Current = this;
-            _tvdbClientManager = tvdbClientManager;
-        }
-
-        public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
-        {
-            if (IsValidSeries(searchInfo.ProviderIds))
-            {
-                var metadata = await GetMetadata(searchInfo, cancellationToken).ConfigureAwait(false);
-
-                if (metadata.HasMetadata)
-                {
-                    return new List<RemoteSearchResult>
-                    {
-                        new RemoteSearchResult
-                        {
-                            Name = metadata.Item.Name,
-                            PremiereDate = metadata.Item.PremiereDate,
-                            ProductionYear = metadata.Item.ProductionYear,
-                            ProviderIds = metadata.Item.ProviderIds,
-                            SearchProviderName = Name
-                        }
-                    };
-                }
-            }
-
-            return await FindSeries(searchInfo.Name, searchInfo.Year, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false);
-        }
-
-        public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo itemId, CancellationToken cancellationToken)
-        {
-            var result = new MetadataResult<Series>
-            {
-                QueriedById = true
-            };
-
-            if (!IsValidSeries(itemId.ProviderIds))
-            {
-                result.QueriedById = false;
-                await Identify(itemId).ConfigureAwait(false);
-            }
-
-            cancellationToken.ThrowIfCancellationRequested();
-
-            if (IsValidSeries(itemId.ProviderIds))
-            {
-                result.Item = new Series();
-                result.HasMetadata = true;
-
-                await FetchSeriesData(result, itemId.MetadataLanguage, itemId.ProviderIds, cancellationToken)
-                    .ConfigureAwait(false);
-            }
-
-            return result;
-        }
-
-        private async Task FetchSeriesData(MetadataResult<Series> result, string metadataLanguage, Dictionary<string, string> seriesProviderIds, CancellationToken cancellationToken)
-        {
-            var series = result.Item;
-
-            if (seriesProviderIds.TryGetValue(MetadataProvider.Tvdb.ToString(), out var tvdbId) && !string.IsNullOrEmpty(tvdbId))
-            {
-                series.SetProviderId(MetadataProvider.Tvdb, tvdbId);
-            }
-
-            if (seriesProviderIds.TryGetValue(MetadataProvider.Imdb.ToString(), out var imdbId) && !string.IsNullOrEmpty(imdbId))
-            {
-                series.SetProviderId(MetadataProvider.Imdb, imdbId);
-                tvdbId = await GetSeriesByRemoteId(imdbId, MetadataProvider.Imdb.ToString(), metadataLanguage,
-                    cancellationToken).ConfigureAwait(false);
-            }
-
-            if (seriesProviderIds.TryGetValue(MetadataProvider.Zap2It.ToString(), out var zap2It) && !string.IsNullOrEmpty(zap2It))
-            {
-                series.SetProviderId(MetadataProvider.Zap2It, zap2It);
-                tvdbId = await GetSeriesByRemoteId(zap2It, MetadataProvider.Zap2It.ToString(), metadataLanguage,
-                    cancellationToken).ConfigureAwait(false);
-            }
-
-            try
-            {
-                var seriesResult =
-                    await _tvdbClientManager
-                        .GetSeriesByIdAsync(Convert.ToInt32(tvdbId), metadataLanguage, cancellationToken)
-                        .ConfigureAwait(false);
-                await MapSeriesToResult(result, seriesResult.Data, metadataLanguage).ConfigureAwait(false);
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "Failed to retrieve series with id {TvdbId}", tvdbId);
-                return;
-            }
-
-            cancellationToken.ThrowIfCancellationRequested();
-
-            result.ResetPeople();
-
-            try
-            {
-                var actorsResult = await _tvdbClientManager
-                    .GetActorsAsync(Convert.ToInt32(tvdbId), metadataLanguage, cancellationToken).ConfigureAwait(false);
-                MapActorsToResult(result, actorsResult.Data);
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "Failed to retrieve actors for series {TvdbId}", tvdbId);
-            }
-        }
-
-        private async Task<string> GetSeriesByRemoteId(string id, string idType, string language, CancellationToken cancellationToken)
-        {
-            TvDbResponse<SeriesSearchResult[]> result = null;
-
-            try
-            {
-                if (string.Equals(idType, MetadataProvider.Zap2It.ToString(), StringComparison.OrdinalIgnoreCase))
-                {
-                    result = await _tvdbClientManager.GetSeriesByZap2ItIdAsync(id, language, cancellationToken)
-                        .ConfigureAwait(false);
-                }
-                else
-                {
-                    result = await _tvdbClientManager.GetSeriesByImdbIdAsync(id, language, cancellationToken)
-                        .ConfigureAwait(false);
-                }
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "Failed to retrieve series with remote id {RemoteId}", id);
-            }
-
-            return result?.Data[0].Id.ToString(CultureInfo.InvariantCulture);
-        }
-
-        /// <summary>
-        /// Check whether a dictionary of provider IDs includes an entry for a valid TV metadata provider.
-        /// </summary>
-        /// <param name="seriesProviderIds">The dictionary to check.</param>
-        /// <returns>True, if the dictionary contains a valid TV provider ID, otherwise false.</returns>
-        internal static bool IsValidSeries(Dictionary<string, string> seriesProviderIds)
-        {
-            return seriesProviderIds.ContainsKey(MetadataProvider.Tvdb.ToString()) ||
-                   seriesProviderIds.ContainsKey(MetadataProvider.Imdb.ToString()) ||
-                   seriesProviderIds.ContainsKey(MetadataProvider.Zap2It.ToString());
-        }
-
-        /// <summary>
-        /// Finds the series.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="year">The year.</param>
-        /// <param name="language">The language.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{System.String}.</returns>
-        private async Task<IEnumerable<RemoteSearchResult>> FindSeries(string name, int? year, string language, CancellationToken cancellationToken)
-        {
-            var results = await FindSeriesInternal(name, language, cancellationToken).ConfigureAwait(false);
-
-            if (results.Count == 0)
-            {
-                var parsedName = _libraryManager.ParseName(name);
-                var nameWithoutYear = parsedName.Name;
-
-                if (!string.IsNullOrWhiteSpace(nameWithoutYear) && !string.Equals(nameWithoutYear, name, StringComparison.OrdinalIgnoreCase))
-                {
-                    results = await FindSeriesInternal(nameWithoutYear, language, cancellationToken).ConfigureAwait(false);
-                }
-            }
-
-            return results.Where(i =>
-            {
-                if (year.HasValue && i.ProductionYear.HasValue)
-                {
-                    // Allow one year tolerance
-                    return Math.Abs(year.Value - i.ProductionYear.Value) <= 1;
-                }
-
-                return true;
-            });
-        }
-
-        private async Task<List<RemoteSearchResult>> FindSeriesInternal(string name, string language, CancellationToken cancellationToken)
-        {
-            var comparableName = GetComparableName(name);
-            var list = new List<Tuple<List<string>, RemoteSearchResult>>();
-            TvDbResponse<SeriesSearchResult[]> result;
-            try
-            {
-                result = await _tvdbClientManager.GetSeriesByNameAsync(comparableName, language, cancellationToken)
-                    .ConfigureAwait(false);
-            }
-            catch (TvDbServerException e)
-            {
-                _logger.LogError(e, "No series results found for {Name}", comparableName);
-                return new List<RemoteSearchResult>();
-            }
-
-            foreach (var seriesSearchResult in result.Data)
-            {
-                var tvdbTitles = new List<string>
-                {
-                    GetComparableName(seriesSearchResult.SeriesName)
-                };
-                tvdbTitles.AddRange(seriesSearchResult.Aliases.Select(GetComparableName));
-
-                DateTime.TryParse(seriesSearchResult.FirstAired, out var firstAired);
-                var remoteSearchResult = new RemoteSearchResult
-                {
-                    Name = tvdbTitles.FirstOrDefault(),
-                    ProductionYear = firstAired.Year,
-                    SearchProviderName = Name
-                };
-
-                if (!string.IsNullOrEmpty(seriesSearchResult.Banner))
-                {
-                    // Results from their Search endpoints already include the /banners/ part in the url, because reasons...
-                    remoteSearchResult.ImageUrl = TvdbUtils.TvdbImageBaseUrl + seriesSearchResult.Banner;
-                }
-
-                try
-                {
-                    var seriesSesult =
-                        await _tvdbClientManager.GetSeriesByIdAsync(seriesSearchResult.Id, language, cancellationToken)
-                            .ConfigureAwait(false);
-                    remoteSearchResult.SetProviderId(MetadataProvider.Imdb, seriesSesult.Data.ImdbId);
-                    remoteSearchResult.SetProviderId(MetadataProvider.Zap2It, seriesSesult.Data.Zap2itId);
-                }
-                catch (TvDbServerException e)
-                {
-                    _logger.LogError(e, "Unable to retrieve series with id {TvdbId}", seriesSearchResult.Id);
-                }
-
-                remoteSearchResult.SetProviderId(MetadataProvider.Tvdb, seriesSearchResult.Id.ToString());
-                list.Add(new Tuple<List<string>, RemoteSearchResult>(tvdbTitles, remoteSearchResult));
-            }
-
-            return list
-                .OrderBy(i => i.Item1.Contains(comparableName, StringComparer.OrdinalIgnoreCase) ? 0 : 1)
-                .ThenBy(i => list.IndexOf(i))
-                .Select(i => i.Item2)
-                .ToList();
-        }
-
-        /// <summary>
-        /// Gets the name of the comparable.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <returns>System.String.</returns>
-        private string GetComparableName(string name)
-        {
-            name = name.ToLowerInvariant();
-            name = name.Normalize(NormalizationForm.FormKD);
-            name = name.Replace(", the", string.Empty).Replace("the ", " ").Replace(" the ", " ");
-            name = name.Replace("&", " and " );
-            name = Regex.Replace(name, @"[\p{Lm}\p{Mn}]", string.Empty); // Remove diacritics, etc
-            name = Regex.Replace(name, @"[\W\p{Pc}]+", " "); // Replace sequences of non-word characters and _ with " "
-            return name.Trim();
-        }
-
-        private async Task MapSeriesToResult(MetadataResult<Series> result, TvDbSharper.Dto.Series tvdbSeries, string metadataLanguage)
-        {
-            Series series = result.Item;
-            series.SetProviderId(MetadataProvider.Tvdb, tvdbSeries.Id.ToString());
-            series.Name = tvdbSeries.SeriesName;
-            series.Overview = (tvdbSeries.Overview ?? string.Empty).Trim();
-            result.ResultLanguage = metadataLanguage;
-            series.AirDays = TVUtils.GetAirDays(tvdbSeries.AirsDayOfWeek);
-            series.AirTime = tvdbSeries.AirsTime;
-            series.CommunityRating = (float?)tvdbSeries.SiteRating;
-            series.SetProviderId(MetadataProvider.Imdb, tvdbSeries.ImdbId);
-            series.SetProviderId(MetadataProvider.Zap2It, tvdbSeries.Zap2itId);
-            if (Enum.TryParse(tvdbSeries.Status, true, out SeriesStatus seriesStatus))
-            {
-                series.Status = seriesStatus;
-            }
-
-            if (DateTime.TryParse(tvdbSeries.FirstAired, out var date))
-            {
-                // dates from tvdb are UTC but without offset or Z
-                series.PremiereDate = date;
-                series.ProductionYear = date.Year;
-            }
-
-            if (!string.IsNullOrEmpty(tvdbSeries.Runtime) && double.TryParse(tvdbSeries.Runtime, out double runtime))
-            {
-                series.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
-            }
-
-            foreach (var genre in tvdbSeries.Genre)
-            {
-                series.AddGenre(genre);
-            }
-
-            if (!string.IsNullOrEmpty(tvdbSeries.Network))
-            {
-                series.AddStudio(tvdbSeries.Network);
-            }
-
-            if (result.Item.Status.HasValue && result.Item.Status.Value == SeriesStatus.Ended)
-            {
-                try
-                {
-                    var episodeSummary = await _tvdbClientManager.GetSeriesEpisodeSummaryAsync(tvdbSeries.Id, metadataLanguage, CancellationToken.None).ConfigureAwait(false);
-
-                    if (episodeSummary.Data.AiredSeasons.Length != 0)
-                    {
-                        var maxSeasonNumber = episodeSummary.Data.AiredSeasons.Max(s => Convert.ToInt32(s, CultureInfo.InvariantCulture));
-                        var episodeQuery = new EpisodeQuery
-                        {
-                            AiredSeason = maxSeasonNumber
-                        };
-                        var episodesPage = await _tvdbClientManager.GetEpisodesPageAsync(tvdbSeries.Id, episodeQuery, metadataLanguage, CancellationToken.None).ConfigureAwait(false);
-
-                        result.Item.EndDate = episodesPage.Data
-                            .Select(e => DateTime.TryParse(e.FirstAired, out var firstAired) ? firstAired : (DateTime?)null)
-                            .Max();
-                    }
-                }
-                catch (TvDbServerException e)
-                {
-                    _logger.LogError(e, "Failed to find series end date for series {TvdbId}", tvdbSeries.Id);
-                }
-            }
-        }
-
-        private static void MapActorsToResult(MetadataResult<Series> result, IEnumerable<Actor> actors)
-        {
-            foreach (Actor actor in actors)
-            {
-                var personInfo = new PersonInfo
-                {
-                    Type = PersonType.Actor,
-                    Name = (actor.Name ?? string.Empty).Trim(),
-                    Role = actor.Role,
-                    SortOrder = actor.SortOrder
-                };
-
-                if (!string.IsNullOrEmpty(actor.Image))
-                {
-                    personInfo.ImageUrl = TvdbUtils.BannerUrl + actor.Image;
-                }
-
-                if (!string.IsNullOrWhiteSpace(personInfo.Name))
-                {
-                    result.AddPerson(personInfo);
-                }
-            }
-        }
-
-        public string Name => "TheTVDB";
-
-        public async Task Identify(SeriesInfo info)
-        {
-            if (!string.IsNullOrWhiteSpace(info.GetProviderId(MetadataProvider.Tvdb)))
-            {
-                return;
-            }
-
-            var srch = await FindSeries(info.Name, info.Year, info.MetadataLanguage, CancellationToken.None)
-                .ConfigureAwait(false);
-
-            var entry = srch.FirstOrDefault();
-
-            if (entry != null)
-            {
-                var id = entry.GetProviderId(MetadataProvider.Tvdb);
-                info.SetProviderId(MetadataProvider.Tvdb, id);
-            }
-        }
-
-        public int Order => 0;
-
-        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
-        {
-            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
-        }
-    }
-}

+ 0 - 39
MediaBrowser.Providers/Plugins/TheTvdb/TvdbUtils.cs

@@ -1,39 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using MediaBrowser.Model.Entities;
-
-namespace MediaBrowser.Providers.Plugins.TheTvdb
-{
-    public static class TvdbUtils
-    {
-        public const string TvdbApiKey = "OG4V3YJ3FAP7FP2K";
-        public const string TvdbBaseUrl = "https://www.thetvdb.com/";
-        public const string TvdbImageBaseUrl = "https://www.thetvdb.com";
-        public const string BannerUrl = TvdbImageBaseUrl + "/banners/";
-
-        public static ImageType GetImageTypeFromKeyType(string keyType)
-        {
-            switch (keyType.ToLowerInvariant())
-            {
-                case "poster":
-                case "season": return ImageType.Primary;
-                case "series":
-                case "seasonwide": return ImageType.Banner;
-                case "fanart": return ImageType.Backdrop;
-                default: throw new ArgumentException($"Invalid or unknown keytype: {keyType}", nameof(keyType));
-            }
-        }
-
-        public static string NormalizeLanguage(string language)
-        {
-            if (string.IsNullOrWhiteSpace(language))
-            {
-                return null;
-            }
-
-            // pt-br is just pt to tvdb
-            return language.Split('-')[0].ToLowerInvariant();
-        }
-    }
-}

+ 0 - 28
MediaBrowser.Providers/TV/TvdbEpisodeExternalId.cs

@@ -1,28 +0,0 @@
-#pragma warning disable CS1591
-
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Providers.Plugins.TheTvdb;
-
-namespace MediaBrowser.Providers.TV
-{
-    public class TvdbEpisodeExternalId : IExternalId
-    {
-        /// <inheritdoc />
-        public string ProviderName => "TheTVDB";
-
-        /// <inheritdoc />
-        public string Key => MetadataProvider.Tvdb.ToString();
-
-        /// <inheritdoc />
-        public ExternalIdMediaType? Type => ExternalIdMediaType.Episode;
-
-        /// <inheritdoc />
-        public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=episode&id={0}";
-
-        /// <inheritdoc />
-        public bool Supports(IHasProviderIds item) => item is Episode;
-    }
-}

+ 0 - 28
MediaBrowser.Providers/TV/TvdbExternalId.cs

@@ -1,28 +0,0 @@
-#pragma warning disable CS1591
-
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Providers.Plugins.TheTvdb;
-
-namespace MediaBrowser.Providers.TV
-{
-    public class TvdbExternalId : IExternalId
-    {
-        /// <inheritdoc />
-        public string ProviderName => "TheTVDB";
-
-        /// <inheritdoc />
-        public string Key => MetadataProvider.Tvdb.ToString();
-
-        /// <inheritdoc />
-        public ExternalIdMediaType? Type => null;
-
-        /// <inheritdoc />
-        public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=series&id={0}";
-
-        /// <inheritdoc />
-        public bool Supports(IHasProviderIds item) => item is Series;
-    }
-}

+ 0 - 28
MediaBrowser.Providers/TV/TvdbSeasonExternalId.cs

@@ -1,28 +0,0 @@
-#pragma warning disable CS1591
-
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
-using MediaBrowser.Providers.Plugins.TheTvdb;
-
-namespace MediaBrowser.Providers.TV
-{
-    public class TvdbSeasonExternalId : IExternalId
-    {
-        /// <inheritdoc />
-        public string ProviderName => "TheTVDB";
-
-        /// <inheritdoc />
-        public string Key => MetadataProvider.Tvdb.ToString();
-
-        /// <inheritdoc />
-        public ExternalIdMediaType? Type => ExternalIdMediaType.Season;
-
-        /// <inheritdoc />
-        public string UrlFormatString => null;
-
-        /// <inheritdoc />
-        public bool Supports(IHasProviderIds item) => item is Season;
-    }
-}

+ 0 - 1
MediaBrowser.Providers/TV/Zap2ItExternalId.cs

@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Providers;
-using MediaBrowser.Providers.Plugins.TheTvdb;
 
 namespace MediaBrowser.Providers.TV
 {