mirror of
https://github.com/Sonarr/Sonarr.git
synced 2024-12-16 11:37:58 +02:00
Cleanup orphaned seasons when deleting episodes
This commit is contained in:
parent
1f90d546d4
commit
9e5353aacc
@ -186,6 +186,7 @@
|
|||||||
<Compile Include="ProviderTests\DiskProviderTests\ArchiveProviderFixture.cs" />
|
<Compile Include="ProviderTests\DiskProviderTests\ArchiveProviderFixture.cs" />
|
||||||
<Compile Include="MediaFileTests\DropFolderImportServiceFixture.cs" />
|
<Compile Include="MediaFileTests\DropFolderImportServiceFixture.cs" />
|
||||||
<Compile Include="SeriesStatsTests\SeriesStatisticsFixture.cs" />
|
<Compile Include="SeriesStatsTests\SeriesStatisticsFixture.cs" />
|
||||||
|
<Compile Include="TvTests\SeasonServiceTests\HandleEpisodeInfoDeletedEventFixture.cs" />
|
||||||
<Compile Include="TvTests\SeasonServiceTests\SetSeasonPassFixture.cs" />
|
<Compile Include="TvTests\SeasonServiceTests\SetSeasonPassFixture.cs" />
|
||||||
<Compile Include="TvTests\SeasonServiceTests\SetMonitoredFixture.cs" />
|
<Compile Include="TvTests\SeasonServiceTests\SetMonitoredFixture.cs" />
|
||||||
<Compile Include="TvTests\SeriesRepositoryTests\QualityProfileRepositoryFixture.cs" />
|
<Compile Include="TvTests\SeriesRepositoryTests\QualityProfileRepositoryFixture.cs" />
|
||||||
|
@ -0,0 +1,93 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using FizzWare.NBuilder;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Core.Tv.Events;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.TvTests.SeasonServiceTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class HandleEpisodeInfoDeletedEventFixture : CoreTest<SeasonService>
|
||||||
|
{
|
||||||
|
private List<Season> _seasons;
|
||||||
|
private List<Episode> _episodes;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
_seasons = Builder<Season>
|
||||||
|
.CreateListOfSize(1)
|
||||||
|
.All()
|
||||||
|
.With(s => s.SeriesId = 1)
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
_episodes = Builder<Episode>
|
||||||
|
.CreateListOfSize(1)
|
||||||
|
.All()
|
||||||
|
.With(e => e.SeasonNumber = _seasons.First().SeasonNumber)
|
||||||
|
.With(s => s.SeriesId = _seasons.First().SeasonNumber)
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
Mocker.GetMock<ISeasonRepository>()
|
||||||
|
.Setup(s => s.GetSeasonBySeries(It.IsAny<int>()))
|
||||||
|
.Returns(_seasons);
|
||||||
|
|
||||||
|
Mocker.GetMock<IEpisodeService>()
|
||||||
|
.Setup(s => s.GetEpisodesBySeason(It.IsAny<int>(), _seasons.First().SeasonNumber))
|
||||||
|
.Returns(_episodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GivenAbandonedSeason()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IEpisodeService>()
|
||||||
|
.Setup(s => s.GetEpisodesBySeason(It.IsAny<int>(), _seasons.First().SeasonNumber))
|
||||||
|
.Returns(new List<Episode>());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_delete_when_season_is_still_valid()
|
||||||
|
{
|
||||||
|
Subject.Handle(new EpisodeInfoDeletedEvent(_episodes));
|
||||||
|
|
||||||
|
Mocker.GetMock<ISeasonRepository>()
|
||||||
|
.Verify(v => v.Delete(It.IsAny<Season>()), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_delete_season_if_no_episodes_exist_in_that_season()
|
||||||
|
{
|
||||||
|
GivenAbandonedSeason();
|
||||||
|
|
||||||
|
Subject.Handle(new EpisodeInfoDeletedEvent(_episodes));
|
||||||
|
|
||||||
|
Mocker.GetMock<ISeasonRepository>()
|
||||||
|
.Verify(v => v.Delete(It.IsAny<Season>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_only_delete_a_season_once()
|
||||||
|
{
|
||||||
|
_episodes = Builder<Episode>
|
||||||
|
.CreateListOfSize(5)
|
||||||
|
.All()
|
||||||
|
.With(e => e.SeasonNumber = _seasons.First().SeasonNumber)
|
||||||
|
.With(s => s.SeriesId = _seasons.First().SeasonNumber)
|
||||||
|
.Build()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
GivenAbandonedSeason();
|
||||||
|
|
||||||
|
Subject.Handle(new EpisodeInfoDeletedEvent(_episodes));
|
||||||
|
|
||||||
|
Mocker.GetMock<ISeasonRepository>()
|
||||||
|
.Verify(v => v.Delete(It.IsAny<Season>()), Times.Once());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -350,6 +350,7 @@
|
|||||||
<Compile Include="Rest\RestException.cs" />
|
<Compile Include="Rest\RestException.cs" />
|
||||||
<Compile Include="SeriesStats\SeriesStatisticsService.cs" />
|
<Compile Include="SeriesStats\SeriesStatisticsService.cs" />
|
||||||
<Compile Include="Tv\EpisodeService.cs" />
|
<Compile Include="Tv\EpisodeService.cs" />
|
||||||
|
<Compile Include="Tv\Events\EpisodeInfoDeletedEvent.cs" />
|
||||||
<Compile Include="Tv\Events\EpisodeInfoUpdatedEvent.cs" />
|
<Compile Include="Tv\Events\EpisodeInfoUpdatedEvent.cs" />
|
||||||
<Compile Include="Tv\Events\EpisodeInfoAddedEvent.cs" />
|
<Compile Include="Tv\Events\EpisodeInfoAddedEvent.cs" />
|
||||||
<Compile Include="Tv\Events\SeriesAddedEvent.cs" />
|
<Compile Include="Tv\Events\SeriesAddedEvent.cs" />
|
||||||
|
16
NzbDrone.Core/Tv/Events/EpisodeInfoDeletedEvent.cs
Normal file
16
NzbDrone.Core/Tv/Events/EpisodeInfoDeletedEvent.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using NzbDrone.Common.Messaging;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Tv.Events
|
||||||
|
{
|
||||||
|
public class EpisodeInfoDeletedEvent : IEvent
|
||||||
|
{
|
||||||
|
public ReadOnlyCollection<Episode> Episodes { get; private set; }
|
||||||
|
|
||||||
|
public EpisodeInfoDeletedEvent(IList<Episode> episodes)
|
||||||
|
{
|
||||||
|
Episodes = new ReadOnlyCollection<Episode>(episodes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -34,7 +34,7 @@ public void RefreshEpisodeInfo(Series series, IEnumerable<Episode> remoteEpisode
|
|||||||
var successCount = 0;
|
var successCount = 0;
|
||||||
var failCount = 0;
|
var failCount = 0;
|
||||||
|
|
||||||
var existinEpisodes = _episodeService.GetEpisodeBySeries(series.Id);
|
var existingEpisodes = _episodeService.GetEpisodeBySeries(series.Id);
|
||||||
var seasons = _seasonService.GetSeasonsBySeries(series.Id);
|
var seasons = _seasonService.GetSeasonsBySeries(series.Id);
|
||||||
|
|
||||||
var updateList = new List<Episode>();
|
var updateList = new List<Episode>();
|
||||||
@ -44,11 +44,11 @@ public void RefreshEpisodeInfo(Series series, IEnumerable<Episode> remoteEpisode
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var episodeToUpdate = existinEpisodes.SingleOrDefault(e => e.SeasonNumber == episode.SeasonNumber && e.EpisodeNumber == episode.EpisodeNumber);
|
var episodeToUpdate = existingEpisodes.SingleOrDefault(e => e.SeasonNumber == episode.SeasonNumber && e.EpisodeNumber == episode.EpisodeNumber);
|
||||||
|
|
||||||
if (episodeToUpdate != null)
|
if (episodeToUpdate != null)
|
||||||
{
|
{
|
||||||
existinEpisodes.Remove(episodeToUpdate);
|
existingEpisodes.Remove(episodeToUpdate);
|
||||||
updateList.Add(episodeToUpdate);
|
updateList.Add(episodeToUpdate);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -82,11 +82,10 @@ public void RefreshEpisodeInfo(Series series, IEnumerable<Episode> remoteEpisode
|
|||||||
|
|
||||||
AdjustMultiEpisodeAirTime(series, allEpisodes);
|
AdjustMultiEpisodeAirTime(series, allEpisodes);
|
||||||
|
|
||||||
_episodeService.DeleteMany(existinEpisodes);
|
_episodeService.DeleteMany(existingEpisodes);
|
||||||
_episodeService.UpdateMany(updateList);
|
_episodeService.UpdateMany(updateList);
|
||||||
_episodeService.InsertMany(newList);
|
_episodeService.InsertMany(newList);
|
||||||
|
|
||||||
|
|
||||||
if (newList.Any())
|
if (newList.Any())
|
||||||
{
|
{
|
||||||
_messageAggregator.PublishEvent(new EpisodeInfoAddedEvent(newList, series));
|
_messageAggregator.PublishEvent(new EpisodeInfoAddedEvent(newList, series));
|
||||||
@ -97,6 +96,11 @@ public void RefreshEpisodeInfo(Series series, IEnumerable<Episode> remoteEpisode
|
|||||||
_messageAggregator.PublishEvent(new EpisodeInfoUpdatedEvent(updateList));
|
_messageAggregator.PublishEvent(new EpisodeInfoUpdatedEvent(updateList));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (existingEpisodes.Any())
|
||||||
|
{
|
||||||
|
_messageAggregator.PublishEvent(new EpisodeInfoDeletedEvent(updateList));
|
||||||
|
}
|
||||||
|
|
||||||
if (failCount != 0)
|
if (failCount != 0)
|
||||||
{
|
{
|
||||||
_logger.Info("Finished episode refresh for series: {0}. Successful: {1} - Failed: {2} ",
|
_logger.Info("Finished episode refresh for series: {0}. Successful: {1} - Failed: {2} ",
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user