public void EpisodeMappings_MapsAllFields() { var seriesSource = new TvDbSeriesData(1, "SeriesName", new DateTime(2017, 1, 2, 3, 4, 5), "Network", 30, AirDay.Monday, "6am", 55.6f, new[] { "Alias" }, new[] { "Genre1", "Genre2", "Genre3", "Tag1", "Tag2" }, "Overview"); var source = new TvDbEpisodeData(3, "EpisodeName", 5, 2, 6, 123, new DateTime(2017, 4, 3, 12, 0, 2), "Overview", 5.23f, 23); var target = new MetadataResult <Episode> { Item = new Episode() }; var tvDbSourceMappingConfiguration = new TvDbSourceMappingConfiguration(); var mappings = tvDbSourceMappingConfiguration.GetEpisodeMappings(3, true, true, TitleType.Localized, "en").ToList(); mappings .All(m => m.CanApply(source, target) || m.CanApply(seriesSource, target)) .Should() .BeTrue(); mappings .Where(m => m.CanApply(source, target)) .Iter(m => m.Apply(source, target)); mappings .Where(m => m.CanApply(seriesSource, target)) .Iter(m => m.Apply(seriesSource, target)); target.Item.PremiereDate.Should().Be(new DateTime(2017, 4, 3, 12, 0, 2)); target.Item.Overview.Should().Be("Overview"); target.Item.CommunityRating.Should().Be(5.23f); target.Item.Genres.Should().BeEquivalentTo("Genre1", "Genre2", "Genre3"); target.Item.Tags.Should().BeEquivalentTo("Tag1", "Tag2"); }
public async Task GetEpisodesAsync_LocalEpisodeData_ReturnsLocalEpisodeData() { var episode = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 3.77f, 12); this.fileCache.GetFileContent(Arg.Any <TvDbSeriesEpisodesFileSpec>()) .Returns(new TvDbEpisodeCollection(new[] { episode })); var tvDbClient = new TvDbClientV2(this.jsonConnection, this.fileCache, this.applicationPaths, this.logManager, new JsonSerialiser(), new PluginConfiguration()); var episodes = await tvDbClient.GetEpisodesAsync(4); episodes.IsSome.Should().BeTrue(); episodes.ValueUnsafe().Should().BeEquivalentTo(new[] { episode }); }
public async Task GetEpisodesAsync_LocalEpisodeData_DoesNotRequestEpisodeData() { var episode = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 3.77f, 12); this.fileCache.GetFileContent(Arg.Any <TvDbSeriesEpisodesFileSpec>()) .Returns(new TvDbEpisodeCollection(new[] { episode })); var tvDbClient = new TvDbClientV2(this.jsonConnection, this.fileCache, this.applicationPaths, this.logManager, new JsonSerialiser(), new PluginConfiguration()); await tvDbClient.GetEpisodesAsync(4); await this.jsonConnection.DidNotReceiveWithAnyArgs() .GetAsync <GetEpisodesRequest.Response>(null, Option <string> .None); }
public async Task GetEpisodesAsync_MultiPageResponse_RequestsAllPages() { var page1Episode = new TvDbEpisodeSummaryData(1, "Test1", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page1EpisodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); var page2Episode = new TvDbEpisodeSummaryData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page2EpisodeDetail = new TvDbEpisodeData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); this.jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=1"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page1Episode }, new GetEpisodesRequest.PageLinks(1, 2, 2, Option <int> .None)))); this.jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("1")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page1EpisodeDetail))); this.jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=2"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page2Episode }, new GetEpisodesRequest.PageLinks(2, 2, Option <int> .None, 1)))); this.jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("2")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page2EpisodeDetail))); var tvDbClient = new TvDbClientV2(this.jsonConnection, this.fileCache, this.applicationPaths, this.logManager, new JsonSerialiser(), new PluginConfiguration()); await tvDbClient.GetEpisodesAsync(4); await this.jsonConnection.Received(1) .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=1"), Arg.Any <Option <string> >()); await this.jsonConnection.Received(1) .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=2"), Arg.Any <Option <string> >()); await this.jsonConnection.ReceivedWithAnyArgs(2) .GetAsync <GetEpisodeDetailsRequest.Response>(null, Option <string> .None); }
public void EpisodeMappings_DontMapEmptyFields() { var source = new TvDbEpisodeData(3, "EpisodeName", 5, 2, 6, 123, Option <DateTime> .None, null, 0, 23); var target = new MetadataResult <Episode> { Item = new Episode() }; var tvDbSourceMappingConfiguration = new TvDbSourceMappingConfiguration(); tvDbSourceMappingConfiguration.GetEpisodeMappings(0, false, false, TitleType.Localized, "en") .Where(m => !m.CanApply(source, target)) .Select(m => m.TargetPropertyName) .Should() .BeEquivalentTo(nameof(target.Item.PremiereDate), nameof(target.Item.Overview), nameof(target.Item.CommunityRating), nameof(target.Item.Genres), nameof(target.Item.Tags)); }
public async Task GetEpisodeAsync_NoLocalEpisodeData_ReturnsNewEpisodeData() { var episode = new TvDbEpisodeSummaryData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var episodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); this.jsonConnection.GetAsync(Arg.Any <GetEpisodesRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response(new[] { episode }, new GetEpisodesRequest.PageLinks(1, 1, Option <int> .None, Option <int> .None)))); this.jsonConnection.GetAsync(Arg.Any <GetEpisodeDetailsRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(episodeDetail))); var tvDbClient = new TvDbClientV2(this.jsonConnection, this.fileCache, this.applicationPaths, this.logManager, new JsonSerialiser(), new PluginConfiguration()); var episodes = await tvDbClient.GetEpisodesAsync(4); episodes.IsSome.Should().BeTrue(); episodes.ValueUnsafe().Should().BeEquivalentTo(new[] { episodeDetail }); }
public async Task GetEpisodeAsync_NoLocalEpisodeData_SavesNewEpisodeData() { var episode = new TvDbEpisodeSummaryData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var episodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); this.jsonConnection.GetAsync(Arg.Any <GetEpisodesRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response(new[] { episode }, new GetEpisodesRequest.PageLinks(1, 1, Option <int> .None, Option <int> .None)))); this.jsonConnection.GetAsync(Arg.Any <GetEpisodeDetailsRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(episodeDetail))); var tvDbClient = new TvDbClientV2(this.jsonConnection, this.fileCache, this.applicationPaths, this.logManager, new JsonSerialiser(), new PluginConfiguration()); await tvDbClient.GetEpisodesAsync(4); this.fileCache.Received(1) .SaveFile(Arg.Any <TvDbSeriesEpisodesFileSpec>(), Arg.Is <TvDbEpisodeCollection>(d => d.Episodes.Single() == episodeDetail)); }
public async Task GetEpisodeAsync_NoLocalEpisodeData_RequestsEpisodeData() { var episode = new TvDbEpisodeSummaryData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var episodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); _jsonConnection.GetAsync(Arg.Any <GetEpisodesRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response(new[] { episode }, new GetEpisodesRequest.PageLinks(1, 1, Option <int> .None, Option <int> .None)))); _jsonConnection.GetAsync(Arg.Any <GetEpisodeDetailsRequest>(), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(episodeDetail))); var tvDbClient = new TvDbClient(_jsonConnection, _fileCache, _applicationPaths, _logManager, new JsonSerialiser(), new PluginConfiguration()); await tvDbClient.GetEpisodesAsync(4); _jsonConnection.ReceivedWithAnyArgs(1) .GetAsync <GetEpisodesRequest.Response>(null, Option <string> .None); _jsonConnection.ReceivedWithAnyArgs(1) .GetAsync <GetEpisodeDetailsRequest.Response>(null, Option <string> .None); }
public async Task GetEpisodesAsync_MultiPageResponse_SavesAllPagesConcatenated() { var page1Episode = new TvDbEpisodeSummaryData(1, "Test1", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page1EpisodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); var page2Episode = new TvDbEpisodeSummaryData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page2EpisodeDetail = new TvDbEpisodeData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); _jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=1"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page1Episode }, new GetEpisodesRequest.PageLinks(1, 2, 2, Option <int> .None)))); _jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("1")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page1EpisodeDetail))); _jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=2"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page2Episode }, new GetEpisodesRequest.PageLinks(2, 2, Option <int> .None, 1)))); _jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("2")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page2EpisodeDetail))); var tvDbClient = new TvDbClient(_jsonConnection, _fileCache, _applicationPaths, _logManager, new JsonSerialiser(), new PluginConfiguration()); await tvDbClient.GetEpisodesAsync(4); _fileCache.Received(1) .SaveFile(Arg.Any <TvDbSeriesEpisodesFileSpec>(), Arg.Is <TvDbEpisodeCollection>(d => d.Episodes.SequenceEqual(new[] { page1EpisodeDetail, page2EpisodeDetail }))); }
public async Task GetEpisodesAsync_MultiPageResponse_ReturnsAllPagesConcatenated() { var page1Episode = new TvDbEpisodeSummaryData(1, "Test1", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page1EpisodeDetail = new TvDbEpisodeData(1, "Test", 1L, 2, 3, 4, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); var page2Episode = new TvDbEpisodeSummaryData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview"); var page2EpisodeDetail = new TvDbEpisodeData(2, "Test2", 5L, 6, 7, 8, new DateTime(2017, 1, 2, 3, 4, 5), "Overview", 33.4f, 12); _jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=1"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page1Episode }, new GetEpisodesRequest.PageLinks(1, 2, 2, Option <int> .None)))); _jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("1")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page1EpisodeDetail))); _jsonConnection .GetAsync(Arg.Is <GetEpisodesRequest>(r => r.Url == "https://api.thetvdb.com/series/4/episodes?page=2"), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodesRequest.Response>(new GetEpisodesRequest.Response( new[] { page2Episode }, new GetEpisodesRequest.PageLinks(2, 2, Option <int> .None, 1)))); _jsonConnection.GetAsync(Arg.Is <GetEpisodeDetailsRequest>(r => r.Url.EndsWith("2")), Arg.Any <Option <string> >()) .Returns(new Response <GetEpisodeDetailsRequest.Response>( new GetEpisodeDetailsRequest.Response(page2EpisodeDetail))); var tvDbClient = new TvDbClient(_jsonConnection, _fileCache, _applicationPaths, _logManager, new JsonSerialiser(), new PluginConfiguration()); var episodes = await tvDbClient.GetEpisodesAsync(4); episodes.IsSome.Should().BeTrue(); episodes.ValueUnsafe().Should().BeEquivalentTo(page1EpisodeDetail, page2EpisodeDetail); }
public void Setup() { this.tvDbClient = Substitute.For <ITvDbClient>(); this.aniDbClient = Substitute.For <IAniDbClient>(); this.tvDbEpisodeA = TestData.TvDbTestData.Episode(12, 48, 2); this.tvDbEpisodeB = TestData.TvDbTestData.Episode(45, 7, 2); this.aniDbEpisodeA = new AniDbEpisodeData { RawEpisodeNumber = new EpisodeNumberData { RawNumber = "44", RawType = 1 } }; this.aniDbEpisodeB = new AniDbEpisodeData { RawEpisodeNumber = new EpisodeNumberData { RawNumber = "23", RawType = 1 } }; this.tvDbClient.GetEpisodesAsync(123) .Returns(Option <List <TvDbEpisodeData> > .Some(new List <TvDbEpisodeData> { this.tvDbEpisodeA, this.tvDbEpisodeB })); this.aniDbClient.GetSeriesAsync(77) .Returns(Option <AniDbSeriesData> .Some(new AniDbSeriesData { Episodes = new[] { this.aniDbEpisodeA, this.aniDbEpisodeB } })); this.mapper = new GroupMappingEpisodeMapper(this.tvDbClient, this.aniDbClient, new ConsoleLogManager()); }
public Response(TvDbEpisodeData data) { Data = data; }
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}'")); })); }
private ISourceData CreateSourceData(TvDbEpisodeData e) { return(new SourceData <TvDbEpisodeData>(this.sources.TvDb, e.Id, new ItemIdentifier(e.AiredEpisodeNumber, e.AiredSeason, e.EpisodeName), e)); }
private void SetUpEpisodeMapping(AniDbEpisodeData from, TvDbEpisodeData to, ISeriesMapping seriesMapping) { _episodeMapper .MapAniDbEpisodeAsync(from.EpisodeNumber.Number, seriesMapping, Option <EpisodeGroupMapping> .None) .Returns(to); }