mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-20 13:33:34 -07:00
Refactor Blacklist for Album Releases (#48)
* Refactor Blacklist for Album Releases * Fix Test
This commit is contained in:
parent
87f13e5e9c
commit
337f74a184
14 changed files with 88 additions and 63 deletions
|
@ -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<int> EpisodeIds { get; set; }
|
||||
public int ArtistId { get; set; }
|
||||
public List<int> 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()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,10 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||
{
|
||||
_blacklist = new Blacklist
|
||||
{
|
||||
SeriesId = 12345,
|
||||
EpisodeIds = new List<int> { 1 },
|
||||
ArtistId = 12345,
|
||||
AlbumIds = new List<int> { 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,10 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||
{
|
||||
_event = new DownloadFailedEvent
|
||||
{
|
||||
SeriesId = 12345,
|
||||
EpisodeIds = new List<int> {1},
|
||||
ArtistId = 12345,
|
||||
AlbumIds = new List<int> {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<IBlacklistRepository>()
|
||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once());
|
||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.AlbumIds == _event.AlbumIds)), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.Blacklisting
|
|||
_event.Data.Remove("protocol");
|
||||
|
||||
Mocker.GetMock<IBlacklistRepository>()
|
||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.EpisodeIds == _event.EpisodeIds)), Times.Once());
|
||||
.Verify(v => v.Insert(It.Is<Blacklist>(b => b.AlbumIds == _event.AlbumIds)), Times.Once());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Blacklist>.CreateNew()
|
||||
.With(h => h.EpisodeIds = new List<int>())
|
||||
.With(h => h.AlbumIds = new List<int>())
|
||||
.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<Series>.CreateNew().BuildNew();
|
||||
var artist = Builder<Artist>.CreateNew().BuildNew();
|
||||
|
||||
Db.Insert(series);
|
||||
Db.Insert(artist);
|
||||
|
||||
var blacklist = Builder<Blacklist>.CreateNew()
|
||||
.With(h => h.EpisodeIds = new List<int>())
|
||||
.With(h => h.AlbumIds = new List<int>())
|
||||
.With(h => h.Quality = new QualityModel())
|
||||
.With(b => b.SeriesId = series.Id)
|
||||
.With(b => b.ArtistId = artist.Id)
|
||||
.BuildNew();
|
||||
|
||||
Db.Insert(blacklist);
|
||||
|
|
|
@ -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<int> EpisodeIds { get; set; }
|
||||
public int ArtistId { get; set; }
|
||||
public Artist Artist { get; set; }
|
||||
public List<int> AlbumIds { get; set; }
|
||||
public string SourceTitle { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
|
|
|
@ -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<Blacklist>
|
||||
{
|
||||
List<Blacklist> BlacklistedByTitle(int seriesId, string sourceTitle);
|
||||
List<Blacklist> BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash);
|
||||
List<Blacklist> BlacklistedBySeries(int seriesId);
|
||||
List<Blacklist> BlacklistedByTitle(int artistId, string sourceTitle);
|
||||
List<Blacklist> BlacklistedByTorrentInfoHash(int artistId, string torrentInfoHash);
|
||||
List<Blacklist> BlacklistedByArtist(int artistId);
|
||||
}
|
||||
|
||||
public class BlacklistRepository : BasicRepository<Blacklist>, IBlacklistRepository
|
||||
|
@ -20,26 +20,26 @@ namespace NzbDrone.Core.Blacklisting
|
|||
{
|
||||
}
|
||||
|
||||
public List<Blacklist> BlacklistedByTitle(int seriesId, string sourceTitle)
|
||||
public List<Blacklist> 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<Blacklist> BlacklistedByTorrentInfoHash(int seriesId, string torrentInfoHash)
|
||||
public List<Blacklist> 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<Blacklist> BlacklistedBySeries(int seriesId)
|
||||
public List<Blacklist> BlacklistedByArtist(int artistId)
|
||||
{
|
||||
return Query.Where(b => b.SeriesId == seriesId);
|
||||
return Query.Where(b => b.ArtistId == artistId);
|
||||
}
|
||||
|
||||
protected override SortBuilder<Blacklist> GetPagedQuery(QueryBuilder<Blacklist> query, PagingSpec<Blacklist> pagingSpec)
|
||||
{
|
||||
var baseQuery = query.Join<Blacklist, Series>(JoinType.Inner, h => h.Series, (h, s) => h.SeriesId == s.Id);
|
||||
var baseQuery = query.Join<Blacklist, Artist>(JoinType.Inner, h => h.Artist, (h, s) => h.ArtistId == s.Id);
|
||||
|
||||
return base.GetPagedQuery(baseQuery, pagingSpec);
|
||||
}
|
||||
|
|
|
@ -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<Blacklist> Paged(PagingSpec<Blacklist> pagingSpec);
|
||||
void Delete(int id);
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ namespace NzbDrone.Core.Blacklisting
|
|||
|
||||
IExecute<ClearBlacklistCommand>,
|
||||
IHandle<DownloadFailedEvent>,
|
||||
IHandleAsync<SeriesDeletedEvent>
|
||||
IHandleAsync<ArtistDeletedEvent>
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
|
24
src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs
Normal file
24
src/NzbDrone.Core/Datastore/Migration/113_music_blacklist.cs
Normal file
|
@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -295,6 +295,7 @@
|
|||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Datastore\Migration\105_rename_torrent_downloadstation.cs" />
|
||||
<Compile Include="Datastore\Migration\113_music_blacklist.cs" />
|
||||
<Compile Include="Datastore\Migration\112_music_history.cs" />
|
||||
<Compile Include="Datastore\Migration\111_setup_music.cs" />
|
||||
<Compile Include="Datastore\Migration\Framework\MigrationContext.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]"
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ var Collection = PageableCollection.extend({
|
|||
},
|
||||
|
||||
sortMappings : {
|
||||
'series' : { sortKey : 'series.sortTitle' }
|
||||
'artist' : { sortKey : 'artist.sortName' }
|
||||
},
|
||||
|
||||
parseState : function(resp) {
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue