diff --git a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs index cd3bfc3b1..f441496cd 100644 --- a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs +++ b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs @@ -135,5 +135,50 @@ public void should_update_if_tvdb_id_changed() ExceptionVerification.ExpectedWarns(1); } + + [Test] + public void should_not_throw_if_duplicate_season_is_in_existing_info() + { + var newSeriesInfo = _series.JsonClone(); + newSeriesInfo.Seasons.Add(Builder.CreateNew() + .With(s => s.SeasonNumber = 2) + .Build()); + + _series.Seasons.Add(Builder.CreateNew() + .With(s => s.SeasonNumber = 2) + .Build()); + + _series.Seasons.Add(Builder.CreateNew() + .With(s => s.SeasonNumber = 2) + .Build()); + + GivenNewSeriesInfo(newSeriesInfo); + + Subject.Execute(new RefreshSeriesCommand(_series.Id)); + + Mocker.GetMock() + .Verify(v => v.UpdateSeries(It.Is(s => s.Seasons.Count == 2))); + } + + [Test] + public void should_filter_duplicate_seasons() + { + var newSeriesInfo = _series.JsonClone(); + newSeriesInfo.Seasons.Add(Builder.CreateNew() + .With(s => s.SeasonNumber = 2) + .Build()); + + newSeriesInfo.Seasons.Add(Builder.CreateNew() + .With(s => s.SeasonNumber = 2) + .Build()); + + GivenNewSeriesInfo(newSeriesInfo); + + Subject.Execute(new RefreshSeriesCommand(_series.Id)); + + Mocker.GetMock() + .Verify(v => v.UpdateSeries(It.Is(s => s.Seasons.Count == 2))); + + } } } diff --git a/src/NzbDrone.Core/Tv/RefreshSeriesService.cs b/src/NzbDrone.Core/Tv/RefreshSeriesService.cs index 983cd4b9b..c39deeffb 100644 --- a/src/NzbDrone.Core/Tv/RefreshSeriesService.cs +++ b/src/NzbDrone.Core/Tv/RefreshSeriesService.cs @@ -116,9 +116,11 @@ private void RefreshSeriesInfo(Series series) private List UpdateSeasons(Series series, Series seriesInfo) { - foreach (var season in seriesInfo.Seasons) + var seasons = seriesInfo.Seasons.DistinctBy(s => s.SeasonNumber).ToList(); + + foreach (var season in seasons) { - var existingSeason = series.Seasons.SingleOrDefault(s => s.SeasonNumber == season.SeasonNumber); + var existingSeason = series.Seasons.FirstOrDefault(s => s.SeasonNumber == season.SeasonNumber); //Todo: Should this should use the previous season's monitored state? if (existingSeason == null) @@ -139,7 +141,7 @@ private List UpdateSeasons(Series series, Series seriesInfo) } } - return seriesInfo.Seasons; + return seasons; } public void Execute(RefreshSeriesCommand message)