diff --git a/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs b/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs index 1a641bfca..fc6498412 100644 --- a/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs +++ b/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs @@ -1,4 +1,7 @@ -using NzbDrone.Core.Datastore; +using System; +using System.Collections.Generic; +using System.Linq; +using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Blacklisting @@ -6,6 +9,7 @@ namespace NzbDrone.Core.Blacklisting public interface IBlacklistRepository : IBasicRepository { bool Blacklisted(string sourceTitle); + List BlacklistedBySeries(int seriesId); } public class BlacklistRepository : BasicRepository, IBlacklistRepository @@ -17,7 +21,12 @@ namespace NzbDrone.Core.Blacklisting public bool Blacklisted(string sourceTitle) { - return Query.Any(e => e.SourceTitle.Contains(sourceTitle)); + return Query.Where(e => e.SourceTitle.Contains(sourceTitle)).Any(); + } + + public List BlacklistedBySeries(int seriesId) + { + return Query.Where(b => b.SeriesId == seriesId); } } } diff --git a/src/NzbDrone.Core/Blacklisting/BlacklistService.cs b/src/NzbDrone.Core/Blacklisting/BlacklistService.cs index 8b3ab0a2d..fafbec44e 100644 --- a/src/NzbDrone.Core/Blacklisting/BlacklistService.cs +++ b/src/NzbDrone.Core/Blacklisting/BlacklistService.cs @@ -3,6 +3,7 @@ using NzbDrone.Core.Datastore; using NzbDrone.Core.Download; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Tv.Events; namespace NzbDrone.Core.Blacklisting { @@ -13,7 +14,7 @@ namespace NzbDrone.Core.Blacklisting void Delete(int id); } - public class BlacklistService : IBlacklistService, IHandle, IExecute + public class BlacklistService : IBlacklistService, IExecute, IHandle, IHandle { private readonly IBlacklistRepository _blacklistRepository; private readonly IRedownloadFailedDownloads _redownloadFailedDownloadService; @@ -39,6 +40,11 @@ namespace NzbDrone.Core.Blacklisting _blacklistRepository.Delete(id); } + public void Execute(ClearBlacklistCommand message) + { + _blacklistRepository.Purge(); + } + public void Handle(DownloadFailedEvent message) { var blacklist = new Blacklist @@ -55,9 +61,11 @@ namespace NzbDrone.Core.Blacklisting _redownloadFailedDownloadService.Redownload(message.SeriesId, message.EpisodeIds); } - public void Execute(ClearBlacklistCommand message) + public void Handle(SeriesDeletedEvent message) { - _blacklistRepository.Purge(); + var blacklisted = _blacklistRepository.BlacklistedBySeries(message.Series.Id); + + _blacklistRepository.DeleteMany(blacklisted); } } } diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs new file mode 100644 index 000000000..3ccb0c181 --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs @@ -0,0 +1,31 @@ +using NLog; +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupOrphanedBlacklist : IHousekeepingTask + { + private readonly IDatabase _database; + private readonly Logger _logger; + + public CleanupOrphanedBlacklist(IDatabase database, Logger logger) + { + _database = database; + _logger = logger; + } + + public void Clean() + { + _logger.Trace("Running orphaned blacklist cleanup"); + + var mapper = _database.GetDataMapper(); + + mapper.ExecuteNonQuery(@"DELETE FROM Blacklist + WHERE Id IN ( + SELECT Blacklist.Id FROM Blacklist + LEFT OUTER JOIN Series + ON Blacklist.SeriesId = Series.Id + WHERE Series.Id IS NULL)"); + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 220e27eca..0c22a0648 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -283,6 +283,7 @@ +