From 337f74a184643baf0a7db223ec5421390d056f17 Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 16 Aug 2017 17:55:59 -0400 Subject: [PATCH] Refactor Blacklist for Album Releases (#48) * Refactor Blacklist for Album Releases * Fix Test --- .../Blacklist/BlacklistResource.cs | 14 +++++------ .../BlacklistRepositoryFixture.cs | 12 +++++----- .../Blacklisting/BlacklistServiceFixture.cs | 10 ++++---- .../CleanupOrphanedBlacklistFixture.cs | 12 +++++----- src/NzbDrone.Core/Blacklisting/Blacklist.cs | 8 +++---- .../Blacklisting/BlacklistRepository.cs | 22 ++++++++--------- .../Blacklisting/BlacklistService.cs | 20 ++++++++-------- .../Migration/113_music_blacklist.cs | 24 +++++++++++++++++++ .../Housekeepers/CleanupOrphanedBlacklist.cs | 6 ++--- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + .../ApiTests/BlacklistFixture.cs | 8 +++---- .../Activity/Blacklist/BlacklistCollection.js | 2 +- src/UI/Activity/Blacklist/BlacklistLayout.js | 8 +++---- src/UI/Activity/Blacklist/BlacklistModel.js | 4 ++-- 14 files changed, 88 insertions(+), 63 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs diff --git a/src/NzbDrone.Api/Blacklist/BlacklistResource.cs b/src/NzbDrone.Api/Blacklist/BlacklistResource.cs index c3f1c6b1b..d534e720f 100644 --- a/src/NzbDrone.Api/Blacklist/BlacklistResource.cs +++ b/src/NzbDrone.Api/Blacklist/BlacklistResource.cs @@ -2,15 +2,15 @@ using System.Collections.Generic; using NzbDrone.Api.REST; using NzbDrone.Core.Qualities; -using NzbDrone.Api.Series; +using NzbDrone.Api.Music; using NzbDrone.Core.Indexers; namespace NzbDrone.Api.Blacklist { public class BlacklistResource : RestResource { - public int SeriesId { get; set; } - public List EpisodeIds { get; set; } + public int ArtistId { get; set; } + public List AlbumIds { get; set; } public string SourceTitle { get; set; } public QualityModel Quality { get; set; } public DateTime Date { get; set; } @@ -18,7 +18,7 @@ namespace NzbDrone.Api.Blacklist public string Indexer { get; set; } public string Message { get; set; } - public SeriesResource Series { get; set; } + public ArtistResource Artist { get; set; } } public static class BlacklistResourceMapper @@ -31,8 +31,8 @@ namespace NzbDrone.Api.Blacklist { Id = model.Id, - SeriesId = model.SeriesId, - EpisodeIds = model.EpisodeIds, + ArtistId = model.ArtistId, + AlbumIds = model.AlbumIds, SourceTitle = model.SourceTitle, Quality = model.Quality, Date = model.Date, @@ -40,7 +40,7 @@ namespace NzbDrone.Api.Blacklist Indexer = model.Indexer, Message = model.Message, - Series = model.Series.ToResource() + Artist = model.Artist.ToResource() }; } } diff --git a/src/NzbDrone.Core.Test/Blacklisting/BlacklistRepositoryFixture.cs b/src/NzbDrone.Core.Test/Blacklisting/BlacklistRepositoryFixture.cs index 00e9fb1e2..946a5ad66 100644 --- a/src/NzbDrone.Core.Test/Blacklisting/BlacklistRepositoryFixture.cs +++ b/src/NzbDrone.Core.Test/Blacklisting/BlacklistRepositoryFixture.cs @@ -19,10 +19,10 @@ namespace NzbDrone.Core.Test.Blacklisting { _blacklist = new Blacklist { - SeriesId = 12345, - EpisodeIds = new List { 1 }, + ArtistId = 12345, + AlbumIds = new List { 1 }, Quality = new QualityModel(Quality.FLAC), - SourceTitle = "series.title.s01e01", + SourceTitle = "artist.name.album.title", Date = DateTime.UtcNow }; } @@ -35,11 +35,11 @@ namespace NzbDrone.Core.Test.Blacklisting } [Test] - public void should_should_have_episode_ids() + public void should_should_have_album_ids() { Subject.Insert(_blacklist); - Subject.All().First().EpisodeIds.Should().Contain(_blacklist.EpisodeIds); + Subject.All().First().AlbumIds.Should().Contain(_blacklist.AlbumIds); } [Test] @@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.Blacklisting { Subject.Insert(_blacklist); - Subject.BlacklistedByTitle(_blacklist.SeriesId, _blacklist.SourceTitle.ToUpperInvariant()).Should().HaveCount(1); + Subject.BlacklistedByTitle(_blacklist.ArtistId, _blacklist.SourceTitle.ToUpperInvariant()).Should().HaveCount(1); } } } diff --git a/src/NzbDrone.Core.Test/Blacklisting/BlacklistServiceFixture.cs b/src/NzbDrone.Core.Test/Blacklisting/BlacklistServiceFixture.cs index be6448e91..eb4e1fa56 100644 --- a/src/NzbDrone.Core.Test/Blacklisting/BlacklistServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Blacklisting/BlacklistServiceFixture.cs @@ -19,10 +19,10 @@ namespace NzbDrone.Core.Test.Blacklisting { _event = new DownloadFailedEvent { - SeriesId = 12345, - EpisodeIds = new List {1}, + ArtistId = 12345, + AlbumIds = new List {1}, Quality = new QualityModel(Quality.MP3_320), - SourceTitle = "series.title.s01e01", + SourceTitle = "artist.name.album.title", DownloadClient = "SabnzbdClient", DownloadId = "Sabnzbd_nzo_2dfh73k" }; @@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.Blacklisting Subject.Handle(_event); Mocker.GetMock() - .Verify(v => v.Insert(It.Is(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once()); + .Verify(v => v.Insert(It.Is(b => b.AlbumIds == _event.AlbumIds)), Times.Once()); } [Test] @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.Blacklisting _event.Data.Remove("protocol"); Mocker.GetMock() - .Verify(v => v.Insert(It.Is(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once()); + .Verify(v => v.Insert(It.Is(b => b.AlbumIds == _event.AlbumIds)), Times.Once()); } } } diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedBlacklistFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedBlacklistFixture.cs index e6eaa1af9..37fe1cff6 100644 --- a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedBlacklistFixture.cs +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedBlacklistFixture.cs @@ -5,7 +5,7 @@ using NzbDrone.Core.Blacklisting; using NzbDrone.Core.Housekeeping.Housekeepers; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; -using NzbDrone.Core.Tv; +using NzbDrone.Core.Music; using System.Collections.Generic; namespace NzbDrone.Core.Test.Housekeeping.Housekeepers @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers public void should_delete_orphaned_blacklist_items() { var blacklist = Builder.CreateNew() - .With(h => h.EpisodeIds = new List()) + .With(h => h.AlbumIds = new List()) .With(h => h.Quality = new QualityModel()) .BuildNew(); @@ -29,14 +29,14 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers [Test] public void should_not_delete_unorphaned_blacklist_items() { - var series = Builder.CreateNew().BuildNew(); + var artist = Builder.CreateNew().BuildNew(); - Db.Insert(series); + Db.Insert(artist); var blacklist = Builder.CreateNew() - .With(h => h.EpisodeIds = new List()) + .With(h => h.AlbumIds = new List()) .With(h => h.Quality = new QualityModel()) - .With(b => b.SeriesId = series.Id) + .With(b => b.ArtistId = artist.Id) .BuildNew(); Db.Insert(blacklist); diff --git a/src/NzbDrone.Core/Blacklisting/Blacklist.cs b/src/NzbDrone.Core/Blacklisting/Blacklist.cs index 1c0813ac0..44fa2e74c 100644 --- a/src/NzbDrone.Core/Blacklisting/Blacklist.cs +++ b/src/NzbDrone.Core/Blacklisting/Blacklist.cs @@ -3,15 +3,15 @@ using System.Collections.Generic; using NzbDrone.Core.Datastore; using NzbDrone.Core.Indexers; using NzbDrone.Core.Qualities; -using NzbDrone.Core.Tv; +using NzbDrone.Core.Music; namespace NzbDrone.Core.Blacklisting { public class Blacklist : ModelBase { - public int SeriesId { get; set; } - public Series Series { get; set; } - public List EpisodeIds { get; set; } + public int ArtistId { get; set; } + public Artist Artist { get; set; } + public List AlbumIds { get; set; } public string SourceTitle { get; set; } public QualityModel Quality { get; set; } public DateTime Date { get; set; } diff --git a/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs b/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs index 906f2a92b..9d6e736c4 100644 --- a/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs +++ b/src/NzbDrone.Core/Blacklisting/BlacklistRepository.cs @@ -2,15 +2,15 @@ using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; using Marr.Data.QGen; -using NzbDrone.Core.Tv; +using NzbDrone.Core.Music; namespace NzbDrone.Core.Blacklisting { public interface IBlacklistRepository : IBasicRepository { - List BlacklistedByTitle(int seriesId, string sourceTitle); - List BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash); - List BlacklistedBySeries(int seriesId); + List BlacklistedByTitle(int artistId, string sourceTitle); + List BlacklistedByTorrentInfoHash(int artistId, string torrentInfoHash); + List BlacklistedByArtist(int artistId); } public class BlacklistRepository : BasicRepository, IBlacklistRepository @@ -20,26 +20,26 @@ namespace NzbDrone.Core.Blacklisting { } - public List BlacklistedByTitle(int seriesId, string sourceTitle) + public List BlacklistedByTitle(int artistId, string sourceTitle) { - return Query.Where(e => e.SeriesId == seriesId) + return Query.Where(e => e.ArtistId == artistId) .AndWhere(e => e.SourceTitle.Contains(sourceTitle)); } - public List BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash) + public List BlacklistedByTorrentInfoHash(int artistId, string torrentInfoHash) { - return Query.Where(e => e.SeriesId == seriesId) + return Query.Where(e => e.ArtistId == artistId) .AndWhere(e => e.TorrentInfoHash.Contains(torrentInfoHash)); } - public List BlacklistedBySeries(int seriesId) + public List BlacklistedByArtist(int artistId) { - return Query.Where(b => b.SeriesId == seriesId); + return Query.Where(b => b.ArtistId == artistId); } protected override SortBuilder GetPagedQuery(QueryBuilder query, PagingSpec pagingSpec) { - var baseQuery = query.Join(JoinType.Inner, h => h.Series, (h, s) => h.SeriesId == s.Id); + var baseQuery = query.Join(JoinType.Inner, h => h.Artist, (h, s) => h.ArtistId == s.Id); return base.GetPagedQuery(baseQuery, pagingSpec); } diff --git a/src/NzbDrone.Core/Blacklisting/BlacklistService.cs b/src/NzbDrone.Core/Blacklisting/BlacklistService.cs index 1c0829004..74efb3b1f 100644 --- a/src/NzbDrone.Core/Blacklisting/BlacklistService.cs +++ b/src/NzbDrone.Core/Blacklisting/BlacklistService.cs @@ -7,13 +7,13 @@ using NzbDrone.Core.Indexers; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Parser.Model; -using NzbDrone.Core.Tv.Events; +using NzbDrone.Core.Music.Events; namespace NzbDrone.Core.Blacklisting { public interface IBlacklistService { - bool Blacklisted(int seriesId, ReleaseInfo release); + bool Blacklisted(int artistId, ReleaseInfo release); PagingSpec Paged(PagingSpec pagingSpec); void Delete(int id); } @@ -21,7 +21,7 @@ namespace NzbDrone.Core.Blacklisting IExecute, IHandle, - IHandleAsync + IHandleAsync { private readonly IBlacklistRepository _blacklistRepository; @@ -30,9 +30,9 @@ namespace NzbDrone.Core.Blacklisting _blacklistRepository = blacklistRepository; } - public bool Blacklisted(int seriesId, ReleaseInfo release) + public bool Blacklisted(int artistId, ReleaseInfo release) { - var blacklistedByTitle = _blacklistRepository.BlacklistedByTitle(seriesId, release.Title); + var blacklistedByTitle = _blacklistRepository.BlacklistedByTitle(artistId, release.Title); if (release.DownloadProtocol == DownloadProtocol.Torrent) { @@ -46,7 +46,7 @@ namespace NzbDrone.Core.Blacklisting .Any(b => SameTorrent(b, torrentInfo)); } - var blacklistedByTorrentInfohash = _blacklistRepository.BlacklistedByTorrentInfoHash(seriesId, torrentInfo.InfoHash); + var blacklistedByTorrentInfohash = _blacklistRepository.BlacklistedByTorrentInfoHash(artistId, torrentInfo.InfoHash); return blacklistedByTorrentInfohash.Any(b => SameTorrent(b, torrentInfo)); } @@ -128,8 +128,8 @@ namespace NzbDrone.Core.Blacklisting { var blacklist = new Blacklist { - SeriesId = message.SeriesId, - EpisodeIds = message.EpisodeIds, + ArtistId = message.ArtistId, + AlbumIds = message.AlbumIds, SourceTitle = message.SourceTitle, Quality = message.Quality, Date = DateTime.UtcNow, @@ -144,9 +144,9 @@ namespace NzbDrone.Core.Blacklisting _blacklistRepository.Insert(blacklist); } - public void HandleAsync(SeriesDeletedEvent message) + public void HandleAsync(ArtistDeletedEvent message) { - var blacklisted = _blacklistRepository.BlacklistedBySeries(message.Series.Id); + var blacklisted = _blacklistRepository.BlacklistedByArtist(message.Artist.Id); _blacklistRepository.DeleteMany(blacklisted); } diff --git a/src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs b/src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs new file mode 100644 index 000000000..49c151f51 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs @@ -0,0 +1,24 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(113)] + public class music_blacklist : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("Blacklist") + .AddColumn("ArtistId").AsInt32().WithDefaultValue(0) + .AddColumn("AlbumIds").AsString().WithDefaultValue(""); + + Delete.Column("SeriesId").FromTable("Blacklist"); + Delete.Column("EpisodeIds").FromTable("Blacklist"); + } + + } +} diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs index b1d127292..2def585c2 100644 --- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedBlacklist.cs @@ -18,9 +18,9 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers 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)"); + LEFT OUTER JOIN Artists + ON Blacklist.ArtistId = Artists.Id + WHERE Artists.Id IS NULL)"); } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index fbcf75833..81ca11ed2 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -295,6 +295,7 @@ Code + diff --git a/src/NzbDrone.Integration.Test/ApiTests/BlacklistFixture.cs b/src/NzbDrone.Integration.Test/ApiTests/BlacklistFixture.cs index 3c65a723a..af2bf2c40 100644 --- a/src/NzbDrone.Integration.Test/ApiTests/BlacklistFixture.cs +++ b/src/NzbDrone.Integration.Test/ApiTests/BlacklistFixture.cs @@ -13,12 +13,12 @@ namespace NzbDrone.Integration.Test.ApiTests [Ignore("Adding to blacklist not supported")] public void should_be_able_to_add_to_blacklist() { - _artist = EnsureArtist("266189", "The Blacklist"); - + _artist = EnsureArtist("8ac6cc32-8ddf-43b1-9ac4-4b04f9053176", "Alien Ant Farm"); + Blacklist.Post(new Api.Blacklist.BlacklistResource { - SeriesId = _artist.Id, - SourceTitle = "Blacklist.S01E01.Brought.To.You.By-BoomBoxHD" + ArtistId = _artist.Id, + SourceTitle = "Blacklist - Album 1 [2015 FLAC]" }); } diff --git a/src/UI/Activity/Blacklist/BlacklistCollection.js b/src/UI/Activity/Blacklist/BlacklistCollection.js index d7e2f1a16..86b177065 100644 --- a/src/UI/Activity/Blacklist/BlacklistCollection.js +++ b/src/UI/Activity/Blacklist/BlacklistCollection.js @@ -26,7 +26,7 @@ var Collection = PageableCollection.extend({ }, sortMappings : { - 'series' : { sortKey : 'series.sortTitle' } + 'artist' : { sortKey : 'artist.sortName' } }, parseState : function(resp) { diff --git a/src/UI/Activity/Blacklist/BlacklistLayout.js b/src/UI/Activity/Blacklist/BlacklistLayout.js index 778a15d22..1be8fed68 100644 --- a/src/UI/Activity/Blacklist/BlacklistLayout.js +++ b/src/UI/Activity/Blacklist/BlacklistLayout.js @@ -2,7 +2,7 @@ var vent = require('vent'); var Marionette = require('marionette'); var Backgrid = require('backgrid'); var BlacklistCollection = require('./BlacklistCollection'); -var SeriesTitleCell = require('../../Cells/SeriesTitleCell'); +var ArtistTitleCell = require('../../Cells/ArtistTitleCell'); var QualityCell = require('../../Cells/QualityCell'); var RelativeDateCell = require('../../Cells/RelativeDateCell'); var BlacklistActionsCell = require('./BlacklistActionsCell'); @@ -21,9 +21,9 @@ module.exports = Marionette.Layout.extend({ columns : [ { - name : 'series', - label : 'Series', - cell : SeriesTitleCell + name : 'artist', + label : 'Artist', + cell : ArtistTitleCell }, { name : 'sourceTitle', diff --git a/src/UI/Activity/Blacklist/BlacklistModel.js b/src/UI/Activity/Blacklist/BlacklistModel.js index e103f718f..e3c4b5ab0 100644 --- a/src/UI/Activity/Blacklist/BlacklistModel.js +++ b/src/UI/Activity/Blacklist/BlacklistModel.js @@ -1,5 +1,5 @@ var Backbone = require('backbone'); -var SeriesCollection = require('../../Series/SeriesCollection'); +var ArtistCollection = require('../../Artist/ArtistCollection'); module.exports = Backbone.Model.extend({ @@ -11,7 +11,7 @@ module.exports = Backbone.Model.extend({ }, parse : function(model) { - model.series = SeriesCollection.get(model.seriesId); + model.artist = ArtistCollection.get(model.artistId); return model; } }); \ No newline at end of file