Beispiel #1
0
 private Task <Either <ProcessFailedResult, AniListSeriesData> > FindSingleMatchingSeries(string title,
                                                                                          ProcessResultContext resultContext)
 {
     return(this.aniListClient.FindSeriesAsync(title, resultContext)
            .BindAsync(aniListSeriesData => FailUnlessOneResult(aniListSeriesData, resultContext)));
 }
 public Task <Either <FailedRequest, string> > GetToken(IJsonConnection jsonConnection,
                                                        IAnilistConfiguration anilistConfiguration, ProcessResultContext resultContext)
 {
     return(anilistConfiguration.AccessToken.MapAsync(Right <FailedRequest, string>)
            .IfNone(() => GetTokenFromCacheOrRequest(jsonConnection, anilistConfiguration)));
 }
Beispiel #3
0
 private Either <ProcessFailedResult, ISourceData> CreateSourceDataWithTitle(IMediaItem mediaItem,
                                                                             AniListSeriesData seriesData, ProcessResultContext resultContext)
 {
     return(this.sources.AniList.SelectTitle(seriesData.Title, mediaItem.EmbyData.Language, resultContext)
            .Map(t => this.CreateSourceData(seriesData, t)));
 }
Beispiel #4
0
 public Task <Either <ProcessFailedResult, AniDbSeriesData> > GetSeriesData(int aniDbSeriesId,
                                                                            ProcessResultContext resultContext)
 {
     return(this.aniDbClient.GetSeriesAsync(aniDbSeriesId)
            .ToEitherAsync(resultContext.Failed($"Failed to load series with AniDb Id '{aniDbSeriesId}'")));
 }
Beispiel #5
0
        private Task <Either <ProcessFailedResult, AniDbEpisodeData> > MapEpisodeDataAsync(int aniDbSeriesId,
                                                                                           TvDbSeriesData tvDbSeriesData, TvDbEpisodeData tvDbEpisodeData, ProcessResultContext resultContext)
        {
            var seriesMapping = this.mappingList.GetSeriesMappingsFromTvDb(tvDbSeriesData.Id, resultContext)
                                .BindAsync(sm => sm.Where(m => m.Ids.AniDbSeriesId == aniDbSeriesId)
                                           .Match(
                                               () => resultContext.Failed(
                                                   $"No series mapping between TvDb series Id '{tvDbSeriesData.Id}' and AniDb series id '{aniDbSeriesId}'"),
                                               Prelude.Right <ProcessFailedResult, ISeriesMapping>,
                                               (head, tail) =>
                                               resultContext.Failed(
                                                   $"Multiple series mappings found between TvDb series Id '{tvDbSeriesData.Id}' and AniDb series Id '{aniDbSeriesId}'")));

            return(seriesMapping.BindAsync(sm =>
            {
                var episodeGroupMapping = sm.GetEpisodeGroupMapping(tvDbEpisodeData.AiredEpisodeNumber,
                                                                    tvDbEpisodeData.AiredSeason);

                var aniDbEpisodeData = this.episodeMapper.MapTvDbEpisodeAsync(tvDbEpisodeData.AiredEpisodeNumber,
                                                                              sm, episodeGroupMapping);

                return aniDbEpisodeData.ToEither(resultContext.Failed(
                                                     $"Failed to find a corresponding AniDb episode in AniDb series id '{aniDbSeriesId}'"));
            }));
        }
 public Either <ProcessFailedResult, string> SelectTitle(AniListTitleData titleData,
                                                         string metadataLanguage, ProcessResultContext resultContext)
 {
     return(this.aniListNameSelector
            .SelectTitle(titleData, this.titlePreferenceConfiguration.TitlePreference, metadataLanguage)
            .ToEither(resultContext.Failed("Failed to find a title")));
 }
Beispiel #7
0
 public Either <ProcessFailedResult, string> SelectTitle(IEnumerable <ItemTitleData> titles,
                                                         string metadataLanguage, ProcessResultContext resultContext)
 {
     return(this.titleSelector.SelectTitle(titles, this.titlePreferenceConfiguration.TitlePreference, metadataLanguage)
            .Map(t => t.Title)
            .ToEither(resultContext.Failed("Failed to find a title")));
 }
