mirror of
https://github.com/Sonarr/Sonarr.git
synced 2025-01-27 11:21:43 +02:00
Added the ability to auto-ignore episodes for files that are deleted, good for people that delete after watching. Option is not exposed in the UI and is disabled by default (obviously).
This commit is contained in:
parent
0ecc62a6f7
commit
218059e08d
@ -1590,5 +1590,39 @@ namespace NzbDrone.Core.Test.ProviderTests
|
||||
result.Where(e => e.Ignored).Should().HaveCount(episodeCount - 1);
|
||||
result.Single(e => e.SeasonNumber == 1).Ignored.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SetPreviouslyDownloadedToIgnored_should_set_only_episodes_with_no_episode_file_and_postdownload_status_noError_to_ignored()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var postDownloadStatus = PostDownloadStatusType.NoError;
|
||||
|
||||
var fakeEpisodes = Builder<Episode>.CreateListOfSize(10)
|
||||
.All()
|
||||
.With(c => c.Ignored = false)
|
||||
.TheFirst(2)
|
||||
.With(c => c.PostDownloadStatus = PostDownloadStatusType.NoError)
|
||||
.With(c => c.EpisodeFileId = 0)
|
||||
.TheNext(3)
|
||||
.With(c => c.PostDownloadStatus = PostDownloadStatusType.Unknown)
|
||||
.With(c => c.EpisodeFileId = 0)
|
||||
.TheNext(4)
|
||||
.With(c => c.PostDownloadStatus = PostDownloadStatusType.NoError)
|
||||
.TheNext(1)
|
||||
.With(c => c.PostDownloadStatus = PostDownloadStatusType.NoError)
|
||||
.With(c => c.Ignored = true)
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(fakeEpisodes);
|
||||
|
||||
//Act
|
||||
Mocker.Resolve<EpisodeProvider>().SetPreviouslyDownloadedToIgnored();
|
||||
|
||||
//Assert
|
||||
var result = Db.Fetch<Episode>();
|
||||
result.Should().HaveCount(10);
|
||||
result.Where(e => e.Ignored).Count().Should().Be(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
51
NzbDrone.Core/Jobs/AutoIgnoreJob.cs
Normal file
51
NzbDrone.Core/Jobs/AutoIgnoreJob.cs
Normal file
@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Ninject;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Helpers;
|
||||
using NzbDrone.Core.Model.Notification;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Repository;
|
||||
|
||||
namespace NzbDrone.Core.Jobs
|
||||
{
|
||||
public class AutoIgnoreJob : IJob
|
||||
{
|
||||
private readonly ConfigProvider _configProvider;
|
||||
private readonly EpisodeProvider _episodeProvider;
|
||||
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
[Inject]
|
||||
public AutoIgnoreJob(ConfigProvider configProvider, EpisodeProvider episodeProvider)
|
||||
{
|
||||
_configProvider = configProvider;
|
||||
_episodeProvider = episodeProvider;
|
||||
}
|
||||
|
||||
public AutoIgnoreJob()
|
||||
{
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "Auto Ignore Episodes"; }
|
||||
}
|
||||
|
||||
public TimeSpan DefaultInterval
|
||||
{
|
||||
get { return TimeSpan.FromTicks(0); }
|
||||
}
|
||||
|
||||
public virtual void Start(ProgressNotification notification, int targetId, int secondaryTargetId)
|
||||
{
|
||||
if (_configProvider.AutoIgnorePreviouslyDownloadedEpisodes)
|
||||
{
|
||||
Logger.Info("Ignoring Previously Downloaded Episodes");
|
||||
_episodeProvider.SetPreviouslyDownloadedToIgnored();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ using NLog;
|
||||
using NzbDrone.Core.Helpers;
|
||||
using NzbDrone.Core.Model.Notification;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Repository;
|
||||
|
||||
namespace NzbDrone.Core.Jobs
|
||||
@ -14,13 +15,16 @@ namespace NzbDrone.Core.Jobs
|
||||
{
|
||||
private readonly SeriesProvider _seriesProvider;
|
||||
private readonly DiskScanProvider _diskScanProvider;
|
||||
private readonly AutoIgnoreJob _autoIgnoreJob;
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
[Inject]
|
||||
public DiskScanJob(SeriesProvider seriesProvider, DiskScanProvider diskScanProvider)
|
||||
public DiskScanJob(SeriesProvider seriesProvider, DiskScanProvider diskScanProvider,
|
||||
AutoIgnoreJob autoIgnoreJob)
|
||||
{
|
||||
_seriesProvider = seriesProvider;
|
||||
_diskScanProvider = diskScanProvider;
|
||||
_autoIgnoreJob = autoIgnoreJob;
|
||||
}
|
||||
|
||||
public DiskScanJob()
|
||||
@ -62,6 +66,9 @@ namespace NzbDrone.Core.Jobs
|
||||
Logger.ErrorException("An error has occurred while scanning " + series.Title, e);
|
||||
}
|
||||
}
|
||||
|
||||
//Start the Auto Ignore Job
|
||||
_autoIgnoreJob.Start(notification, 0 , 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -225,6 +225,7 @@
|
||||
<Compile Include="Instrumentation\DatabaseTarget.cs" />
|
||||
<Compile Include="Instrumentation\NlogWriter.cs" />
|
||||
<Compile Include="Datastore\PetaPoco\PetaPoco.cs" />
|
||||
<Compile Include="Jobs\AutoIgnoreJob.cs" />
|
||||
<Compile Include="Model\AtomicParsleyTitleType.cs" />
|
||||
<Compile Include="Model\ConnectionInfoModel.cs" />
|
||||
<Compile Include="Model\PostDownloadStatusType.cs" />
|
||||
|
@ -402,6 +402,12 @@ namespace NzbDrone.Core.Providers.Core
|
||||
set { SetValue("EnableBacklogSearching", value); }
|
||||
}
|
||||
|
||||
public virtual bool AutoIgnorePreviouslyDownloadedEpisodes
|
||||
{
|
||||
get { return GetValueBoolean("AutoIgnorePreviouslyDownloadedEpisodes"); }
|
||||
set { SetValue("AutoIgnorePreviouslyDownloadedEpisodes", value); }
|
||||
}
|
||||
|
||||
private string GetValue(string key)
|
||||
{
|
||||
return GetValue(key, String.Empty);
|
||||
|
@ -463,5 +463,13 @@ namespace NzbDrone.Core.Providers
|
||||
Logger.Trace("Updating PostDownloadStatus for all episodeIds in {0}", episodeIdString);
|
||||
_database.Execute(episodeIdQuery);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets Ignored to true if the episode successfully downloaded (PostDownloadStatus = 5), but EpisodeFileId = 0
|
||||
/// </summary>
|
||||
public virtual void SetPreviouslyDownloadedToIgnored()
|
||||
{
|
||||
_database.Execute("UPDATE Episodes SET Ignored = 1, PostDownloadStatus = 0 WHERE PostDownloadStatus = 5 AND EpisodeFileId = 0");
|
||||
}
|
||||
}
|
||||
} |