1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-11-04 10:02:40 +01:00

Cleanup/fix EpisodeMonitoredService

Fixed: Unmonitor episodes when the season is unmonitored when adding the series
Fixes #1852
This commit is contained in:
Mark McDowall 2017-05-23 22:04:56 -07:00
parent 6bbe4ce066
commit 5aa02eb15c
No known key found for this signature in database
GPG Key ID: D4CEFA9A718052E0
2 changed files with 49 additions and 21 deletions

View File

@ -194,6 +194,46 @@ public void should_ignore_episodes_when_season_is_not_monitored()
.Verify(v => v.UpdateEpisodes(It.Is<List<Episode>>(l => l.All(e => !e.Monitored)))); .Verify(v => v.UpdateEpisodes(It.Is<List<Episode>>(l => l.All(e => !e.Monitored))));
} }
[Test]
public void should_should_not_monitor_episodes_if_season_is_not_monitored()
{
_series = Builder<Series>.CreateNew()
.With(s => s.Seasons = Builder<Season>.CreateListOfSize(2)
.TheFirst(1)
.With(n => n.Monitored = true)
.TheLast(1)
.With(n => n.Monitored = false)
.Build()
.ToList())
.Build();
var episodes = Builder<Episode>.CreateListOfSize(10)
.All()
.With(e => e.Monitored = true)
.With(e => e.EpisodeFileId = 0)
.With(e => e.AirDateUtc = DateTime.UtcNow.AddDays(-7))
.TheFirst(5)
.With(e => e.SeasonNumber = 1)
.TheLast(5)
.With(e => e.SeasonNumber = 2)
.BuildList();
Mocker.GetMock<IEpisodeService>()
.Setup(s => s.GetEpisodeBySeries(It.IsAny<int>()))
.Returns(episodes);
Subject.SetEpisodeMonitoredStatus(_series, new MonitoringOptions
{
IgnoreEpisodesWithFiles = true,
IgnoreEpisodesWithoutFiles = false
});
VerifyMonitored(e => e.SeasonNumber == 1);
VerifyNotMonitored(e => e.SeasonNumber == 2);
VerifySeasonMonitored(s => s.SeasonNumber == 1);
VerifySeasonNotMonitored(s => s.SeasonNumber == 2);
}
private void VerifyMonitored(Func<Episode, bool> predicate) private void VerifyMonitored(Func<Episode, bool> predicate)
{ {
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()

View File

@ -34,10 +34,9 @@ public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitorin
if (monitoringOptions.IgnoreEpisodesWithFiles) if (monitoringOptions.IgnoreEpisodesWithFiles)
{ {
_logger.Debug("Ignoring Episodes with Files"); _logger.Debug("Unmonitoring Episodes with Files");
ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), false); ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), false);
} }
else else
{ {
_logger.Debug("Monitoring Episodes with Files"); _logger.Debug("Monitoring Episodes with Files");
@ -46,10 +45,9 @@ public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitorin
if (monitoringOptions.IgnoreEpisodesWithoutFiles) if (monitoringOptions.IgnoreEpisodesWithoutFiles)
{ {
_logger.Debug("Ignoring Episodes without Files"); _logger.Debug("Unmonitoring Episodes without Files");
ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), false); ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), false);
} }
else else
{ {
_logger.Debug("Monitoring Episodes without Files"); _logger.Debug("Monitoring Episodes without Files");
@ -62,31 +60,21 @@ public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitorin
{ {
var season = s; var season = s;
if (season.Monitored) // If the season is unmonitored we should unmonitor all episodes in that season
if (!season.Monitored)
{ {
if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles) _logger.Debug("Unmonitoring all episodes in season {0}", season.SeasonNumber);
{ ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), true);
}
} }
else // If the season is not the latest season and all it's episodes are unmonitored the season will be unmonitored
{
if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles)
{
ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
}
else if (season.SeasonNumber == 0)
{
ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
}
}
if (season.SeasonNumber < lastSeason) if (season.SeasonNumber < lastSeason)
{ {
if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored)) if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored))
{ {
_logger.Debug("Unmonitoring season {0} because all episodes are not monitored", season.SeasonNumber);
season.Monitored = false; season.Monitored = false;
} }
} }