public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo info, CancellationToken cancellationToken)
        {
            var result = new MetadataResult <Episode>();

            var id = info.ProviderIds.GetValueOrDefault("Kitsu");

            if (string.IsNullOrWhiteSpace(id))
            {
                return(result);
            }

            var episodeInfo = await KitsuIoApi.Get_Episode(id, _httpClientFactory);

            result.HasMetadata = true;
            result.Item        = new Episode
            {
                IndexNumber       = info.IndexNumber,
                ParentIndexNumber = info.ParentIndexNumber,
                Name = episodeInfo.Data.Attributes.Titles.GetTitle,
            };

            if (episodeInfo.Data.Attributes.Length != null)
            {
                result.Item.RunTimeTicks = TimeSpan.FromMinutes(episodeInfo.Data.Attributes.Length.Value).Ticks;
            }

            return(result);
        }
        public async Task <MetadataResult <MediaBrowser.Controller.Entities.TV.Series> > GetMetadata(SeriesInfo info, CancellationToken cancellationToken)
        {
            var result = new MetadataResult <MediaBrowser.Controller.Entities.TV.Series>();

            var kitsuId = info.ProviderIds.GetOrDefault(ProviderNames.KitsuIo);

            if (string.IsNullOrEmpty(kitsuId))
            {
                _log.LogInformation("Start KitsuIo... Searching({Name})", info.Name);
                var filters     = GetFiltersFromSeriesInfo(info);
                var apiResponse = await KitsuIoApi.Search_Series(filters);

                kitsuId = apiResponse.Data.FirstOrDefault(x => x.Attributes.Titles.Equal(info.Name))?.Id.ToString();
            }

            if (!string.IsNullOrEmpty(kitsuId))
            {
                var seriesInfo = await KitsuIoApi.Get_Series(kitsuId);

                result.HasMetadata = true;
                result.Item        = new MediaBrowser.Controller.Entities.TV.Series
                {
                    Overview = seriesInfo.Data.Attributes.Synopsis,
                    // KitsuIO has a max rating of 100
                    CommunityRating = string.IsNullOrWhiteSpace(seriesInfo.Data.Attributes.AverageRating)
                        ? null
                        : (float?)float.Parse(seriesInfo.Data.Attributes.AverageRating, System.Globalization.CultureInfo.InvariantCulture) / 10,
                    ProviderIds = new Dictionary <string, string>()
                    {
                        { ProviderNames.KitsuIo, kitsuId }
                    },
                    Genres = seriesInfo.Included?.Select(x => x.Attributes.Name).ToArray()
                             ?? Array.Empty <string>()
                };
                GenreHelper.CleanupGenres(result.Item);
                StoreImageUrl(kitsuId, seriesInfo.Data.Attributes.PosterImage.Original.ToString(), "image");
            }

            return(result);
        }
        public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
        {
            var filters       = GetFiltersFromSeriesInfo(searchInfo);
            var searchResults = await KitsuIoApi.Search_Series(filters);

            var results = new List <RemoteSearchResult>();

            foreach (var series in searchResults.Data)
            {
                var parsedSeries = new RemoteSearchResult
                {
                    Name = series.Attributes.Titles.GetTitle,
                    SearchProviderName = Name,
                    ImageUrl           = series.Attributes.PosterImage.Medium.ToString(),
                    Overview           = series.Attributes.Synopsis,
                    ProductionYear     = series.Attributes.StartDate?.Year,
                    PremiereDate       = series.Attributes.StartDate?.DateTime,
                };
                parsedSeries.SetProviderId(ProviderNames.KitsuIo, series.Id.ToString());
                results.Add(parsedSeries);
            }

            return(results);
        }
        public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
        {
            var id = searchInfo.ProviderIds.GetValueOrDefault("Kitsu");

            if (string.IsNullOrWhiteSpace(id))
            {
                return(new List <RemoteSearchResult>());;
            }

            var apiResponse = await KitsuIoApi.Get_Episodes(id, _httpClientFactory);

            return(apiResponse.Data.Select(x => new RemoteSearchResult
            {
                IndexNumber = x.Attributes.Number,
                Name = x.Attributes.Titles.GetTitle,
                ParentIndexNumber = x.Attributes.SeasonNumber,
                PremiereDate = x.Attributes.AirDate,
                ProviderIds = new Dictionary <string, string> {
                    { "Kitsu", x.Id.ToString() }
                },
                SearchProviderName = Name,
                Overview = x.Attributes.Synopsis,
            }));
        }