Beispiel #8
0
        private Task <Either <ProcessFailedResult, TvDbEpisodeData> > MapEpisodeDataAsync(AniDbSeriesData aniDbSeriesData,
                                                                                          AniDbEpisodeData aniDbEpisodeData, ProcessResultContext resultContext)
        {
            var seriesMapping = _mappingList.GetSeriesMappingFromAniDb(aniDbSeriesData.Id, resultContext);

            return(seriesMapping.BindAsync(sm =>
            {
                var episodeGroupMapping = sm.GetEpisodeGroupMapping(aniDbEpisodeData.EpisodeNumber);

                var tvDbEpisodeData = _episodeMapper.MapAniDbEpisodeAsync(aniDbEpisodeData.EpisodeNumber.Number,
                                                                          sm, episodeGroupMapping);

                return tvDbEpisodeData.Match(
                    d => Right <ProcessFailedResult, TvDbEpisodeData>(d),
                    () => resultContext.Failed("Found a series mapping but failed to map the episode to TvDb"));
            }));
        }
Beispiel #9
0
        public Task <Either <ProcessFailedResult, IEnumerable <AniListSeriesData> > > FindSeriesAsync(string title,
                                                                                                      ProcessResultContext resultContext)
        {
            var token = _aniListToken.GetToken(_jsonConnection, _anilistConfiguration, resultContext);

            var request = new FindSeriesRequest(title);

            return(token.Map(e => e.MapLeft(FailedRequest.ToFailedResult(resultContext)))
                   .BindAsync(t =>
            {
                return _jsonConnection.PostAsync(request, t)
                .MapAsync(r => r.Data.Data.Page.Media)
                .Map(e => e.MapLeft(FailedRequest.ToFailedResult(resultContext)));
            }));
        }
        private Task <Either <ProcessFailedResult, TvDbEpisodeData> > FindEpisode(IEnumerable <TvDbEpisodeData> episodes,
                                                                                  string title, Option <int> episodeIndex, Option <int> seasonIndex, ProcessResultContext resultContext)
        {
            var normalisedTitle = this.titleNormaliser.GetNormalisedTitle(title);

            var episodeByIndexes = episodeIndex.Bind(i =>
                                                     seasonIndex.Bind(si => episodes.Find(e => e.AiredEpisodeNumber == i && e.AiredSeason == si))
                                                     .Match(e => e, () => episodes.Find(e => e.AiredEpisodeNumber == i && e.AiredSeason == 1)));

            return(episodeByIndexes.Match(Right <ProcessFailedResult, TvDbEpisodeData>,
                                          () => Option <TvDbEpisodeData>
                                          .Some(episodes.FirstOrDefault(e =>
                                                                        this.titleNormaliser.GetNormalisedTitle(e.EpisodeName) == normalisedTitle))
                                          .ToEither(resultContext.Failed(
                                                        $"Failed to find TvDb episode")))
                   .AsTask());
        }
Beispiel #11
0
 public static Func <FailedRequest, ProcessFailedResult> ToFailedResult(ProcessResultContext resultContext)
 {
     return(r => resultContext.Failed($"Request failed with {r.StatusCode}: {r.ResponseContent}"));
 }
