From 7991a3f1c3badda123d70c744994f6f34f7765a8 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Tue, 11 Aug 2015 22:03:28 +0200 Subject: [PATCH] Fixed series refresh repeated too often if Sonarr is killed before Scheduled task finishes. Fixes #735 --- .../TvTests/ShouldRefreshSeriesFixture.cs | 142 ++++++++++++------ src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs | 20 ++- 2 files changed, 108 insertions(+), 54 deletions(-) diff --git a/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs b/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs index d0876b3aa..ac793077b 100644 --- a/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs +++ b/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs @@ -17,55 +17,9 @@ namespace NzbDrone.Core.Test.TvTests public void Setup() { _series = Builder.CreateNew() + .With(v => v.Status == SeriesStatusType.Continuing) .Build(); - } - private void GivenSeriesIsEnded() - { - _series.Status = SeriesStatusType.Ended; - } - - private void GivenSeriesLastRefreshedRecently() - { - _series.LastInfoSync = DateTime.UtcNow.AddDays(-1); - } - - [Test] - public void should_return_true_if_series_is_continuing() - { - _series.Status = SeriesStatusType.Continuing; - - Subject.ShouldRefresh(_series).Should().BeTrue(); - } - - [Test] - public void should_return_true_if_series_last_refreshed_more_than_30_days_ago() - { - GivenSeriesIsEnded(); - _series.LastInfoSync = DateTime.UtcNow.AddDays(-100); - - Subject.ShouldRefresh(_series).Should().BeTrue(); - } - - [Test] - public void should_should_return_true_if_episode_aired_in_last_30_days() - { - Mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(_series.Id)) - .Returns(Builder.CreateListOfSize(2) - .TheFirst(1) - .With(e => e.AirDateUtc = DateTime.Today.AddDays(-7)) - .TheLast(1) - .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) - .Build() - .ToList()); - - Subject.ShouldRefresh(_series).Should().BeTrue(); - } - - [Test] - public void should_should_return_false_when_recently_refreshed_ended_show_has_not_aired_for_30_days() - { Mocker.GetMock() .Setup(s => s.GetEpisodeBySeries(_series.Id)) .Returns(Builder.CreateListOfSize(2) @@ -73,8 +27,102 @@ namespace NzbDrone.Core.Test.TvTests .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) .Build() .ToList()); + } + + private void GivenSeriesIsEnded() + { + _series.Status = SeriesStatusType.Ended; + } + + private void GivenSeriesLastRefreshedMonthsAgo() + { + _series.LastInfoSync = DateTime.UtcNow.AddDays(-90); + } + + private void GivenSeriesLastRefreshedYesterday() + { + _series.LastInfoSync = DateTime.UtcNow.AddDays(-1); + } + + private void GivenSeriesLastRefreshedRecently() + { + _series.LastInfoSync = DateTime.UtcNow.AddHours(-1); + } + + private void GivenRecentlyAired() + { + Mocker.GetMock() + .Setup(s => s.GetEpisodeBySeries(_series.Id)) + .Returns(Builder.CreateListOfSize(2) + .TheFirst(1) + .With(e => e.AirDateUtc = DateTime.Today.AddDays(-7)) + .TheLast(1) + .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) + .Build() + .ToList()); + } + + [Test] + public void should_return_true_if_running_series_last_refreshed_more_than_6_hours_ago() + { + Subject.ShouldRefresh(_series).Should().BeTrue(); + } + + [Test] + public void should_return_false_if_running_series_last_refreshed_less_than_6_hours_ago() + { + GivenSeriesLastRefreshedRecently(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + + [Test] + public void should_return_false_if_ended_series_last_refreshed_yesterday() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + + [Test] + public void should_return_true_if_series_last_refreshed_more_than_30_days_ago() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedMonthsAgo(); Subject.ShouldRefresh(_series).Should().BeTrue(); } + + [Test] + public void should_return_true_if_episode_aired_in_last_30_days() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); + + GivenRecentlyAired(); + + Subject.ShouldRefresh(_series).Should().BeTrue(); + } + + [Test] + public void should_return_false_when_recently_refreshed_ended_show_has_not_aired_for_30_days() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + + [Test] + public void should_return_false_when_recently_refreshed_ended_show_aired_in_last_30_days() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedRecently(); + + GivenRecentlyAired(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs b/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs index a052935b4..bbf48cbb8 100644 --- a/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs +++ b/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs @@ -22,18 +22,24 @@ namespace NzbDrone.Core.Tv public bool ShouldRefresh(Series series) { - if (series.Status == SeriesStatusType.Continuing) - { - _logger.Trace("Series {0} is continuing, should refresh.", series.Title); - return true; - } - if (series.LastInfoSync < DateTime.UtcNow.AddDays(-30)) { _logger.Trace("Series {0} last updated more than 30 days ago, should refresh.", series.Title); return true; } + if (series.LastInfoSync >= DateTime.UtcNow.AddHours(-6)) + { + _logger.Trace("Series {0} last updated less than 6 hours ago, should not be refreshed.", series.Title); + return false; + } + + if (series.Status == SeriesStatusType.Continuing) + { + _logger.Trace("Series {0} is continuing, should refresh.", series.Title); + return true; + } + var lastEpisode = _episodeService.GetEpisodeBySeries(series.Id).OrderByDescending(e => e.AirDateUtc).FirstOrDefault(); if (lastEpisode != null && lastEpisode.AirDateUtc > DateTime.UtcNow.AddDays(-30)) @@ -42,7 +48,7 @@ namespace NzbDrone.Core.Tv return true; } - _logger.Trace("Series {0} should not be refreshed.", series.Title); + _logger.Trace("Series {0} ended long ago, should not be refreshed.", series.Title); return false; } }