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 keyTypes     = new[] { KeyType.Poster, KeyType.Series, KeyType.Fanart };
            var tvdbId       = Convert.ToInt32(item.GetProviderId(MetadataProviders.Tvdb));

            foreach (KeyType keyType in keyTypes)
            {
                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);
        }
        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))
            {
                var seriesProviderIds = series.ProviderIds;
                var seasonNumber      = season.IndexNumber.Value;

                var seriesDataPath = await TvdbSeriesProvider.Current.EnsureSeriesInfo(seriesProviderIds, series.Name, series.ProductionYear, series.GetPreferredMetadataLanguage(), cancellationToken).ConfigureAwait(false);

                if (!string.IsNullOrEmpty(seriesDataPath))
                {
                    var path = Path.Combine(seriesDataPath, "banners.xml");

                    try
                    {
                        return(GetImages(path, item.GetPreferredMetadataLanguage(), seasonNumber, _xmlSettings, _fileSystem, cancellationToken));
                    }
                    catch (FileNotFoundException)
                    {
                        // No tvdb data yet. Don't blow up
                    }
                    catch (IOException)
                    {
                        // No tvdb data yet. Don't blow up
                    }
                }
            }

            return(new RemoteImageInfo[] { });
        }
Exemple #3
0
        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 async Task <IEnumerable <RemoteImageInfo> > GetImages(BaseItem item, CancellationToken cancellationToken)
        {
            if (TvdbSeriesProvider.IsValidSeries(item.ProviderIds))
            {
                var language = item.GetPreferredMetadataLanguage();

                var seriesDataPath = await TvdbSeriesProvider.Current.EnsureSeriesInfo(item.ProviderIds, item.Name, item.ProductionYear, language, cancellationToken).ConfigureAwait(false);

                if (string.IsNullOrEmpty(seriesDataPath))
                {
                    return(new RemoteImageInfo[] { });
                }

                var path = Path.Combine(seriesDataPath, "banners.xml");

                try
                {
                    return(GetImages(path, language, cancellationToken));
                }
                catch (FileNotFoundException)
                {
                    // No tvdb data yet. Don't blow up
                }
                catch (IOException)
                {
                    // No tvdb data yet. Don't blow up
                }
            }

            return(new RemoteImageInfo[] { });
        }
Exemple #5
0
        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))
            {
                var episodeTvdbId = episode.GetProviderId(MetadataProviders.Tvdb);

                // Process images
                try
                {
                    if (string.IsNullOrEmpty(episodeTvdbId))
                    {
                        var episodeInfo = new EpisodeInfo
                        {
                            IndexNumber       = episode.IndexNumber.Value,
                            ParentIndexNumber = episode.ParentIndexNumber.Value,
                            SeriesProviderIds = series.ProviderIds
                        };
                        episodeTvdbId = await _tvDbClientManager
                                        .GetEpisodeTvdbId(episodeInfo, language, cancellationToken).ConfigureAwait(false);

                        if (string.IsNullOrEmpty(episodeTvdbId))
                        {
                            _logger.LogError("Episode {SeasonNumber}x{EpisodeNumber} not found for series {SeriesTvdbId}",
                                             episodeInfo.ParentIndexNumber, episodeInfo.IndexNumber, series.GetProviderId(MetadataProviders.Tvdb));
                            return(imageResult);
                        }
                    }

                    var episodeResult =
                        await _tvDbClientManager
                        .GetEpisodesAsync(Convert.ToInt32(episodeTvdbId), 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 {TvDbId}", episodeTvdbId);
                }
            }

            return(imageResult);
        }
        public Task <IEnumerable <RemoteSearchResult> > GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
        {
            var list = new List <RemoteSearchResult>();

            // The search query must either provide an episode number or date
            if (!searchInfo.IndexNumber.HasValue && !searchInfo.PremiereDate.HasValue)
            {
                return(Task.FromResult((IEnumerable <RemoteSearchResult>)list));
            }

            if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds))
            {
                var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, searchInfo.SeriesProviderIds);

                try
                {
                    var metadataResult = FetchEpisodeData(searchInfo, seriesDataPath, cancellationToken);

                    if (metadataResult.HasMetadata)
                    {
                        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
                        });
                    }
                }
                catch (FileNotFoundException)
                {
                    // Don't fail the provider because this will just keep on going and going.
                }
                catch (IOException)
                {
                    // Don't fail the provider because this will just keep on going and going.
                }
            }

            return(Task.FromResult((IEnumerable <RemoteSearchResult>)list));
        }
        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))
            {
                var tvdbId = searchInfo.GetProviderId(MetadataProviders.Tvdb);
                try
                {
                    if (string.IsNullOrEmpty(tvdbId))
                    {
                        tvdbId = await _tvDbClientManager
                                 .GetEpisodeTvdbId(searchInfo, searchInfo.MetadataLanguage, cancellationToken)
                                 .ConfigureAwait(false);

                        if (string.IsNullOrEmpty(tvdbId))
                        {
                            _logger.LogError("Episode {SeasonNumber}x{EpisodeNumber} not found for series {SeriesTvdbId}",
                                             searchInfo.ParentIndexNumber, searchInfo.IndexNumber, tvdbId);
                            return(result);
                        }
                    }

                    var episodeResult = await _tvDbClientManager.GetEpisodesAsync(
                        Convert.ToInt32(tvdbId), searchInfo.MetadataLanguage,
                        cancellationToken).ConfigureAwait(false);

                    result = MapEpisodeToResult(searchInfo, episodeResult.Data);
                }
                catch (TvDbServerException e)
                {
                    _logger.LogError(e, "Failed to retrieve episode with id {TvDbId}", tvdbId);
                }
            }
            else
            {
                _logger.LogDebug("No series identity found for {EpisodeName}", searchInfo.Name);
            }

            return(result);
        }