Beispiel #12
0
        public Task <Either <ProcessFailedResult, ISeriesMapping> > GetSeriesMappingFromAniDb(int aniDbSeriesId,
                                                                                              ProcessResultContext resultContext)
        {
            return(_mappingListTaskLazy.Value
                   .Map(seriesMappings => seriesMappings.Where(m => m.Ids.AniDbSeriesId == aniDbSeriesId).ToList())
                   .Map(matchingSeriesMappings =>
            {
                switch (matchingSeriesMappings.Count)
                {
                case 0:
                    return Left <ProcessFailedResult, ISeriesMapping>(
                        resultContext.Failed($"No series mapping for AniDb series Id '{aniDbSeriesId}'"));

                case 1:
                    return Right <ProcessFailedResult, ISeriesMapping>(matchingSeriesMappings.Single());

                default:
                    return Left <ProcessFailedResult, ISeriesMapping>(
                        resultContext.Failed(
                            $"Multiple series mappings match AniDb series Id '{aniDbSeriesId}'"));
                }
            }));
        }
 public Task <Either <ProcessFailedResult, TvDbSeriesData> > GetSeriesData(int tvDbSeriesId,
                                                                           ProcessResultContext resultContext)
 {
     return(_tvDbClient.GetSeriesAsync(tvDbSeriesId)
            .ToEitherAsync(resultContext.Failed($"Failed to load parent series with TvDb Id '{tvDbSeriesId}'")));
 }
        public async Task <Either <ProcessFailedResult, ISeriesMapping> > GetSeriesMappingFromAniDb(int aniDbSeriesId,
                                                                                                    ProcessResultContext resultContext)
        {
            var result = await this.mappingListTaskLazy.Value
                         .Map(seriesMappings => seriesMappings.Where(m => m.Ids.AniDbSeriesId == aniDbSeriesId).ToList())
                         .Map(matchingSeriesMappings =>
            {
                switch (matchingSeriesMappings.Count)
                {
                case 0:
                    return(GetFallbackSeriesMappingFromAniDb(aniDbSeriesId, resultContext).GetAwaiter().GetResult());

                case 1:
                    return(Right <ProcessFailedResult, ISeriesMapping>(matchingSeriesMappings.Single()));

                default:
                    return(GetFallbackSeriesMappingFromAniDb(aniDbSeriesId, resultContext).GetAwaiter().GetResult());
                }
            });


            return(result);
        }
        private async Task <Either <ProcessFailedResult, IEnumerable <ISeriesMapping> > > GetFallbackSeriesMappingFromTvDb(int tvDbSeriesId,
                                                                                                                           ProcessResultContext resultContext)
        {
            return(await this.xemTvDbMappingListTaskLazy.Value
                   .Map(seriesMappings => seriesMappings.Where(m => m.Ids.TvDbSeriesId == tvDbSeriesId).ToList())
                   .Map(matchingSeriesMappings =>
            {
                switch (matchingSeriesMappings.Count)
                {
                case 0:
                    return Left <ProcessFailedResult, IEnumerable <ISeriesMapping> >(
                        resultContext.Failed($"No series mapping for TvDb series Id '{tvDbSeriesId}'"));

                case 1:
                    return Right <ProcessFailedResult, IEnumerable <ISeriesMapping> >(matchingSeriesMappings);

                default:
                    return Left <ProcessFailedResult, IEnumerable <ISeriesMapping> >(
                        resultContext.Failed(
                            $"Multiple series mappings match TvDb series Id '{tvDbSeriesId}'"));
                }
            }));
        }
Beispiel #16
0
        private Task <Either <ProcessFailedResult, int> > MapSeriesDataAsync(int tvDbSeriesId, IdentifierOnlySourceData identifierData, ProcessResultContext resultContext)
        {
            var seriesMapping = this.mappingList.GetSeriesMappingsFromTvDb(tvDbSeriesId, resultContext)
                                .BindAsync(sm => sm.Where(m => m.DefaultTvDbSeason.Exists(s => s.Index == identifierData.Identifier.Index))
                                           .Match(
                                               () => resultContext.Failed(
                                                   $"No series mapping between TvDb series Id '{tvDbSeriesId}', season '{identifierData.Identifier.Index}'' and AniDb series"),
                                               Prelude.Right <ProcessFailedResult, ISeriesMapping>,
                                               (head, tail) =>
                                               resultContext.Failed(
                                                   $"Multiple series mappings found between TvDb series Id '{tvDbSeriesId}', season '{identifierData.Identifier.Index}'' and AniDb series")));

            return(seriesMapping.MapAsync(sm => sm.Ids.AniDbSeriesId));
        }