Exemple #8
0
        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);
        }
        public Task <IEnumerable <RemoteImageInfo> > GetImages(BaseItem item, CancellationToken cancellationToken)
        {
            var episode = (Episode)item;
            var series  = episode.Series;

            if (series != null && TvdbSeriesProvider.IsValidSeries(series.ProviderIds))
            {
                // Process images
                var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, series.ProviderIds);

                var nodes = TvdbEpisodeProvider.Current.GetEpisodeXmlNodes(seriesDataPath, episode.GetLookupInfo());

                var result = nodes.Select(i => GetImageInfo(i, cancellationToken))
                             .Where(i => i != null)
                             .ToList();

                return(Task.FromResult <IEnumerable <RemoteImageInfo> >(result));
            }

            return(Task.FromResult <IEnumerable <RemoteImageInfo> >(new RemoteImageInfo[] { }));
        }
        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(new RemoteImageInfo[] { });
            }

            var tvdbId       = Convert.ToInt32(series.GetProviderId(MetadataProviders.Tvdb));
            var seasonNumber = season.IndexNumber.Value;
            var language     = item.GetPreferredMetadataLanguage();
            var remoteImages = new List <RemoteImageInfo>();

            var keyTypes = new[] { KeyType.Season, KeyType.Seasonwide, KeyType.Fanart };

            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);
        }
        public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo searchInfo, CancellationToken cancellationToken)
        {
            var result = new MetadataResult <Episode>();

            result.QueriedById = true;

            if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds) &&
                (searchInfo.IndexNumber.HasValue || searchInfo.PremiereDate.HasValue))
            {
                var seriesDataPath = await TvdbSeriesProvider.Current.EnsureSeriesInfo(searchInfo.SeriesProviderIds, null, null, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false);

                if (string.IsNullOrEmpty(seriesDataPath))
                {
                    return(result);
                }

                try
                {
                    result = FetchEpisodeData(searchInfo, seriesDataPath, cancellationToken);
                }
                catch (FileNotFoundException)
                {
                    // Don't fail the provider because this will just keep on going and going.
                }
                catch (IOException)
                {
                    // Don't fail the provider because this will just keep on going and going.
                }
            }
            else
            {
                _logger.LogDebug("No series identity found for {0}", searchInfo.Name);
            }

            return(result);
        }
        public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
        {
            var list = new List <RemoteSearchResult>();

            // The search query must either provide an episode number or date
            if (!searchInfo.IndexNumber.HasValue || !searchInfo.PremiereDate.HasValue)
            {
                return(list);
            }

            if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds))
            {
                try
                {
                    var episodeTvdbId = searchInfo.GetProviderId(MetadataProviders.Tvdb);
                    if (string.IsNullOrEmpty(episodeTvdbId))
                    {
                        searchInfo.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(),
                                                                 out var seriesTvdbId);
                        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(list);
                        }
                    }

                    var episodeResult = await _tvDbClientManager.GetEpisodesAsync(Convert.ToInt32(episodeTvdbId),
                                                                                  searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false);

                    var metadataResult = MapEpisodeToResult(searchInfo, episodeResult.Data);

                    if (metadataResult.HasMetadata)
                    {
                        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
                        });
                    }
                }
                catch (TvDbServerException e)
                {
                    _logger.LogError(e, "Failed to retrieve episode with id {TvDbId}", searchInfo.IndexNumber);
                }
            }

            return(list);
        }