Cleanup Conflicts in Sonarr/Lidarr Pulls

Co-Authored-By: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com>
pull/770/head
Qstick 3 years ago
parent ffc12656ee
commit 93ba5ade9e

@ -96,7 +96,7 @@
margin-left: 20px; margin-left: 20px;
} }
.artistNavigationButtons { .authorNavigationButtons {
position: absolute; position: absolute;
right: 0; right: 0;
white-space: nowrap; white-space: nowrap;

@ -25,7 +25,7 @@ function OrganizeAuthorModalContent(props) {
<ModalBody> <ModalBody>
<Alert> <Alert>
Tip: To preview a rename, select "Cancel", then select any artist name and use the Tip: To preview a rename, select "Cancel", then select any author name and use the
<Icon <Icon
className={styles.renameIcon} className={styles.renameIcon}
name={icons.ORGANIZE} name={icons.ORGANIZE}

@ -1,3 +1,3 @@
.albumRow { .bookRow {
cursor: pointer; cursor: pointer;
} }

@ -475,7 +475,7 @@ class InteractiveImportModalContent extends Component {
<SelectEditionModal <SelectEditionModal
isOpen={selectModalOpen === EDITION} isOpen={selectModalOpen === EDITION}
importIdsByBook={_.chain(items).filter((x) => x.album).groupBy((x) => x.book.id).mapValues((x) => x.map((y) => y.id)).value()} importIdsByBook={_.chain(items).filter((x) => x.book).groupBy((x) => x.book.id).mapValues((x) => x.map((y) => y.id)).value()}
books={_.chain(items).filter((x) => x.book).keyBy((x) => x.book.id).mapValues((x) => ({ matchedEditionId: x.editionId, book: x.book })).values().value()} books={_.chain(items).filter((x) => x.book).keyBy((x) => x.book.id).mapValues((x) => ({ matchedEditionId: x.editionId, book: x.book })).values().value()}
onModalClose={this.onSelectModalClose} onModalClose={this.onSelectModalClose}
/> />

@ -389,7 +389,7 @@ class MediaManagement extends Component {
type={inputTypes.UMASK} type={inputTypes.UMASK}
name="chmodFolder" name="chmodFolder"
helpText="Octal, applied during import/rename to media folders and files (without execute bits)" helpText="Octal, applied during import/rename to media folders and files (without execute bits)"
helpTextWarning="This only works if the user running Lidarr is the owner of the file. It's better to ensure the download client sets the permissions properly." helpTextWarning="This only works if the user running Readarr is the owner of the file. It's better to ensure the download client sets the permissions properly."
onChange={onInputChange} onChange={onInputChange}
{...settings.chmodFolder} {...settings.chmodFolder}
/> />

@ -9,7 +9,7 @@ function findMatchingItems(ids, items) {
}); });
} }
function createMatchingAuthorSelector() { function createUnorderedMatchingAuthorSelector() {
return createSelector( return createSelector(
(state, { authorIds }) => authorIds, (state, { authorIds }) => authorIds,
createAllAuthorSelector(), createAllAuthorSelector(),
@ -17,13 +17,13 @@ function createMatchingAuthorSelector() {
); );
} }
function createMatchingArtistSelector() { function createMatchingAuthorSelector() {
return createSelector( return createSelector(
createUnorderedMatchingArtistSelector(), createUnorderedMatchingAuthorSelector(),
(artists) => { (authors) => {
return artists.sort((artistA, artistB) => { return authors.sort((authorA, authorB) => {
const sortNameA = artistA.sortName; const sortNameA = authorA.sortName;
const sortNameB = artistB.sortName; const sortNameB = authorB.sortName;
if (sortNameA > sortNameB) { if (sortNameA > sortNameB) {
return 1; return 1;

@ -220,9 +220,9 @@ export const actionHandlers = handleThunks({
...bookFileIds.map((id) => { ...bookFileIds.map((id) => {
const props = {}; const props = {};
const trackFile = data.find((file) => file.id === id); const bookFile = data.find((file) => file.id === id);
props.qualityCutoffNotMet = trackFile.qualityCutoffNotMet; props.qualityCutoffNotMet = bookFile.qualityCutoffNotMet;
if (quality) { if (quality) {
props.quality = quality; props.quality = quality;

@ -4,6 +4,7 @@ import { createThunk, handleThunks } from 'Store/thunks';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer';
import createSetSettingValueReducer from './Creators/Reducers/createSetSettingValueReducer';
// //
// Variables // Variables
@ -96,6 +97,7 @@ export const defaultState = {
export const FETCH_SERIES = 'series/fetchSeries'; export const FETCH_SERIES = 'series/fetchSeries';
export const SET_SERIES_SORT = 'books/setSeriesSort'; export const SET_SERIES_SORT = 'books/setSeriesSort';
export const CLEAR_SERIES = 'series/clearSeries'; export const CLEAR_SERIES = 'series/clearSeries';
export const SET_SERIES_VALUE = 'books/setBookValue';
// //
// Action Creators // Action Creators
@ -118,6 +120,8 @@ export const reducers = createHandleActions({
[SET_SERIES_SORT]: createSetClientSideCollectionSortReducer(section), [SET_SERIES_SORT]: createSetClientSideCollectionSortReducer(section),
[SET_SERIES_VALUE]: createSetSettingValueReducer(section),
[CLEAR_SERIES]: (state) => { [CLEAR_SERIES]: (state) => {
return Object.assign({}, state, { return Object.assign({}, state, {
isFetching: false, isFetching: false,

@ -46,7 +46,7 @@ module.exports = {
// Modal // Modal
modalBodyPadding: '30px', modalBodyPadding: '30px',
// Artist // Author
authorIndexColumnPadding: '10px', authorIndexColumnPadding: '10px',
authorIndexColumnPaddingSmallScreen: '5px', authorIndexColumnPaddingSmallScreen: '5px',
authorIndexOverviewInfoRowHeight: '21px' authorIndexOverviewInfoRowHeight: '21px'

@ -44,8 +44,8 @@
<!-- TV, Movies --> <!-- TV, Movies -->
<xs:enumeration value="genre" /> <xs:enumeration value="genre" />
<!-- Music --> <!-- Music -->
<xs:enumeration value="artist" /> <xs:enumeration value="author" />
<xs:enumeration value="album" /> <xs:enumeration value="book" />
<xs:enumeration value="publisher" /> <xs:enumeration value="publisher" />
<xs:enumeration value="tracks" /> <xs:enumeration value="tracks" />
<!-- Mixed --> <!-- Mixed -->

@ -18,7 +18,7 @@ namespace NzbDrone.Automation.Test
} }
[Test] [Test]
public void artist_page() public void author_page()
{ {
_page.LibraryNavIcon.Click(); _page.LibraryNavIcon.Click();
_page.WaitForNoSpinner(); _page.WaitForNoSpinner();
@ -78,7 +78,7 @@ namespace NzbDrone.Automation.Test
} }
[Test] [Test]
public void add_artist_page() public void add_author_page()
{ {
_page.LibraryNavIcon.Click(); _page.LibraryNavIcon.Click();
_page.WaitForNoSpinner(); _page.WaitForNoSpinner();

@ -125,16 +125,16 @@ namespace NzbDrone.Common.Test.DiskTests
[Test] [Test]
public void should_be_able_to_delete_nested_empty_subdirs() public void should_be_able_to_delete_nested_empty_subdirs()
{ {
var artistDir = Path.Combine(GetTempFilePath(), "Artist"); var authorDir = Path.Combine(GetTempFilePath(), "Author");
var albumDir = Path.Combine(artistDir, "Album"); var bookDir = Path.Combine(authorDir, "Book");
Directory.CreateDirectory(Path.Combine(albumDir)); Directory.CreateDirectory(Path.Combine(bookDir));
Directory.CreateDirectory(Path.Combine(albumDir, "Album")); Directory.CreateDirectory(Path.Combine(bookDir, "Book"));
Directory.CreateDirectory(Path.Combine(albumDir, "Album", "CD1")); Directory.CreateDirectory(Path.Combine(bookDir, "Book", "CD1"));
Directory.CreateDirectory(Path.Combine(albumDir, "Album", "CD2")); Directory.CreateDirectory(Path.Combine(bookDir, "Book", "CD2"));
Subject.RemoveEmptySubfolders(artistDir); Subject.RemoveEmptySubfolders(authorDir);
Directory.Exists(albumDir).Should().BeFalse(); Directory.Exists(bookDir).Should().BeFalse();
} }
[Test] [Test]

@ -283,13 +283,13 @@ namespace NzbDrone.Common.Test.Http
{ {
var file = GetTempFilePath(); var file = GetTempFilePath();
var url = "https://lidarr.audio/img/slider/artistdetails.png"; var url = "https://readarr.com/img/slider/artistdetails.png";
Subject.DownloadFile(url, file); Subject.DownloadFile(url, file);
var fileInfo = new FileInfo(file); var fileInfo = new FileInfo(file);
fileInfo.Exists.Should().BeTrue(); fileInfo.Exists.Should().BeTrue();
fileInfo.Length.Should().Be(146122); fileInfo.Length.Should().Be(192367);
} }
[Test] [Test]
@ -298,7 +298,7 @@ namespace NzbDrone.Common.Test.Http
var file = GetTempFilePath(); var file = GetTempFilePath();
var request = new HttpRequestBuilder($"https://{_httpBinHost}/redirect-to") var request = new HttpRequestBuilder($"https://{_httpBinHost}/redirect-to")
.AddQueryParam("url", $"https://lidarr.audio/img/slider/artistdetails.png") .AddQueryParam("url", $"https://readarr.com/img/slider/artistdetails.png")
.Build(); .Build();
Subject.DownloadFile(request.Url.FullUri, file); Subject.DownloadFile(request.Url.FullUri, file);
@ -307,7 +307,7 @@ namespace NzbDrone.Common.Test.Http
var fileInfo = new FileInfo(file); var fileInfo = new FileInfo(file);
fileInfo.Exists.Should().BeTrue(); fileInfo.Exists.Should().BeTrue();
fileInfo.Length.Should().Be(146122); fileInfo.Length.Should().Be(192367);
} }
[Test] [Test]

@ -17,9 +17,11 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")] [TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")]
[TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")] [TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")]
[TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")] [TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")]
// NzbGet // NzbGet
[TestCase(@"{ ""Name"" : ""ControlUsername"", ""Value"" : ""mySecret"" }, { ""Name"" : ""ControlPassword"", ""Value"" : ""mySecret"" }, ")] [TestCase(@"{ ""Name"" : ""ControlUsername"", ""Value"" : ""mySecret"" }, { ""Name"" : ""ControlPassword"", ""Value"" : ""mySecret"" }, ")]
[TestCase(@"{ ""Name"" : ""Server1.Username"", ""Value"" : ""mySecret"" }, { ""Name"" : ""Server1.Password"", ""Value"" : ""mySecret"" }, ")] [TestCase(@"{ ""Name"" : ""Server1.Username"", ""Value"" : ""mySecret"" }, { ""Name"" : ""Server1.Password"", ""Value"" : ""mySecret"" }, ")]
// Sabnzbd // Sabnzbd
[TestCase(@"http://127.0.0.1:1234/api/call?vv=1&apikey=mySecret")] [TestCase(@"http://127.0.0.1:1234/api/call?vv=1&apikey=mySecret")]
[TestCase(@"http://127.0.0.1:1234/api/call?vv=1&ma_username=mySecret&ma_password=mySecret")] [TestCase(@"http://127.0.0.1:1234/api/call?vv=1&ma_username=mySecret&ma_password=mySecret")]
@ -30,6 +32,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@"""misc"":{""username"":""mySecret"",""api_key"":""mySecret"",""password"":""mySecret"",""nzb_key"":""mySecret""}")] [TestCase(@"""misc"":{""username"":""mySecret"",""api_key"":""mySecret"",""password"":""mySecret"",""nzb_key"":""mySecret""}")]
[TestCase(@"""servers"":[{""username"":""mySecret"",""password"":""mySecret""}]")] [TestCase(@"""servers"":[{""username"":""mySecret"",""password"":""mySecret""}]")]
[TestCase(@"""misc"":{""email_account"":""mySecret"",""email_to"":[],""email_from"":"""",""email_pwd"":""mySecret""}")] [TestCase(@"""misc"":{""email_account"":""mySecret"",""email_to"":[],""email_from"":"""",""email_pwd"":""mySecret""}")]
// uTorrent // uTorrent
[TestCase(@"http://localhost:9091/gui/?token=wThmph5l0ZXfH-a6WOA4lqiLvyjCP0FpMrMeXmySecret_VXBO11HoKL751MAAAAA&list=1")] [TestCase(@"http://localhost:9091/gui/?token=wThmph5l0ZXfH-a6WOA4lqiLvyjCP0FpMrMeXmySecret_VXBO11HoKL751MAAAAA&list=1")]
[TestCase(@",[""boss_key"",0,""mySecret"",{""access"":""Y""}],[""boss_key_salt"",0,""mySecret"",{""access"":""W""}]")] [TestCase(@",[""boss_key"",0,""mySecret"",{""access"":""Y""}],[""boss_key_salt"",0,""mySecret"",{""access"":""W""}]")]
@ -37,18 +40,23 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@",[""webui.uconnect_username"",2,""mySecret"",{""access"":""Y""}],[""webui.uconnect_password"",2,""mySecret"",{""access"":""Y""}]")] [TestCase(@",[""webui.uconnect_username"",2,""mySecret"",{""access"":""Y""}],[""webui.uconnect_password"",2,""mySecret"",{""access"":""Y""}]")]
[TestCase(@",[""proxy.proxy"",2,""mySecret"",{""access"":""Y""}]")] [TestCase(@",[""proxy.proxy"",2,""mySecret"",{""access"":""Y""}]")]
[TestCase(@",[""proxy.username"",2,""mySecret"",{""access"":""Y""}],[""proxy.password"",2,""mySecret"",{""access"":""Y""}]")] [TestCase(@",[""proxy.username"",2,""mySecret"",{""access"":""Y""}],[""proxy.password"",2,""mySecret"",{""access"":""Y""}]")]
// Deluge // Deluge
[TestCase(@",{""download_location"": ""C:\Users\\mySecret mySecret\\Downloads""}")] [TestCase(@",{""download_location"": ""C:\Users\\mySecret mySecret\\Downloads""}")]
[TestCase(@",{""download_location"": ""/home/mySecret/Downloads""}")] [TestCase(@",{""download_location"": ""/home/mySecret/Downloads""}")]
[TestCase(@"auth.login(""mySecret"")")] [TestCase(@"auth.login(""mySecret"")")]
// Download Station // Download Station
[TestCase(@"webapi/entry.cgi?api=(removed)&version=2&method=login&account=01233210&passwd=mySecret&format=sid&session=DownloadStation")] [TestCase(@"webapi/entry.cgi?api=(removed)&version=2&method=login&account=01233210&passwd=mySecret&format=sid&session=DownloadStation")]
// BroadcastheNet // BroadcastheNet
[TestCase(@"method: ""getTorrents"", ""params"": [ ""mySecret"",")] [TestCase(@"method: ""getTorrents"", ""params"": [ ""mySecret"",")]
[TestCase(@"getTorrents(""mySecret"", [asdfasdf], 100, 0)")] [TestCase(@"getTorrents(""mySecret"", [asdfasdf], 100, 0)")]
[TestCase(@"""DownloadURL"":""https:\/\/broadcasthe.net\/torrents.php?action=download&id=123&authkey=mySecret&torrent_pass=mySecret""")] [TestCase(@"""DownloadURL"":""https:\/\/broadcasthe.net\/torrents.php?action=download&id=123&authkey=mySecret&torrent_pass=mySecret""")]
// Spotify Refresh // Spotify Refresh
[TestCase(@"https://auth.servarr.com/renew?refresh_token=mySecret")] [TestCase(@"https://auth.servarr.com/renew?refresh_token=mySecret")]
// Plex // Plex
[TestCase(@" http://localhost:32400/library/metadata/12345/refresh?X-Plex-Client-Identifier=1234530f-422f-4aac-b6b3-01233210aaaa&X-Plex-Product=Sonarr&X-Plex-Platform=Windows&X-Plex-Platform-Version=7&X-Plex-Device-Name=Sonarr&X-Plex-Version=3.0.3.833&X-Plex-Token=mySecret")] [TestCase(@" http://localhost:32400/library/metadata/12345/refresh?X-Plex-Client-Identifier=1234530f-422f-4aac-b6b3-01233210aaaa&X-Plex-Product=Sonarr&X-Plex-Platform=Windows&X-Plex-Platform-Version=7&X-Plex-Device-Name=Sonarr&X-Plex-Version=3.0.3.833&X-Plex-Token=mySecret")]
public void should_clean_message(string message) public void should_clean_message(string message)

@ -292,28 +292,28 @@ namespace NzbDrone.Common.Test
public void GetAncestorFolders_should_return_all_ancestors_in_path_Windows() public void GetAncestorFolders_should_return_all_ancestors_in_path_Windows()
{ {
WindowsOnly(); WindowsOnly();
var path = @"C:\Test\Music\Artist Title"; var path = @"C:\Test\Music\Author Title";
var result = path.GetAncestorFolders(); var result = path.GetAncestorFolders();
result.Count.Should().Be(4); result.Count.Should().Be(4);
result[0].Should().Be(@"C:\"); result[0].Should().Be(@"C:\");
result[1].Should().Be(@"Test"); result[1].Should().Be(@"Test");
result[2].Should().Be(@"Music"); result[2].Should().Be(@"Music");
result[3].Should().Be(@"Artist Title"); result[3].Should().Be(@"Author Title");
} }
[Test] [Test]
public void GetAncestorFolders_should_return_all_ancestors_in_path_Linux() public void GetAncestorFolders_should_return_all_ancestors_in_path_Linux()
{ {
PosixOnly(); PosixOnly();
var path = @"/Test/Music/Artist Title"; var path = @"/Test/Music/Author Title";
var result = path.GetAncestorFolders(); var result = path.GetAncestorFolders();
result.Count.Should().Be(4); result.Count.Should().Be(4);
result[0].Should().Be(@"/"); result[0].Should().Be(@"/");
result[1].Should().Be(@"Test"); result[1].Should().Be(@"Test");
result[2].Should().Be(@"Music"); result[2].Should().Be(@"Music");
result[3].Should().Be(@"Artist Title"); result[3].Should().Be(@"Author Title");
} }
} }
} }

@ -1,4 +1,3 @@
using System;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;

@ -9,38 +9,38 @@ using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ArtistStatsTests namespace NzbDrone.Core.Test.AuthorStatsTests
{ {
[TestFixture] [TestFixture]
public class ArtistStatisticsFixture : DbTest<AuthorStatisticsRepository, Author> public class AuthorStatisticsFixture : DbTest<AuthorStatisticsRepository, Author>
{ {
private Author _artist; private Author _author;
private Book _album; private Book _book;
private Edition _edition; private Edition _edition;
private BookFile _trackFile; private BookFile _trackFile;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.With(a => a.AuthorMetadataId = 10) .With(a => a.AuthorMetadataId = 10)
.BuildNew(); .BuildNew();
Db.Insert(_artist); Db.Insert(_author);
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.With(e => e.ReleaseDate = DateTime.Today.AddDays(-5)) .With(e => e.ReleaseDate = DateTime.Today.AddDays(-5))
.With(e => e.AuthorMetadataId = 10) .With(e => e.AuthorMetadataId = 10)
.BuildNew(); .BuildNew();
Db.Insert(_album); Db.Insert(_book);
_edition = Builder<Edition>.CreateNew() _edition = Builder<Edition>.CreateNew()
.With(e => e.BookId = _album.Id) .With(e => e.BookId = _book.Id)
.With(e => e.Monitored = true) .With(e => e.Monitored = true)
.BuildNew(); .BuildNew();
Db.Insert(_edition); Db.Insert(_edition);
_trackFile = Builder<BookFile>.CreateNew() _trackFile = Builder<BookFile>.CreateNew()
.With(e => e.Author = _artist) .With(e => e.Author = _author)
.With(e => e.Edition = _edition) .With(e => e.Edition = _edition)
.With(e => e.EditionId == _edition.Id) .With(e => e.EditionId == _edition.Id)
.With(e => e.Quality = new QualityModel(Quality.MP3_320)) .With(e => e.Quality = new QualityModel(Quality.MP3_320))
@ -53,7 +53,7 @@ namespace NzbDrone.Core.Test.ArtistStatsTests
} }
[Test] [Test]
public void should_get_stats_for_artist() public void should_get_stats_for_author()
{ {
var stats = Subject.AuthorStatistics(); var stats = Subject.AuthorStatistics();

@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test.Blacklisting
AuthorId = 12345, AuthorId = 12345,
BookIds = new List<int> { 1 }, BookIds = new List<int> { 1 },
Quality = new QualityModel(Quality.FLAC), Quality = new QualityModel(Quality.FLAC),
SourceTitle = "artist.name.album.title", SourceTitle = "author.name.book.title",
Date = DateTime.UtcNow Date = DateTime.UtcNow
}; };
} }
@ -35,7 +35,7 @@ namespace NzbDrone.Core.Test.Blacklisting
} }
[Test] [Test]
public void should_should_have_album_ids() public void should_should_have_book_ids()
{ {
Subject.Insert(_blacklist); Subject.Insert(_blacklist);

@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test.Blacklisting
AuthorId = 12345, AuthorId = 12345,
BookIds = new List<int> { 1 }, BookIds = new List<int> { 1 },
Quality = new QualityModel(Quality.MP3_320), Quality = new QualityModel(Quality.MP3_320),
SourceTitle = "artist.name.album.title", SourceTitle = "author.name.book.title",
DownloadClient = "SabnzbdClient", DownloadClient = "SabnzbdClient",
DownloadId = "Sabnzbd_nzo_2dfh73k" DownloadId = "Sabnzbd_nzo_2dfh73k"
}; };

@ -15,13 +15,13 @@ namespace NzbDrone.Core.Test.Datastore
[Test] [Test]
public void one_to_one() public void one_to_one()
{ {
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.With(c => c.Id = 0) .With(c => c.Id = 0)
.With(x => x.ReleaseDate = DateTime.UtcNow) .With(x => x.ReleaseDate = DateTime.UtcNow)
.With(x => x.LastInfoSync = DateTime.UtcNow) .With(x => x.LastInfoSync = DateTime.UtcNow)
.With(x => x.Added = DateTime.UtcNow) .With(x => x.Added = DateTime.UtcNow)
.BuildNew(); .BuildNew();
Db.Insert(album); Db.Insert(book);
} }
[Test] [Test]

@ -34,31 +34,31 @@ namespace NzbDrone.Core.Test.Datastore
.Build(); .Build();
Db.Insert(metadata); Db.Insert(metadata);
var artist = Builder<Author>.CreateListOfSize(1) var author = Builder<Author>.CreateListOfSize(1)
.All() .All()
.With(v => v.Id = 0) .With(v => v.Id = 0)
.With(v => v.QualityProfileId = profile.Id) .With(v => v.QualityProfileId = profile.Id)
.With(v => v.AuthorMetadataId = metadata.Id) .With(v => v.AuthorMetadataId = metadata.Id)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(artist); Db.InsertMany(author);
var albums = Builder<Book>.CreateListOfSize(3) var books = Builder<Book>.CreateListOfSize(3)
.All() .All()
.With(v => v.Id = 0) .With(v => v.Id = 0)
.With(v => v.AuthorMetadataId = metadata.Id) .With(v => v.AuthorMetadataId = metadata.Id)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(albums); Db.InsertMany(books);
var editions = new List<Edition>(); var editions = new List<Edition>();
foreach (var album in albums) foreach (var book in books)
{ {
editions.Add( editions.Add(
Builder<Edition>.CreateNew() Builder<Edition>.CreateNew()
.With(v => v.Id = 0) .With(v => v.Id = 0)
.With(v => v.BookId = album.Id) .With(v => v.BookId = book.Id)
.With(v => v.ForeignEditionId = "test" + album.Id) .With(v => v.ForeignEditionId = "test" + book.Id)
.Build()); .Build());
} }
@ -75,7 +75,7 @@ namespace NzbDrone.Core.Test.Datastore
} }
[Test] [Test]
public void should_lazy_load_artist_for_trackfile() public void should_lazy_load_author_for_trackfile()
{ {
var db = Mocker.Resolve<IDatabase>(); var db = Mocker.Resolve<IDatabase>();
var tracks = db.Query<BookFile>(new SqlBuilder()).ToList(); var tracks = db.Query<BookFile>(new SqlBuilder()).ToList();
@ -112,7 +112,7 @@ namespace NzbDrone.Core.Test.Datastore
new SqlBuilder() new SqlBuilder()
.Join<BookFile, Edition>((t, a) => t.EditionId == a.Id) .Join<BookFile, Edition>((t, a) => t.EditionId == a.Id)
.Join<Edition, Book>((e, b) => e.BookId == b.Id) .Join<Edition, Book>((e, b) => e.BookId == b.Id)
.Join<Book, Author>((album, artist) => album.AuthorMetadataId == artist.AuthorMetadataId) .Join<Book, Author>((book, author) => book.AuthorMetadataId == author.AuthorMetadataId)
.Join<Author, AuthorMetadata>((a, m) => a.AuthorMetadataId == m.Id)); .Join<Author, AuthorMetadata>((a, m) => a.AuthorMetadataId == m.Id));
Assert.IsNotEmpty(files); Assert.IsNotEmpty(files);

@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Datastore
public class TypeWithNoMappableProperties public class TypeWithNoMappableProperties
{ {
public Author Artist { get; set; } public Author Author { get; set; }
public int ReadOnly { get; private set; } public int ReadOnly { get; private set; }
public int WriteOnly { private get; set; } public int WriteOnly { private get; set; }

@ -54,12 +54,12 @@ namespace NzbDrone.Core.Test.Datastore
[Test] [Test]
public void where_equal_property() public void where_equal_property()
{ {
var artist = new Author { Id = 10 }; var author = new Author { Id = 10 };
_subject = Where(x => x.Id == artist.Id); _subject = Where(x => x.Id == author.Id);
_subject.Parameters.ParameterNames.Should().HaveCount(1); _subject.Parameters.ParameterNames.Should().HaveCount(1);
_subject.ToString().Should().Be($"(\"Authors\".\"Id\" = @Clause1_P1)"); _subject.ToString().Should().Be($"(\"Authors\".\"Id\" = @Clause1_P1)");
_subject.Parameters.Get<int>("Clause1_P1").Should().Be(artist.Id); _subject.Parameters.Get<int>("Clause1_P1").Should().Be(author.Id);
} }
[Test] [Test]
@ -108,8 +108,8 @@ namespace NzbDrone.Core.Test.Datastore
[Test] [Test]
public void where_equal_null_property() public void where_equal_null_property()
{ {
var artist = new Author { CleanName = null }; var author = new Author { CleanName = null };
_subject = Where(x => x.CleanName == artist.CleanName); _subject = Where(x => x.CleanName == author.CleanName);
_subject.ToString().Should().Be($"(\"Authors\".\"CleanName\" IS NULL)"); _subject.ToString().Should().Be($"(\"Authors\".\"CleanName\" IS NULL)");
} }

@ -20,9 +20,9 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
public class AlreadyImportedSpecificationFixture : CoreTest<AlreadyImportedSpecification> public class AlreadyImportedSpecificationFixture : CoreTest<AlreadyImportedSpecification>
{ {
private const int FIRST_ALBUM_ID = 1; private const int FIRST_ALBUM_ID = 1;
private const string TITLE = "Some.Artist-Some.Album-2018-320kbps-CD-Readarr"; private const string TITLE = "Some.Author-Some.Book-2018-320kbps-CD-Readarr";
private Author _artist; private Author _author;
private QualityModel _mp3; private QualityModel _mp3;
private QualityModel _flac; private QualityModel _flac;
private RemoteBook _remoteBook; private RemoteBook _remoteBook;
@ -32,16 +32,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
var singleAlbumList = new List<Book> var singleBookList = new List<Book>
{ {
new Book new Book
{ {
Id = FIRST_ALBUM_ID, Id = FIRST_ALBUM_ID,
Title = "Some Album" Title = "Some Book"
} }
}; };
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.Build(); .Build();
_firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now }; _firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now };
@ -51,9 +51,9 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_remoteBook = new RemoteBook _remoteBook = new RemoteBook
{ {
Author = _artist, Author = _author,
ParsedBookInfo = new ParsedBookInfo { Quality = _mp3 }, ParsedBookInfo = new ParsedBookInfo { Quality = _mp3 },
Books = singleAlbumList, Books = singleBookList,
Release = Builder<ReleaseInfo>.CreateNew() Release = Builder<ReleaseInfo>.CreateNew()
.Build() .Build()
}; };
@ -101,7 +101,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_be_accepted_if_album_does_not_have_a_file() public void should_be_accepted_if_book_does_not_have_a_file()
{ {
Mocker.GetMock<IMediaFileService>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetFilesByBook(It.IsAny<int>())) .Setup(c => c.GetFilesByBook(It.IsAny<int>()))
@ -111,13 +111,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_be_accepted_if_album_does_not_have_grabbed_event() public void should_be_accepted_if_book_does_not_have_grabbed_event()
{ {
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_be_accepted_if_album_does_not_have_imported_event() public void should_be_accepted_if_book_does_not_have_imported_event()
{ {
GivenHistoryItem(Guid.NewGuid().ToString().ToUpper(), TITLE, _mp3, HistoryEventType.Grabbed); GivenHistoryItem(Guid.NewGuid().ToString().ToUpper(), TITLE, _mp3, HistoryEventType.Grabbed);

@ -14,7 +14,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
private static readonly int NoPreferredWordScore = 0; private static readonly int NoPreferredWordScore = 0;
[Test] [Test]
public void should_return_true_if_current_album_is_less_than_cutoff() public void should_return_true_if_current_book_is_less_than_cutoff()
{ {
Subject.CutoffNotMet( Subject.CutoffNotMet(
new QualityProfile new QualityProfile
@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_false_if_current_album_is_equal_to_cutoff() public void should_return_false_if_current_book_is_equal_to_cutoff()
{ {
Subject.CutoffNotMet( Subject.CutoffNotMet(
new QualityProfile new QualityProfile
@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_false_if_current_album_is_greater_than_cutoff() public void should_return_false_if_current_book_is_greater_than_cutoff()
{ {
Subject.CutoffNotMet( Subject.CutoffNotMet(
new QualityProfile new QualityProfile
@ -53,7 +53,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_when_new_album_is_proper_but_existing_is_not() public void should_return_true_when_new_book_is_proper_but_existing_is_not()
{ {
Subject.CutoffNotMet( Subject.CutoffNotMet(
new QualityProfile new QualityProfile

@ -20,7 +20,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
var artist = Builder<Author>.CreateNew().With(s => s.Id = 1234).Build(); var author = Builder<Author>.CreateNew().With(s => s.Id = 1234).Build();
_remoteBook = new RemoteBook _remoteBook = new RemoteBook
{ {
ParsedBookInfo = new ParsedBookInfo ParsedBookInfo = new ParsedBookInfo
@ -30,12 +30,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Books = Builder<Book>.CreateListOfSize(3) Books = Builder<Book>.CreateListOfSize(3)
.All() .All()
.With(e => e.ReleaseDate = DateTime.UtcNow.AddDays(-8)) .With(e => e.ReleaseDate = DateTime.UtcNow.AddDays(-8))
.With(s => s.AuthorId = artist.Id) .With(s => s.AuthorId = author.Id)
.BuildList(), .BuildList(),
Author = artist, Author = author,
Release = new ReleaseInfo Release = new ReleaseInfo
{ {
Title = "Artist.Discography.1978.2005.FLAC-RlsGrp" Title = "Author.Discography.1978.2005.FLAC-RlsGrp"
} }
}; };
@ -52,20 +52,20 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_if_all_albums_have_released() public void should_return_true_if_all_books_have_released()
{ {
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_return_false_if_one_album_has_not_released() public void should_return_false_if_one_book_has_not_released()
{ {
_remoteBook.Books.Last().ReleaseDate = DateTime.UtcNow.AddDays(+2); _remoteBook.Books.Last().ReleaseDate = DateTime.UtcNow.AddDays(+2);
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_false_if_an_album_does_not_have_an_release_date() public void should_return_false_if_an_book_does_not_have_an_release_date()
{ {
_remoteBook.Books.Last().ReleaseDate = null; _remoteBook.Books.Last().ReleaseDate = null;
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();

@ -147,7 +147,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_not_attempt_to_map_album_if_not_parsable() public void should_not_attempt_to_map_book_if_not_parsable()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
_reports[0].Title = "Not parsable"; _reports[0].Title = "Not parsable";
@ -159,11 +159,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never()); _pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never()); _pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never()); _pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
} }
[Test] [Test]
public void should_not_attempt_to_map_album_if_artist_title_is_blank() public void should_not_attempt_to_map_book_if_author_title_is_blank()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
_reports[0].Title = "2013 - Night Visions"; _reports[0].Title = "2013 - Night Visions";
@ -185,20 +184,20 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
_reports[0].Title = "1937 - Snow White and the Seven Dwarves"; _reports[0].Title = "1937 - Snow White and the Seven Dwarves";
var artist = new Artist { Name = "Some Artist" }; var author = new Author { Name = "Some Author" };
var albums = new List<Album> { new Album { Title = "Some Album" } }; var books = new List<Book> { new Book { Title = "Some Book" } };
Subject.GetSearchDecision(_reports, new AlbumSearchCriteria { Artist = artist, Albums = albums }).ToList(); Subject.GetSearchDecision(_reports, new BookSearchCriteria { Author = author, Books = books }).ToList();
Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedAlbumInfo>(), It.IsAny<SearchCriteriaBase>()), Times.Never()); Mocker.GetMock<IParsingService>().Verify(c => c.Map(It.IsAny<ParsedBookInfo>(), It.IsAny<SearchCriteriaBase>()), Times.Never());
_pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteAlbum>(), null), Times.Never()); _pass1.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
_pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteAlbum>(), null), Times.Never()); _pass2.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
_pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteAlbum>(), null), Times.Never()); _pass3.Verify(c => c.IsSatisfiedBy(It.IsAny<RemoteBook>(), null), Times.Never());
} }
[Test] [Test]
public void should_not_attempt_to_make_decision_if_artist_is_unknown() public void should_not_attempt_to_make_decision_if_author_is_unknown()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
@ -234,7 +233,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_unknown_artist_rejection_if_artist_is_unknown() public void should_return_unknown_author_rejection_if_author_is_unknown()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
@ -246,22 +245,22 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_only_include_reports_for_requested_albums() public void should_only_include_reports_for_requested_books()
{ {
var artist = Builder<Author>.CreateNew().Build(); var author = Builder<Author>.CreateNew().Build();
var albums = Builder<Book>.CreateListOfSize(2) var books = Builder<Book>.CreateListOfSize(2)
.All() .All()
.With(v => v.AuthorId, artist.Id) .With(v => v.AuthorId, author.Id)
.With(v => v.Author, new LazyLoaded<Author>(artist)) .With(v => v.Author, new LazyLoaded<Author>(author))
.BuildList(); .BuildList();
var criteria = new AuthorSearchCriteria { Books = albums.Take(1).ToList() }; var criteria = new AuthorSearchCriteria { Books = books.Take(1).ToList() };
var reports = albums.Select(v => var reports = books.Select(v =>
new ReleaseInfo() new ReleaseInfo()
{ {
Title = string.Format("{0}-{1}[FLAC][2017][DRONE]", artist.Name, v.Title) Title = string.Format("{0}-{1}[FLAC][2017][DRONE]", author.Name, v.Title)
}).ToList(); }).ToList();
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
@ -271,8 +270,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
DownloadAllowed = true, DownloadAllowed = true,
ParsedBookInfo = p, ParsedBookInfo = p,
Author = artist, Author = author,
Books = albums.Where(v => v.Title == p.BookTitle).ToList() Books = books.Where(v => v.Title == p.BookTitle).ToList()
}); });
Mocker.SetConstant<IEnumerable<IDecisionEngineSpecification>>(new List<IDecisionEngineSpecification> Mocker.SetConstant<IEnumerable<IDecisionEngineSpecification>>(new List<IDecisionEngineSpecification>
@ -288,7 +287,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_not_allow_download_if_artist_is_unknown() public void should_not_allow_download_if_author_is_unknown()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);
@ -302,7 +301,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_not_allow_download_if_no_albums_found() public void should_not_allow_download_if_no_books_found()
{ {
GivenSpecifications(_pass1, _pass2, _pass3); GivenSpecifications(_pass1, _pass2, _pass3);

@ -17,27 +17,27 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[TestFixture] [TestFixture]
public class EarlyReleaseSpecificationFixture : TestBase<EarlyReleaseSpecification> public class EarlyReleaseSpecificationFixture : TestBase<EarlyReleaseSpecification>
{ {
private Author _artist; private Author _author;
private Book _album1; private Book _book1;
private Book _album2; private Book _book2;
private RemoteBook _remoteBook; private RemoteBook _remoteBook;
private IndexerDefinition _indexerDefinition; private IndexerDefinition _indexerDefinition;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew().With(s => s.Id = 1).Build(); _author = Builder<Author>.CreateNew().With(s => s.Id = 1).Build();
_album1 = Builder<Book>.CreateNew().With(s => s.ReleaseDate = DateTime.Today).Build(); _book1 = Builder<Book>.CreateNew().With(s => s.ReleaseDate = DateTime.Today).Build();
_album2 = Builder<Book>.CreateNew().With(s => s.ReleaseDate = DateTime.Today).Build(); _book2 = Builder<Book>.CreateNew().With(s => s.ReleaseDate = DateTime.Today).Build();
_remoteBook = new RemoteBook _remoteBook = new RemoteBook
{ {
Author = _artist, Author = _author,
Books = new List<Book> { _album1 }, Books = new List<Book> { _book1 },
Release = new TorrentInfo Release = new TorrentInfo
{ {
IndexerId = 1, IndexerId = 1,
Title = "Artist - Album [FLAC-RlsGrp]", Title = "Author - Book [FLAC-RlsGrp]",
PublishDate = DateTime.Today PublishDate = DateTime.Today
} }
}; };
@ -66,9 +66,9 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_if_release_contains_multiple_albums() public void should_return_true_if_release_contains_multiple_books()
{ {
_remoteBook.Books.Add(_album2); _remoteBook.Books.Add(_book2);
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
} }

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
private RemoteBook _parseResultSingle; private RemoteBook _parseResultSingle;
private QualityModel _upgradableQuality; private QualityModel _upgradableQuality;
private QualityModel _notupgradableQuality; private QualityModel _notupgradableQuality;
private Author _fakeArtist; private Author _fakeAuthor;
[SetUp] [SetUp]
public void Setup() public void Setup()
@ -37,15 +37,15 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Mocker.Resolve<UpgradableSpecification>(); Mocker.Resolve<UpgradableSpecification>();
_upgradeHistory = Mocker.Resolve<HistorySpecification>(); _upgradeHistory = Mocker.Resolve<HistorySpecification>();
var singleAlbumList = new List<Book> { new Book { Id = FIRST_ALBUM_ID } }; var singleBookList = new List<Book> { new Book { Id = FIRST_ALBUM_ID } };
var doubleAlbumList = new List<Book> var doubleBookList = new List<Book>
{ {
new Book { Id = FIRST_ALBUM_ID }, new Book { Id = FIRST_ALBUM_ID },
new Book { Id = SECOND_ALBUM_ID }, new Book { Id = SECOND_ALBUM_ID },
new Book { Id = 3 } new Book { Id = 3 }
}; };
_fakeArtist = Builder<Author>.CreateNew() _fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.QualityProfile = new QualityProfile .With(c => c.QualityProfile = new QualityProfile
{ {
UpgradeAllowed = true, UpgradeAllowed = true,
@ -56,16 +56,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_parseResultMulti = new RemoteBook _parseResultMulti = new RemoteBook
{ {
Author = _fakeArtist, Author = _fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = doubleAlbumList Books = doubleBookList
}; };
_parseResultSingle = new RemoteBook _parseResultSingle = new RemoteBook
{ {
Author = _fakeArtist, Author = _fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = singleAlbumList Books = singleBookList
}; };
_upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
@ -76,7 +76,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Returns(true); .Returns(true);
} }
private void GivenMostRecentForAlbum(int bookId, string downloadId, QualityModel quality, DateTime date, HistoryEventType eventType) private void GivenMostRecentForBook(int bookId, string downloadId, QualityModel quality, DateTime date, HistoryEventType eventType)
{ {
Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForBook(bookId)) Mocker.GetMock<IHistoryService>().Setup(s => s.MostRecentForBook(bookId))
.Returns(new History.History { DownloadId = downloadId, Quality = quality, Date = date, EventType = eventType }); .Returns(new History.History { DownloadId = downloadId, Quality = quality, Date = date, EventType = eventType });
@ -105,7 +105,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_true_if_latest_history_item_is_not_grabbed() public void should_return_true_if_latest_history_item_is_not_grabbed()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.DownloadFailed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.DownloadFailed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
@ -118,57 +118,57 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_true_if_latest_history_item_is_older_than_twelve_hours() public void should_return_true_if_latest_history_item_is_older_than_twelve_hours()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow.AddHours(-12).AddMilliseconds(-1), HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow.AddHours(-12).AddMilliseconds(-1), HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_be_upgradable_if_only_album_is_upgradable() public void should_be_upgradable_if_only_book_is_upgradable()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_be_upgradable_if_both_albums_are_upgradable() public void should_be_upgradable_if_both_books_are_upgradable()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
GivenMostRecentForAlbum(SECOND_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(SECOND_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_not_be_upgradable_if_both_albums_are_not_upgradable() public void should_not_be_upgradable_if_both_books_are_not_upgradable()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
GivenMostRecentForAlbum(SECOND_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(SECOND_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_be_not_upgradable_if_only_first_albums_is_upgradable() public void should_be_not_upgradable_if_only_first_books_is_upgradable()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_be_not_upgradable_if_only_second_albums_is_upgradable() public void should_be_not_upgradable_if_only_second_books_is_upgradable()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
GivenMostRecentForAlbum(SECOND_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(SECOND_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_not_be_upgradable_if_album_is_of_same_quality_as_existing() public void should_not_be_upgradable_if_book_is_of_same_quality_as_existing()
{ {
_fakeArtist.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }; _fakeAuthor.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() };
_parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
_upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
} }
@ -176,11 +176,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_not_be_upgradable_if_cutoff_already_met() public void should_not_be_upgradable_if_cutoff_already_met()
{ {
_fakeArtist.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }; _fakeAuthor.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() };
_parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
_upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _upgradableQuality, DateTime.UtcNow, HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
} }
@ -188,7 +188,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_false_if_latest_history_item_is_only_one_hour_old() public void should_return_false_if_latest_history_item_is_only_one_hour_old()
{ {
GivenMostRecentForAlbum(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow.AddHours(-1), HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, string.Empty, _notupgradableQuality, DateTime.UtcNow.AddHours(-1), HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
@ -196,7 +196,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
public void should_return_false_if_latest_history_has_a_download_id_and_cdh_is_disabled() public void should_return_false_if_latest_history_has_a_download_id_and_cdh_is_disabled()
{ {
GivenCdhDisabled(); GivenCdhDisabled();
GivenMostRecentForAlbum(FIRST_ALBUM_ID, "test", _upgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, "test", _upgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _upgradeHistory.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
@ -204,20 +204,20 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
public void should_return_false_if_cutoff_already_met_and_cdh_is_disabled() public void should_return_false_if_cutoff_already_met_and_cdh_is_disabled()
{ {
GivenCdhDisabled(); GivenCdhDisabled();
_fakeArtist.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }; _fakeAuthor.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id, Items = Qualities.QualityFixture.GetDefaultQualities() };
_parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _parseResultSingle.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
_upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1)); _upgradableQuality = new QualityModel(Quality.MP3_320, new Revision(version: 1));
GivenMostRecentForAlbum(FIRST_ALBUM_ID, "test", _upgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, "test", _upgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_false_if_only_album_is_not_upgradable_and_cdh_is_disabled() public void should_return_false_if_only_book_is_not_upgradable_and_cdh_is_disabled()
{ {
GivenCdhDisabled(); GivenCdhDisabled();
GivenMostRecentForAlbum(FIRST_ALBUM_ID, "test", _notupgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed); GivenMostRecentForBook(FIRST_ALBUM_ID, "test", _notupgradableQuality, DateTime.UtcNow.AddDays(-100), HistoryEventType.Grabbed);
_upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _upgradeHistory.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
} }
} }

@ -12,128 +12,128 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
[TestFixture] [TestFixture]
public class MonitoredAlbumSpecificationFixture : CoreTest<MonitoredBookSpecification> public class MonitoredBookSpecificationFixture : CoreTest<MonitoredBookSpecification>
{ {
private MonitoredBookSpecification _monitoredAlbumSpecification; private MonitoredBookSpecification _monitoredBookSpecification;
private RemoteBook _parseResultMulti; private RemoteBook _parseResultMulti;
private RemoteBook _parseResultSingle; private RemoteBook _parseResultSingle;
private Author _fakeArtist; private Author _fakeAuthor;
private Book _firstAlbum; private Book _firstBook;
private Book _secondAlbum; private Book _secondBook;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_monitoredAlbumSpecification = Mocker.Resolve<MonitoredBookSpecification>(); _monitoredBookSpecification = Mocker.Resolve<MonitoredBookSpecification>();
_fakeArtist = Builder<Author>.CreateNew() _fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.Monitored = true) .With(c => c.Monitored = true)
.Build(); .Build();
_firstAlbum = new Book { Monitored = true }; _firstBook = new Book { Monitored = true };
_secondAlbum = new Book { Monitored = true }; _secondBook = new Book { Monitored = true };
var singleAlbumList = new List<Book> { _firstAlbum }; var singleBookList = new List<Book> { _firstBook };
var doubleAlbumList = new List<Book> { _firstAlbum, _secondAlbum }; var doubleBookList = new List<Book> { _firstBook, _secondBook };
_parseResultMulti = new RemoteBook _parseResultMulti = new RemoteBook
{ {
Author = _fakeArtist, Author = _fakeAuthor,
Books = doubleAlbumList Books = doubleBookList
}; };
_parseResultSingle = new RemoteBook _parseResultSingle = new RemoteBook
{ {
Author = _fakeArtist, Author = _fakeAuthor,
Books = singleAlbumList Books = singleBookList
}; };
} }
private void WithFirstAlbumUnmonitored() private void WithFirstBookUnmonitored()
{ {
_firstAlbum.Monitored = false; _firstBook.Monitored = false;
} }
private void WithSecondAlbumUnmonitored() private void WithSecondBookUnmonitored()
{ {
_secondAlbum.Monitored = false; _secondBook.Monitored = false;
} }
[Test] [Test]
public void setup_should_return_monitored_album_should_return_true() public void setup_should_return_monitored_book_should_return_true()
{ {
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void not_monitored_artist_should_be_skipped() public void not_monitored_author_should_be_skipped()
{ {
_fakeArtist.Monitored = false; _fakeAuthor.Monitored = false;
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void only_album_not_monitored_should_return_false() public void only_book_not_monitored_should_return_false()
{ {
WithFirstAlbumUnmonitored(); WithFirstBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void both_albums_not_monitored_should_return_false() public void both_books_not_monitored_should_return_false()
{ {
WithFirstAlbumUnmonitored(); WithFirstBookUnmonitored();
WithSecondAlbumUnmonitored(); WithSecondBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void only_first_album_not_monitored_should_return_false() public void only_first_book_not_monitored_should_return_false()
{ {
WithFirstAlbumUnmonitored(); WithFirstBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void only_second_album_not_monitored_should_return_false() public void only_second_book_not_monitored_should_return_false()
{ {
WithSecondAlbumUnmonitored(); WithSecondBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_true_for_single_album_search() public void should_return_true_for_single_book_search()
{ {
_fakeArtist.Monitored = false; _fakeAuthor.Monitored = false;
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria()).Accepted.Should().BeTrue(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria()).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_return_true_if_album_is_not_monitored_and_monitoredEpisodesOnly_flag_is_false() public void should_return_true_if_book_is_not_monitored_and_monitoredEpisodesOnly_flag_is_false()
{ {
WithFirstAlbumUnmonitored(); WithFirstBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria { MonitoredBooksOnly = false }).Accepted.Should().BeTrue(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria { MonitoredBooksOnly = false }).Accepted.Should().BeTrue();
} }
[Test] [Test]
public void should_return_false_if_album_is_not_monitored_and_monitoredEpisodesOnly_flag_is_true() public void should_return_false_if_book_is_not_monitored_and_monitoredEpisodesOnly_flag_is_true()
{ {
WithFirstAlbumUnmonitored(); WithFirstBookUnmonitored();
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultSingle, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_false_if_all_albums_are_not_monitored_for_discography_pack_release() public void should_return_false_if_all_books_are_not_monitored_for_discography_pack_release()
{ {
WithSecondAlbumUnmonitored(); WithSecondBookUnmonitored();
_parseResultMulti.ParsedBookInfo = new ParsedBookInfo() _parseResultMulti.ParsedBookInfo = new ParsedBookInfo()
{ {
Discography = true Discography = true
}; };
_monitoredAlbumSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); _monitoredBookSpecification.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse();
} }
} }
} }

@ -27,21 +27,21 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet); GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
} }
private Book GivenAlbum(int id) private Book GivenBook(int id)
{ {
return Builder<Book>.CreateNew() return Builder<Book>.CreateNew()
.With(e => e.Id = id) .With(e => e.Id = id)
.Build(); .Build();
} }
private RemoteBook GivenRemoteAlbum(List<Book> albums, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet, int indexerPriority = 25) private RemoteBook GivenRemoteBook(List<Book> books, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet, int indexerPriority = 25)
{ {
var remoteBook = new RemoteBook(); var remoteBook = new RemoteBook();
remoteBook.ParsedBookInfo = new ParsedBookInfo(); remoteBook.ParsedBookInfo = new ParsedBookInfo();
remoteBook.ParsedBookInfo.Quality = quality; remoteBook.ParsedBookInfo.Quality = quality;
remoteBook.Books = new List<Book>(); remoteBook.Books = new List<Book>();
remoteBook.Books.AddRange(albums); remoteBook.Books.AddRange(books);
remoteBook.Release = new ReleaseInfo(); remoteBook.Release = new ReleaseInfo();
remoteBook.Release.PublishDate = DateTime.Now.AddDays(-age); remoteBook.Release.PublishDate = DateTime.Now.AddDays(-age);
@ -73,22 +73,22 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_put_reals_before_non_reals() public void should_put_reals_before_non_reals()
{ {
var remoteAlbum1 = GivenRemoteAlbum(new List<Album> { GivenAlbum(1) }, new QualityModel(Quality.MP3_256, new Revision(version: 1, real: 0))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 1, real: 0)));
var remoteAlbum2 = GivenRemoteAlbum(new List<Album> { GivenAlbum(1) }, new QualityModel(Quality.MP3_256, new Revision(version: 1, real: 1))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 1, real: 1)));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteAlbum1)); decisions.Add(new DownloadDecision(remoteBook1));
decisions.Add(new DownloadDecision(remoteAlbum2)); decisions.Add(new DownloadDecision(remoteBook2));
var qualifiedReports = Subject.PrioritizeDecisions(decisions); var qualifiedReports = Subject.PrioritizeDecisions(decisions);
qualifiedReports.First().RemoteAlbum.ParsedAlbumInfo.Quality.Revision.Real.Should().Be(1); qualifiedReports.First().RemoteBook.ParsedBookInfo.Quality.Revision.Real.Should().Be(1);
} }
[Test] [Test]
public void should_put_propers_before_non_propers() public void should_put_propers_before_non_propers()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 1))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 1)));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 2))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320, new Revision(version: 2)));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -101,8 +101,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_put_higher_quality_before_lower() public void should_put_higher_quality_before_lower()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -115,10 +115,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_order_by_age_then_largest_rounded_to_200mb() public void should_order_by_age_then_largest_rounded_to_200mb()
{ {
var remoteBookSd = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 100.Megabytes(), age: 1); var remoteBookSd = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 100.Megabytes(), age: 1);
var remoteBookHdSmallOld = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 1200.Megabytes(), age: 1000); var remoteBookHdSmallOld = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 1200.Megabytes(), age: 1000);
var remoteBookSmallYoung = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 1250.Megabytes(), age: 10); var remoteBookSmallYoung = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 1250.Megabytes(), age: 10);
var remoteBookHdLargeYoung = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 3000.Megabytes(), age: 1); var remoteBookHdLargeYoung = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 3000.Megabytes(), age: 1);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBookSd)); decisions.Add(new DownloadDecision(remoteBookSd));
@ -133,8 +133,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_order_by_youngest() public void should_order_by_youngest()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), age: 10); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), age: 10);
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), age: 5); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), age: 5);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -145,10 +145,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_not_throw_if_no_albums_are_found() public void should_not_throw_if_no_books_are_found()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 500.Megabytes()); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 500.Megabytes());
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), size: 500.Megabytes()); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), size: 500.Megabytes());
remoteBook1.Books = new List<Book>(); remoteBook1.Books = new List<Book>();
@ -164,8 +164,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
GivenPreferredDownloadProtocol(DownloadProtocol.Usenet); GivenPreferredDownloadProtocol(DownloadProtocol.Usenet);
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Torrent); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Torrent);
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Usenet); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Usenet);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -180,8 +180,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
GivenPreferredDownloadProtocol(DownloadProtocol.Torrent); GivenPreferredDownloadProtocol(DownloadProtocol.Torrent);
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Torrent); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Torrent);
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Usenet); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320), downloadProtocol: DownloadProtocol.Usenet);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -192,10 +192,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_prefer_discography_pack_above_single_album() public void should_prefer_discography_pack_above_single_book()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1), GivenAlbum(2) }, new QualityModel(Quality.FLAC)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1), GivenBook(2) }, new QualityModel(Quality.FLAC));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC));
remoteBook1.ParsedBookInfo.Discography = true; remoteBook1.ParsedBookInfo.Discography = true;
@ -210,8 +210,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_quality_over_discography_pack() public void should_prefer_quality_over_discography_pack()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1), GivenAlbum(2) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1), GivenBook(2) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC));
remoteBook1.ParsedBookInfo.Discography = true; remoteBook1.ParsedBookInfo.Discography = true;
@ -224,10 +224,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_prefer_single_album_over_multi_album() public void should_prefer_single_book_over_multi_book()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1), GivenAlbum(2) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1), GivenBook(2) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -240,8 +240,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_releases_with_more_seeders() public void should_prefer_releases_with_more_seeders()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var torrentInfo1 = new TorrentInfo(); var torrentInfo1 = new TorrentInfo();
torrentInfo1.PublishDate = DateTime.Now; torrentInfo1.PublishDate = DateTime.Now;
@ -266,8 +266,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_releases_with_more_peers_given_equal_number_of_seeds() public void should_prefer_releases_with_more_peers_given_equal_number_of_seeds()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var torrentInfo1 = new TorrentInfo(); var torrentInfo1 = new TorrentInfo();
torrentInfo1.PublishDate = DateTime.Now; torrentInfo1.PublishDate = DateTime.Now;
@ -293,8 +293,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_releases_with_more_peers_no_seeds() public void should_prefer_releases_with_more_peers_no_seeds()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var torrentInfo1 = new TorrentInfo(); var torrentInfo1 = new TorrentInfo();
torrentInfo1.PublishDate = DateTime.Now; torrentInfo1.PublishDate = DateTime.Now;
@ -321,8 +321,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_first_release_if_peers_and_size_are_too_similar() public void should_prefer_first_release_if_peers_and_size_are_too_similar()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var torrentInfo1 = new TorrentInfo(); var torrentInfo1 = new TorrentInfo();
torrentInfo1.PublishDate = DateTime.Now; torrentInfo1.PublishDate = DateTime.Now;
@ -350,8 +350,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_first_release_if_age_and_size_are_too_similar() public void should_prefer_first_release_if_age_and_size_are_too_similar()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
remoteBook1.Release.PublishDate = DateTime.UtcNow.AddDays(-100); remoteBook1.Release.PublishDate = DateTime.UtcNow.AddDays(-100);
remoteBook1.Release.Size = 200.Megabytes(); remoteBook1.Release.Size = 200.Megabytes();
@ -370,8 +370,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_quality_over_the_number_of_peers() public void should_prefer_quality_over_the_number_of_peers()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3));
var torrentInfo1 = new TorrentInfo(); var torrentInfo1 = new TorrentInfo();
torrentInfo1.PublishDate = DateTime.Now; torrentInfo1.PublishDate = DateTime.Now;
@ -399,8 +399,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_put_higher_quality_before_lower_always() public void should_put_higher_quality_before_lower_always()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.MP3_320)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook1)); decisions.Add(new DownloadDecision(remoteBook1));
@ -413,8 +413,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_prefer_higher_score_over_lower_score() public void should_prefer_higher_score_over_lower_score()
{ {
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC)); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC)); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC));
remoteBook1.PreferredWordScore = 10; remoteBook1.PreferredWordScore = 10;
remoteBook2.PreferredWordScore = 0; remoteBook2.PreferredWordScore = 0;
@ -434,8 +434,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Setup(s => s.DownloadPropersAndRepacks) .Setup(s => s.DownloadPropersAndRepacks)
.Returns(ProperDownloadTypes.PreferAndUpgrade); .Returns(ProperDownloadTypes.PreferAndUpgrade);
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(1))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(1)));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(2))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(2)));
remoteBook1.PreferredWordScore = 10; remoteBook1.PreferredWordScore = 10;
remoteBook2.PreferredWordScore = 0; remoteBook2.PreferredWordScore = 0;
@ -455,8 +455,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Setup(s => s.DownloadPropersAndRepacks) .Setup(s => s.DownloadPropersAndRepacks)
.Returns(ProperDownloadTypes.DoNotUpgrade); .Returns(ProperDownloadTypes.DoNotUpgrade);
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(1))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(1)));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(2))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(2)));
remoteBook1.PreferredWordScore = 10; remoteBook1.PreferredWordScore = 10;
remoteBook2.PreferredWordScore = 0; remoteBook2.PreferredWordScore = 0;
@ -476,8 +476,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Setup(s => s.DownloadPropersAndRepacks) .Setup(s => s.DownloadPropersAndRepacks)
.Returns(ProperDownloadTypes.DoNotPrefer); .Returns(ProperDownloadTypes.DoNotPrefer);
var remoteBook1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(1))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(1)));
var remoteBook2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(2))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(2)));
remoteBook1.PreferredWordScore = 10; remoteBook1.PreferredWordScore = 10;
remoteBook2.PreferredWordScore = 0; remoteBook2.PreferredWordScore = 0;
@ -495,35 +495,35 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void sort_download_decisions_based_on_indexer_priority() public void sort_download_decisions_based_on_indexer_priority()
{ {
var remoteAlbum1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 25); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 25);
var remoteAlbum2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 50); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 50);
var remoteAlbum3 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 1); var remoteBook3 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 1);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.AddRange(new[] { new DownloadDecision(remoteAlbum1), new DownloadDecision(remoteAlbum2), new DownloadDecision(remoteAlbum3) }); decisions.AddRange(new[] { new DownloadDecision(remoteBook1), new DownloadDecision(remoteBook2), new DownloadDecision(remoteBook3) });
var qualifiedReports = Subject.PrioritizeDecisions(decisions); var qualifiedReports = Subject.PrioritizeDecisions(decisions);
qualifiedReports.First().RemoteBook.Should().Be(remoteAlbum3); qualifiedReports.First().RemoteBook.Should().Be(remoteBook3);
qualifiedReports.Skip(1).First().RemoteBook.Should().Be(remoteAlbum1); qualifiedReports.Skip(1).First().RemoteBook.Should().Be(remoteBook1);
qualifiedReports.Last().RemoteBook.Should().Be(remoteAlbum2); qualifiedReports.Last().RemoteBook.Should().Be(remoteBook2);
} }
[Test] [Test]
public void ensure_download_decisions_indexer_priority_is_not_perfered_over_quality() public void ensure_download_decisions_indexer_priority_is_not_perfered_over_quality()
{ {
var remoteAlbum1 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.EPUB, new Revision(1)), indexerPriority: 25); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.EPUB, new Revision(1)), indexerPriority: 25);
var remoteAlbum2 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 50); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 50);
var remoteAlbum3 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.PDF, new Revision(1)), indexerPriority: 1); var remoteBook3 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.PDF, new Revision(1)), indexerPriority: 1);
var remoteAlbum4 = GivenRemoteAlbum(new List<Book> { GivenAlbum(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 25); var remoteBook4 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.AZW3, new Revision(1)), indexerPriority: 25);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.AddRange(new[] { new DownloadDecision(remoteAlbum1), new DownloadDecision(remoteAlbum2), new DownloadDecision(remoteAlbum3), new DownloadDecision(remoteAlbum4) }); decisions.AddRange(new[] { new DownloadDecision(remoteBook1), new DownloadDecision(remoteBook2), new DownloadDecision(remoteBook3), new DownloadDecision(remoteBook4) });
var qualifiedReports = Subject.PrioritizeDecisions(decisions); var qualifiedReports = Subject.PrioritizeDecisions(decisions);
qualifiedReports.First().RemoteBook.Should().Be(remoteAlbum4); qualifiedReports.First().RemoteBook.Should().Be(remoteBook4);
qualifiedReports.Skip(1).First().RemoteBook.Should().Be(remoteAlbum2); qualifiedReports.Skip(1).First().RemoteBook.Should().Be(remoteBook2);
qualifiedReports.Skip(2).First().RemoteBook.Should().Be(remoteAlbum1); qualifiedReports.Skip(2).First().RemoteBook.Should().Be(remoteBook1);
qualifiedReports.Last().RemoteBook.Should().Be(remoteAlbum3); qualifiedReports.Last().RemoteBook.Should().Be(remoteBook3);
} }
[Test] [Test]
@ -533,21 +533,22 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Setup(s => s.DownloadPropersAndRepacks) .Setup(s => s.DownloadPropersAndRepacks)
.Returns(ProperDownloadTypes.DoNotPrefer); .Returns(ProperDownloadTypes.DoNotPrefer);
var remoteAlbum1 = GivenRemoteAlbum(new List<Album> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(1, 0))); var remoteBook1 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(1, 0)));
var remoteAlbum2 = GivenRemoteAlbum(new List<Album> { GivenAlbum(1) }, new QualityModel(Quality.FLAC, new Revision(1, 1))); var remoteBook2 = GivenRemoteBook(new List<Book> { GivenBook(1) }, new QualityModel(Quality.FLAC, new Revision(1, 1)));
remoteAlbum1.PreferredWordScore = 10; remoteBook1.PreferredWordScore = 10;
remoteAlbum2.PreferredWordScore = 0; remoteBook2.PreferredWordScore = 0;
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteAlbum1)); decisions.Add(new DownloadDecision(remoteBook1));
decisions.Add(new DownloadDecision(remoteAlbum2)); decisions.Add(new DownloadDecision(remoteBook2));
var qualifiedReports = Subject.PrioritizeDecisions(decisions); var qualifiedReports = Subject.PrioritizeDecisions(decisions);
qualifiedReports.First().RemoteAlbum.ParsedAlbumInfo.Quality.Quality.Should().Be(Quality.FLAC);
qualifiedReports.First().RemoteAlbum.ParsedAlbumInfo.Quality.Revision.Version.Should().Be(1); qualifiedReports.First().RemoteBook.ParsedBookInfo.Quality.Quality.Should().Be(Quality.FLAC);
qualifiedReports.First().RemoteAlbum.ParsedAlbumInfo.Quality.Revision.Real.Should().Be(0); qualifiedReports.First().RemoteBook.ParsedBookInfo.Quality.Revision.Version.Should().Be(1);
qualifiedReports.First().RemoteAlbum.PreferredWordScore.Should().Be(10); qualifiedReports.First().RemoteBook.ParsedBookInfo.Quality.Revision.Real.Should().Be(0);
qualifiedReports.First().RemoteBook.PreferredWordScore.Should().Be(10);
} }
} }
} }

@ -32,13 +32,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
var fakeArtist = Builder<Author>.CreateNew() var fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id }) .With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.MP3_320.Id })
.Build(); .Build();
_remoteBook = new RemoteBook _remoteBook = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
}; };
} }

@ -17,12 +17,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[TestFixture] [TestFixture]
public class QueueSpecificationFixture : CoreTest<QueueSpecification> public class QueueSpecificationFixture : CoreTest<QueueSpecification>
{ {
private Author _artist; private Author _author;
private Book _album; private Book _book;
private RemoteBook _remoteBook; private RemoteBook _remoteBook;
private Author _otherArtist; private Author _otherAuthor;
private Book _otherAlbum; private Book _otherBook;
private ReleaseInfo _releaseInfo; private ReleaseInfo _releaseInfo;
@ -31,7 +31,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
Mocker.Resolve<UpgradableSpecification>(); Mocker.Resolve<UpgradableSpecification>();
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.With(e => e.QualityProfile = new QualityProfile .With(e => e.QualityProfile = new QualityProfile
{ {
UpgradeAllowed = true, UpgradeAllowed = true,
@ -39,16 +39,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
}) })
.Build(); .Build();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.With(e => e.AuthorId = _artist.Id) .With(e => e.AuthorId = _author.Id)
.Build(); .Build();
_otherArtist = Builder<Author>.CreateNew() _otherAuthor = Builder<Author>.CreateNew()
.With(s => s.Id = 2) .With(s => s.Id = 2)
.Build(); .Build();
_otherAlbum = Builder<Book>.CreateNew() _otherBook = Builder<Book>.CreateNew()
.With(e => e.AuthorId = _otherArtist.Id) .With(e => e.AuthorId = _otherAuthor.Id)
.With(e => e.Id = 2) .With(e => e.Id = 2)
.Build(); .Build();
@ -56,8 +56,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.Build(); .Build();
_remoteBook = Builder<RemoteBook>.CreateNew() _remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320) }) .With(r => r.ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320) })
.With(r => r.PreferredWordScore = 0) .With(r => r.PreferredWordScore = 0)
.Build(); .Build();
@ -91,11 +91,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_when_artist_doesnt_match() public void should_return_true_when_author_doesnt_match()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _otherArtist) .With(r => r.Author = _otherAuthor)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.Release = _releaseInfo) .With(r => r.Release = _releaseInfo)
.Build(); .Build();
@ -106,11 +106,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_false_if_everything_is_the_same() public void should_return_false_if_everything_is_the_same()
{ {
_artist.QualityProfile.Value.Cutoff = Quality.FLAC.Id; _author.QualityProfile.Value.Cutoff = Quality.FLAC.Id;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -126,11 +126,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_true_when_quality_in_queue_is_lower() public void should_return_true_when_quality_in_queue_is_lower()
{ {
_artist.QualityProfile.Value.Cutoff = Quality.MP3_320.Id; _author.QualityProfile.Value.Cutoff = Quality.MP3_320.Id;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.AZW3) Quality = new QualityModel(Quality.AZW3)
@ -143,11 +143,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_when_album_doesnt_match() public void should_return_true_when_book_doesnt_match()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _otherAlbum }) .With(r => r.Books = new List<Book> { _otherBook })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -165,8 +165,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_remoteBook.PreferredWordScore = 1; _remoteBook.PreferredWordScore = 1;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -182,8 +182,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
public void should_return_false_when_qualities_are_the_same() public void should_return_false_when_qualities_are_the_same()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -198,11 +198,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_false_when_quality_in_queue_is_better() public void should_return_false_when_quality_in_queue_is_better()
{ {
_artist.QualityProfile.Value.Cutoff = Quality.FLAC.Id; _author.QualityProfile.Value.Cutoff = Quality.FLAC.Id;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -215,11 +215,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_false_if_matching_multi_album_is_in_queue() public void should_return_false_if_matching_multi_book_is_in_queue()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album, _otherAlbum }) .With(r => r.Books = new List<Book> { _book, _otherBook })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -232,11 +232,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_false_if_multi_album_has_one_album_in_queue() public void should_return_false_if_multi_book_has_one_book_in_queue()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -244,18 +244,18 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.With(r => r.Release = _releaseInfo) .With(r => r.Release = _releaseInfo)
.Build(); .Build();
_remoteBook.Books.Add(_otherAlbum); _remoteBook.Books.Add(_otherBook);
GivenQueue(new List<RemoteBook> { remoteBook }); GivenQueue(new List<RemoteBook> { remoteBook });
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_false_if_multi_part_album_is_already_in_queue() public void should_return_false_if_multi_part_book_is_already_in_queue()
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album, _otherAlbum }) .With(r => r.Books = new List<Book> { _book, _otherBook })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
@ -263,30 +263,30 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.With(r => r.Release = _releaseInfo) .With(r => r.Release = _releaseInfo)
.Build(); .Build();
_remoteBook.Books.Add(_otherAlbum); _remoteBook.Books.Add(_otherBook);
GivenQueue(new List<RemoteBook> { remoteBook }); GivenQueue(new List<RemoteBook> { remoteBook });
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_false_if_multi_part_album_has_two_albums_in_queue() public void should_return_false_if_multi_part_book_has_two_books_in_queue()
{ {
var remoteBooks = Builder<RemoteBook>.CreateListOfSize(2) var remoteBooks = Builder<RemoteBook>.CreateListOfSize(2)
.All() .All()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)
}) })
.With(r => r.Release = _releaseInfo) .With(r => r.Release = _releaseInfo)
.TheFirst(1) .TheFirst(1)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.TheNext(1) .TheNext(1)
.With(r => r.Books = new List<Book> { _otherAlbum }) .With(r => r.Books = new List<Book> { _otherBook })
.Build(); .Build();
_remoteBook.Books.Add(_otherAlbum); _remoteBook.Books.Add(_otherBook);
GivenQueue(remoteBooks); GivenQueue(remoteBooks);
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
} }
@ -294,12 +294,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_false_when_quality_is_better_and_upgrade_allowed_is_false_for_quality_profile() public void should_return_false_when_quality_is_better_and_upgrade_allowed_is_false_for_quality_profile()
{ {
_artist.QualityProfile.Value.Cutoff = Quality.FLAC.Id; _author.QualityProfile.Value.Cutoff = Quality.FLAC.Id;
_artist.QualityProfile.Value.UpgradeAllowed = false; _author.QualityProfile.Value.UpgradeAllowed = false;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.FLAC) Quality = new QualityModel(Quality.FLAC)
@ -314,11 +314,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
[Test] [Test]
public void should_return_true_if_everything_is_the_same_for_failed_pending() public void should_return_true_if_everything_is_the_same_for_failed_pending()
{ {
_artist.QualityProfile.Value.Cutoff = Quality.FLAC.Id; _author.QualityProfile.Value.Cutoff = Quality.FLAC.Id;
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = _artist) .With(r => r.Author = _author)
.With(r => r.Books = new List<Book> { _album }) .With(r => r.Books = new List<Book> { _book })
.With(r => r.ParsedBookInfo = new ParsedBookInfo .With(r => r.ParsedBookInfo = new ParsedBookInfo
{ {
Quality = new QualityModel(Quality.MP3_320) Quality = new QualityModel(Quality.MP3_320)

@ -17,7 +17,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
public class RepackSpecificationFixture : CoreTest<RepackSpecification> public class RepackSpecificationFixture : CoreTest<RepackSpecification>
{ {
private ParsedBookInfo _parsedBookInfo; private ParsedBookInfo _parsedBookInfo;
private List<Book> _albums; private List<Book> _books;
private List<BookFile> _trackFiles; private List<BookFile> _trackFiles;
[SetUp] [SetUp]
@ -31,13 +31,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
.With(p => p.ReleaseGroup = "Readarr") .With(p => p.ReleaseGroup = "Readarr")
.Build(); .Build();
_albums = Builder<Book>.CreateListOfSize(1) _books = Builder<Book>.CreateListOfSize(1)
.All() .All()
.BuildList(); .BuildList();
_trackFiles = Builder<BookFile>.CreateListOfSize(3) _trackFiles = Builder<BookFile>.CreateListOfSize(3)
.All() .All()
.With(t => t.EditionId = _albums.First().Id) .With(t => t.EditionId = _books.First().Id)
.BuildList(); .BuildList();
Mocker.GetMock<IMediaFileService>() Mocker.GetMock<IMediaFileService>()
@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
{ {
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -70,7 +70,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -97,7 +97,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -124,7 +124,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -153,7 +153,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -180,7 +180,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -207,7 +207,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)
@ -236,7 +236,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(e => e.ParsedBookInfo = _parsedBookInfo) .With(e => e.ParsedBookInfo = _parsedBookInfo)
.With(e => e.Books = _albums) .With(e => e.Books = _books)
.Build(); .Build();
Subject.IsSatisfiedBy(remoteBook, null) Subject.IsSatisfiedBy(remoteBook, null)

@ -37,12 +37,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
.With(d => d.PreferredProtocol = DownloadProtocol.Usenet) .With(d => d.PreferredProtocol = DownloadProtocol.Usenet)
.Build(); .Build();
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.With(s => s.QualityProfile = _profile) .With(s => s.QualityProfile = _profile)
.Build(); .Build();
_remoteBook = Builder<RemoteBook>.CreateNew() _remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Author = artist) .With(r => r.Author = author)
.Build(); .Build();
_profile.Items = new List<QualityProfileQualityItem>(); _profile.Items = new List<QualityProfileQualityItem>();
@ -87,7 +87,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
private void GivenUpgradeForExistingFile() private void GivenUpgradeForExistingFile()
{ {
Mocker.GetMock<IUpgradableSpecification>() Mocker.GetMock<IUpgradableSpecification>()
.Setup(s => s.IsUpgradable(It.IsAny<QualityProfile>(), It.IsAny<List<QualityModel>>(), It.IsAny<int>(), It.IsAny<QualityModel>(), It.IsAny<int>())) .Setup(s => s.IsUpgradable(It.IsAny<QualityProfile>(), It.IsAny<QualityModel>(), It.IsAny<int>(), It.IsAny<QualityModel>(), It.IsAny<int>()))
.Returns(true); .Returns(true);
} }
@ -147,7 +147,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
} }
[Test] [Test]
public void should_be_true_when_release_is_a_proper_for_existing_album() public void should_be_true_when_release_is_a_proper_for_existing_book()
{ {
_remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)); _remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2));
_remoteBook.Release.PublishDate = DateTime.UtcNow; _remoteBook.Release.PublishDate = DateTime.UtcNow;
@ -165,7 +165,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
} }
[Test] [Test]
public void should_be_true_when_release_is_a_real_for_existing_album() public void should_be_true_when_release_is_a_real_for_existing_book()
{ {
_remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(real: 1)); _remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(real: 1));
_remoteBook.Release.PublishDate = DateTime.UtcNow; _remoteBook.Release.PublishDate = DateTime.UtcNow;
@ -183,19 +183,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
} }
[Test] [Test]
public void should_be_false_when_release_is_proper_for_existing_album_of_different_quality() public void should_be_false_when_release_is_proper_for_existing_book_of_different_quality()
{ {
<<<<<<< HEAD
_remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.AZW3, new Revision(version: 2)); _remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.AZW3, new Revision(version: 2));
_remoteBook.Release.PublishDate = DateTime.UtcNow; _remoteBook.Release.PublishDate = DateTime.UtcNow;
GivenExistingFile(new QualityModel(Quality.PDF)); GivenExistingFile(new QualityModel(Quality.PDF));
=======
_remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2));
_remoteAlbum.Release.PublishDate = DateTime.UtcNow;
GivenExistingFile(new QualityModel(Quality.MP3_256));
>>>>>>> Fixed: Delay profile being ignored for non-revision upgrades
_delayProfile.UsenetDelay = 720; _delayProfile.UsenetDelay = 720;

@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
new BookFile new BookFile
{ {
Id = 1, Id = 1,
Path = "/My.Artist.S01E01.mp3", Path = "/My.Author.S01E01.mp3",
Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)),
DateAdded = DateTime.Now, DateAdded = DateTime.Now,
EditionId = 1 EditionId = 1
@ -42,36 +42,36 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
new BookFile new BookFile
{ {
Id = 2, Id = 2,
Path = "/My.Artist.S01E02.mp3", Path = "/My.Author.S01E02.mp3",
Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)),
DateAdded = DateTime.Now, DateAdded = DateTime.Now,
EditionId = 2 EditionId = 2
}; };
var singleAlbumList = new List<Book> { new Book { Id = 1 } }; var singleBookList = new List<Book> { new Book { Id = 1 } };
var doubleAlbumList = new List<Book> var doubleBookList = new List<Book>
{ {
new Book { Id = 1 }, new Book { Id = 1 },
new Book { Id = 2 } new Book { Id = 2 }
}; };
var fakeArtist = Builder<Author>.CreateNew() var fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.FLAC.Id }) .With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.FLAC.Id })
.With(c => c.Path = @"C:\Music\My.Artist".AsOsAgnostic()) .With(c => c.Path = @"C:\Music\My.Author".AsOsAgnostic())
.Build(); .Build();
_parseResultMulti = new RemoteBook _parseResultMulti = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = doubleAlbumList Books = doubleBookList
}; };
_parseResultSingle = new RemoteBook _parseResultSingle = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = singleAlbumList Books = singleBookList
}; };
GivenUnmonitorDeletedTracks(true); GivenUnmonitorDeletedTracks(true);

@ -34,10 +34,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
_firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), DateAdded = DateTime.Now }; _firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), DateAdded = DateTime.Now };
_secondFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), DateAdded = DateTime.Now }; _secondFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 1)), DateAdded = DateTime.Now };
var singleAlbumList = new List<Book> { new Book { }, new Book { } }; var singleBookList = new List<Book> { new Book { }, new Book { } };
var doubleAlbumList = new List<Book> { new Book { }, new Book { }, new Book { } }; var doubleBookList = new List<Book> { new Book { }, new Book { }, new Book { } };
var fakeArtist = Builder<Author>.CreateNew() var fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.FLAC.Id }) .With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.FLAC.Id })
.Build(); .Build();
@ -47,16 +47,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
_parseResultMulti = new RemoteBook _parseResultMulti = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MOBI, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MOBI, new Revision(version: 2)) },
Books = doubleAlbumList Books = doubleBookList
}; };
_parseResultSingle = new RemoteBook _parseResultSingle = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MOBI, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MOBI, new Revision(version: 2)) },
Books = singleAlbumList Books = singleBookList
}; };
} }

@ -10,34 +10,34 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.DecisionEngineTests.Search namespace NzbDrone.Core.Test.DecisionEngineTests.Search
{ {
[TestFixture] [TestFixture]
public class ArtistSpecificationFixture : TestBase<AuthorSpecification> public class AuthorSpecificationFixture : TestBase<AuthorSpecification>
{ {
private Author _artist1; private Author _author1;
private Author _artist2; private Author _author2;
private RemoteBook _remoteBook = new RemoteBook(); private RemoteBook _remoteBook = new RemoteBook();
private SearchCriteriaBase _searchCriteria = new BookSearchCriteria(); private SearchCriteriaBase _searchCriteria = new BookSearchCriteria();
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist1 = Builder<Author>.CreateNew().With(s => s.Id = 1).Build(); _author1 = Builder<Author>.CreateNew().With(s => s.Id = 1).Build();
_artist2 = Builder<Author>.CreateNew().With(s => s.Id = 2).Build(); _author2 = Builder<Author>.CreateNew().With(s => s.Id = 2).Build();
_remoteBook.Author = _artist1; _remoteBook.Author = _author1;
} }
[Test] [Test]
public void should_return_false_if_artist_doesnt_match() public void should_return_false_if_author_doesnt_match()
{ {
_searchCriteria.Author = _artist2; _searchCriteria.Author = _author2;
Subject.IsSatisfiedBy(_remoteBook, _searchCriteria).Accepted.Should().BeFalse(); Subject.IsSatisfiedBy(_remoteBook, _searchCriteria).Accepted.Should().BeFalse();
} }
[Test] [Test]
public void should_return_true_when_artist_ids_match() public void should_return_true_when_author_ids_match()
{ {
_searchCriteria.Author = _artist1; _searchCriteria.Author = _author1;
Subject.IsSatisfiedBy(_remoteBook, _searchCriteria).Accepted.Should().BeTrue(); Subject.IsSatisfiedBy(_remoteBook, _searchCriteria).Accepted.Should().BeTrue();
} }

@ -15,22 +15,22 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.Search
[TestFixture] [TestFixture]
public class TorrentSeedingSpecificationFixture : TestBase<TorrentSeedingSpecification> public class TorrentSeedingSpecificationFixture : TestBase<TorrentSeedingSpecification>
{ {
private Author _artist; private Author _author;
private RemoteBook _remoteBook; private RemoteBook _remoteBook;
private IndexerDefinition _indexerDefinition; private IndexerDefinition _indexerDefinition;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew().With(s => s.Id = 1).Build(); _author = Builder<Author>.CreateNew().With(s => s.Id = 1).Build();
_remoteBook = new RemoteBook _remoteBook = new RemoteBook
{ {
Author = _artist, Author = _author,
Release = new TorrentInfo Release = new TorrentInfo
{ {
IndexerId = 1, IndexerId = 1,
Title = "Artist - Album [FLAC-RlsGrp]", Title = "Author - Book [FLAC-RlsGrp]",
Seeders = 0 Seeders = 0
} }
}; };
@ -56,7 +56,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.Search
_remoteBook.Release = new ReleaseInfo _remoteBook.Release = new ReleaseInfo
{ {
IndexerId = 1, IndexerId = 1,
Title = "Artist - Album [FLAC-RlsGrp]" Title = "Author - Book [FLAC-RlsGrp]"
}; };
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue(); Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();

@ -21,7 +21,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false UpgradeAllowed = false
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.FLAC)) new QualityModel(Quality.FLAC))
.Should().BeFalse(); .Should().BeFalse();
} }
@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true UpgradeAllowed = true
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.FLAC)) new QualityModel(Quality.FLAC))
.Should().BeTrue(); .Should().BeTrue();
} }
@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true UpgradeAllowed = true
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.MP3_320)) new QualityModel(Quality.MP3_320))
.Should().BeTrue(); .Should().BeTrue();
} }
@ -66,7 +66,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false UpgradeAllowed = false
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.MP3_320)) new QualityModel(Quality.MP3_320))
.Should().BeTrue(); .Should().BeTrue();
} }
@ -81,7 +81,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = true UpgradeAllowed = true
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.MP3_320)) new QualityModel(Quality.MP3_320))
.Should().BeTrue(); .Should().BeTrue();
} }
@ -96,7 +96,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Items = Qualities.QualityFixture.GetDefaultQualities(), Items = Qualities.QualityFixture.GetDefaultQualities(),
UpgradeAllowed = false UpgradeAllowed = false
}, },
new List<QualityModel> { new QualityModel(Quality.MP3_320) }, new QualityModel(Quality.MP3_320),
new QualityModel(Quality.MP3_320)) new QualityModel(Quality.MP3_320))
.Should().BeTrue(); .Should().BeTrue();
} }

@ -32,10 +32,10 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now }; _firstFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now };
_secondFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now }; _secondFile = new BookFile { Quality = new QualityModel(Quality.FLAC, new Revision(version: 2)), DateAdded = DateTime.Now };
var singleAlbumList = new List<Book> { new Book { BookFiles = new List<BookFile>() } }; var singleBookList = new List<Book> { new Book { BookFiles = new List<BookFile>() } };
var doubleAlbumList = new List<Book> { new Book { BookFiles = new List<BookFile>() }, new Book { BookFiles = new List<BookFile>() }, new Book { BookFiles = new List<BookFile>() } }; var doubleBookList = new List<Book> { new Book { BookFiles = new List<BookFile>() }, new Book { BookFiles = new List<BookFile>() }, new Book { BookFiles = new List<BookFile>() } };
var fakeArtist = Builder<Author>.CreateNew() var fakeAuthor = Builder<Author>.CreateNew()
.With(c => c.QualityProfile = new QualityProfile .With(c => c.QualityProfile = new QualityProfile
{ {
UpgradeAllowed = true, UpgradeAllowed = true,
@ -50,16 +50,16 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_parseResultMulti = new RemoteBook _parseResultMulti = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = doubleAlbumList Books = doubleBookList
}; };
_parseResultSingle = new RemoteBook _parseResultSingle = new RemoteBook
{ {
Author = fakeArtist, Author = fakeAuthor,
ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) }, ParsedBookInfo = new ParsedBookInfo { Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)) },
Books = singleAlbumList Books = singleBookList
}; };
} }
@ -74,7 +74,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_if_album_has_no_existing_file() public void should_return_true_if_book_has_no_existing_file()
{ {
_parseResultSingle.Books.First().BookFiles = new List<BookFile>(); _parseResultSingle.Books.First().BookFiles = new List<BookFile>();
@ -95,7 +95,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
} }
[Test] [Test]
public void should_return_true_if_single_album_doesnt_exist_on_disk() public void should_return_true_if_single_book_doesnt_exist_on_disk()
{ {
_parseResultSingle.Books = new List<Book>(); _parseResultSingle.Books = new List<Book>();

@ -46,7 +46,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Subject.IsUpgradable( Subject.IsUpgradable(
profile, profile,
new List<QualityModel> { new QualityModel(current, new Revision(version: currentVersion)) }, new QualityModel(current, new Revision(version: currentVersion)),
NoPreferredWordScore, NoPreferredWordScore,
new QualityModel(newQuality, new Revision(version: newVersion)), new QualityModel(newQuality, new Revision(version: newVersion)),
NoPreferredWordScore) NoPreferredWordScore)
@ -65,7 +65,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Subject.IsUpgradable( Subject.IsUpgradable(
profile, profile,
new List<QualityModel> { new QualityModel(Quality.MP3_320, new Revision(version: 1)) }, new QualityModel(Quality.MP3_320, new Revision(version: 1)),
NoPreferredWordScore, NoPreferredWordScore,
new QualityModel(Quality.MP3_320, new Revision(version: 2)), new QualityModel(Quality.MP3_320, new Revision(version: 2)),
NoPreferredWordScore) NoPreferredWordScore)
@ -84,7 +84,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
Subject.IsUpgradable( Subject.IsUpgradable(
profile, profile,
new List<QualityModel> { new QualityModel(Quality.MP3_320, new Revision(version: 1)) }, new QualityModel(Quality.MP3_320, new Revision(version: 1)),
NoPreferredWordScore, NoPreferredWordScore,
new QualityModel(Quality.MP3_320, new Revision(version: 2)), new QualityModel(Quality.MP3_320, new Revision(version: 2)),
NoPreferredWordScore) NoPreferredWordScore)

@ -17,15 +17,15 @@ namespace NzbDrone.Core.Test.DiskSpace
public class DiskSpaceServiceFixture : CoreTest<DiskSpaceService> public class DiskSpaceServiceFixture : CoreTest<DiskSpaceService>
{ {
private RootFolder _rootDir; private RootFolder _rootDir;
private string _artistFolder1; private string _authorFolder1;
private string _artistFolder2; private string _authorFolder2;
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
_rootDir = new RootFolder { Path = @"G:\fasdlfsdf".AsOsAgnostic() }; _rootDir = new RootFolder { Path = @"G:\fasdlfsdf".AsOsAgnostic() };
_artistFolder1 = Path.Combine(_rootDir.Path, "artist1"); _authorFolder1 = Path.Combine(_rootDir.Path, "author1");
_artistFolder2 = Path.Combine(_rootDir.Path, "artist2"); _authorFolder2 = Path.Combine(_rootDir.Path, "author2");
Mocker.GetMock<IRootFolderService>() Mocker.GetMock<IRootFolderService>()
.Setup(x => x.All()) .Setup(x => x.All())
@ -47,14 +47,14 @@ namespace NzbDrone.Core.Test.DiskSpace
.Setup(v => v.GetTotalSize(It.IsAny<string>())) .Setup(v => v.GetTotalSize(It.IsAny<string>()))
.Returns(0); .Returns(0);
GivenArtist(); GivenAuthor();
} }
private void GivenArtist(params Author[] artist) private void GivenAuthor(params Author[] author)
{ {
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(v => v.GetAllAuthors()) .Setup(v => v.GetAllAuthors())
.Returns(artist.ToList()); .Returns(author.ToList());
} }
private void GivenExistingFolder(string folder) private void GivenExistingFolder(string folder)
@ -65,11 +65,11 @@ namespace NzbDrone.Core.Test.DiskSpace
} }
[Test] [Test]
public void should_check_diskspace_for_artist_folders() public void should_check_diskspace_for_author_folders()
{ {
GivenArtist(new Author { Path = _artistFolder1 }); GivenAuthor(new Author { Path = _authorFolder1 });
GivenExistingFolder(_artistFolder1); GivenExistingFolder(_authorFolder1);
var freeSpace = Subject.GetFreeSpace(); var freeSpace = Subject.GetFreeSpace();
@ -79,10 +79,10 @@ namespace NzbDrone.Core.Test.DiskSpace
[Test] [Test]
public void should_check_diskspace_for_same_root_folder_only_once() public void should_check_diskspace_for_same_root_folder_only_once()
{ {
GivenArtist(new Author { Path = _artistFolder1 }, new Author { Path = _artistFolder2 }); GivenAuthor(new Author { Path = _authorFolder1 }, new Author { Path = _authorFolder2 });
GivenExistingFolder(_artistFolder1); GivenExistingFolder(_authorFolder1);
GivenExistingFolder(_artistFolder2); GivenExistingFolder(_authorFolder2);
var freeSpace = Subject.GetFreeSpace(); var freeSpace = Subject.GetFreeSpace();

@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.With(h => h.Title = "Drone.S01E01.HDTV") .With(h => h.Title = "Drone.S01E01.HDTV")
.Build(); .Build();
var remoteBook = BuildRemoteAlbum(); var remoteBook = BuildRemoteBook();
_trackedDownload = Builder<TrackedDownload>.CreateNew() _trackedDownload = Builder<TrackedDownload>.CreateNew()
.With(c => c.State = TrackedDownloadState.Downloading) .With(c => c.State = TrackedDownloadState.Downloading)
@ -55,11 +55,11 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.Returns(new History.History()); .Returns(new History.History());
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist("Drone.S01E01.HDTV")) .Setup(s => s.GetAuthor("Drone.S01E01.HDTV"))
.Returns(remoteBook.Author); .Returns(remoteBook.Author);
} }
private Book CreateAlbum(int id) private Book CreateBook(int id)
{ {
return new Book return new Book
{ {
@ -67,12 +67,12 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
}; };
} }
private RemoteBook BuildRemoteAlbum() private RemoteBook BuildRemoteBook()
{ {
return new RemoteBook return new RemoteBook
{ {
Author = new Author(), Author = new Author(),
Books = new List<Book> { CreateAlbum(1) } Books = new List<Book> { CreateBook(1) }
}; };
} }
@ -86,18 +86,18 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.Returns(new History.History() { SourceTitle = "Droned S01E01" }); .Returns(new History.History() { SourceTitle = "Droned S01E01" });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>())) .Setup(s => s.GetAuthor(It.IsAny<string>()))
.Returns((Author)null); .Returns((Author)null);
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist("Droned S01E01")) .Setup(s => s.GetAuthor("Droned S01E01"))
.Returns(BuildRemoteAlbum().Author); .Returns(BuildRemoteBook().Author);
} }
private void GivenArtistMatch() private void GivenAuthorMatch()
{ {
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>())) .Setup(s => s.GetAuthor(It.IsAny<string>()))
.Returns(_trackedDownload.RemoteBook.Author); .Returns(_trackedDownload.RemoteBook.Author);
} }
@ -167,11 +167,11 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
[Test] [Test]
public void should_mark_as_imported_if_all_tracks_were_imported_but_extra_files_were_not() public void should_mark_as_imported_if_all_tracks_were_imported_but_extra_files_were_not()
{ {
GivenArtistMatch(); GivenAuthorMatch();
_trackedDownload.RemoteBook.Books = new List<Book> _trackedDownload.RemoteBook.Books = new List<Book>
{ {
CreateAlbum(1) CreateBook(1)
}; };
Mocker.GetMock<IDownloadedBooksImportService>() Mocker.GetMock<IDownloadedBooksImportService>()
@ -192,9 +192,9 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
{ {
_trackedDownload.RemoteBook.Books = new List<Book> _trackedDownload.RemoteBook.Books = new List<Book>
{ {
CreateAlbum(1), CreateBook(1),
CreateAlbum(1), CreateBook(1),
CreateAlbum(1) CreateBook(1)
}; };
Mocker.GetMock<IDownloadedBooksImportService>() Mocker.GetMock<IDownloadedBooksImportService>()
@ -227,9 +227,9 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
[Test] [Test]
public void should_not_mark_as_imported_if_some_of_episodes_were_not_imported_including_history() public void should_not_mark_as_imported_if_some_of_episodes_were_not_imported_including_history()
{ {
var albums = Builder<Book>.CreateListOfSize(3).BuildList(); var books = Builder<Book>.CreateListOfSize(3).BuildList();
_trackedDownload.RemoteBook.Books = albums; _trackedDownload.RemoteBook.Books = books;
Mocker.GetMock<IDownloadedBooksImportService>() Mocker.GetMock<IDownloadedBooksImportService>()
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Author>(), It.IsAny<DownloadClientItem>())) .Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Author>(), It.IsAny<DownloadClientItem>()))
@ -261,7 +261,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
{ {
_trackedDownload.RemoteBook.Books = new List<Book> _trackedDownload.RemoteBook.Books = new List<Book>
{ {
CreateAlbum(1) CreateBook(1)
}; };
Mocker.GetMock<IDownloadedBooksImportService>() Mocker.GetMock<IDownloadedBooksImportService>()
@ -285,9 +285,9 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
[Test] [Test]
public void should_mark_as_imported_if_all_episodes_were_imported_including_history() public void should_mark_as_imported_if_all_episodes_were_imported_including_history()
{ {
var albums = Builder<Book>.CreateListOfSize(2).BuildList(); var books = Builder<Book>.CreateListOfSize(2).BuildList();
_trackedDownload.RemoteBook.Books = albums; _trackedDownload.RemoteBook.Books = books;
Mocker.GetMock<IDownloadedBooksImportService>() Mocker.GetMock<IDownloadedBooksImportService>()
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Author>(), It.IsAny<DownloadClientItem>())) .Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Author>(), It.IsAny<DownloadClientItem>()))
@ -295,11 +295,11 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
{ {
new ImportResult( new ImportResult(
new ImportDecision<LocalBook>( new ImportDecision<LocalBook>(
new LocalBook { Path = @"C:\TestPath\Droned.S01E01.mkv", Book = albums[0] })), new LocalBook { Path = @"C:\TestPath\Droned.S01E01.mkv", Book = books[0] })),
new ImportResult( new ImportResult(
new ImportDecision<LocalBook>( new ImportDecision<LocalBook>(
new LocalBook { Path = @"C:\TestPath\Droned.S01E02.mkv", Book = albums[1] }), "Test Failure") new LocalBook { Path = @"C:\TestPath\Droned.S01E02.mkv", Book = books[1] }), "Test Failure")
}); });
var history = Builder<History.History>.CreateListOfSize(2) var history = Builder<History.History>.CreateListOfSize(2)

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.With(h => h.Title = "Drone.S01E01.HDTV") .With(h => h.Title = "Drone.S01E01.HDTV")
.Build(); .Build();
var remoteBook = BuildRemoteAlbum(); var remoteBook = BuildRemoteBook();
_trackedDownload = Builder<TrackedDownload>.CreateNew() _trackedDownload = Builder<TrackedDownload>.CreateNew()
.With(c => c.State = TrackedDownloadState.Downloading) .With(c => c.State = TrackedDownloadState.Downloading)
@ -54,11 +54,11 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.Returns(new History.History()); .Returns(new History.History());
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist("Drone.S01E01.HDTV")) .Setup(s => s.GetAuthor("Drone.S01E01.HDTV"))
.Returns(remoteBook.Author); .Returns(remoteBook.Author);
} }
private RemoteBook BuildRemoteAlbum() private RemoteBook BuildRemoteBook()
{ {
return new RemoteBook return new RemoteBook
{ {
@ -74,10 +74,10 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.Returns((History.History)null); .Returns((History.History)null);
} }
private void GivenArtistMatch() private void GivenAuthorMatch()
{ {
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>())) .Setup(s => s.GetAuthor(It.IsAny<string>()))
.Returns(_trackedDownload.RemoteBook.Author); .Returns(_trackedDownload.RemoteBook.Author);
} }
@ -90,12 +90,12 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
.Returns(new History.History() { SourceTitle = "Droned S01E01" }); .Returns(new History.History() { SourceTitle = "Droned S01E01" });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>())) .Setup(s => s.GetAuthor(It.IsAny<string>()))
.Returns((Author)null); .Returns((Author)null);
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist("Droned S01E01")) .Setup(s => s.GetAuthor("Droned S01E01"))
.Returns(BuildRemoteAlbum().Author); .Returns(BuildRemoteBook().Author);
} }
[TestCase(DownloadItemStatus.Downloading)] [TestCase(DownloadItemStatus.Downloading)]
@ -128,7 +128,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
{ {
_trackedDownload.DownloadItem.Category = "tv"; _trackedDownload.DownloadItem.Category = "tv";
GivenNoGrabbedHistory(); GivenNoGrabbedHistory();
GivenArtistMatch(); GivenAuthorMatch();
Subject.Check(_trackedDownload); Subject.Check(_trackedDownload);
@ -164,7 +164,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests
{ {
_trackedDownload.RemoteBook.Author = null; _trackedDownload.RemoteBook.Author = null;
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist("Drone.S01E01.HDTV")) .Setup(s => s.GetAuthor("Drone.S01E01.HDTV"))
.Returns((Author)null); .Returns((Author)null);
Subject.Check(_trackedDownload); Subject.Check(_trackedDownload);

@ -30,21 +30,21 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
.Returns<List<DownloadDecision>>(v => v); .Returns<List<DownloadDecision>>(v => v);
} }
private Book GetAlbum(int id) private Book GetBook(int id)
{ {
return Builder<Book>.CreateNew() return Builder<Book>.CreateNew()
.With(e => e.Id = id) .With(e => e.Id = id)
.Build(); .Build();
} }
private RemoteBook GetRemoteAlbum(List<Book> albums, QualityModel quality, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) private RemoteBook GetRemoteBook(List<Book> books, QualityModel quality, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet)
{ {
var remoteBook = new RemoteBook(); var remoteBook = new RemoteBook();
remoteBook.ParsedBookInfo = new ParsedBookInfo(); remoteBook.ParsedBookInfo = new ParsedBookInfo();
remoteBook.ParsedBookInfo.Quality = quality; remoteBook.ParsedBookInfo.Quality = quality;
remoteBook.Books = new List<Book>(); remoteBook.Books = new List<Book>();
remoteBook.Books.AddRange(albums); remoteBook.Books.AddRange(books);
remoteBook.Release = new ReleaseInfo(); remoteBook.Release = new ReleaseInfo();
remoteBook.Release.DownloadProtocol = downloadProtocol; remoteBook.Release.DownloadProtocol = downloadProtocol;
@ -58,10 +58,10 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
} }
[Test] [Test]
public void should_download_report_if_album_was_not_already_downloaded() public void should_download_report_if_book_was_not_already_downloaded()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -71,10 +71,10 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
} }
[Test] [Test]
public void should_only_download_album_once() public void should_only_download_book_once()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -85,14 +85,14 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
} }
[Test] [Test]
public void should_not_download_if_any_album_was_already_downloaded() public void should_not_download_if_any_book_was_already_downloaded()
{ {
var remoteBook1 = GetRemoteAlbum( var remoteBook1 = GetRemoteBook(
new List<Book> { GetAlbum(1) }, new List<Book> { GetBook(1) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var remoteBook2 = GetRemoteAlbum( var remoteBook2 = GetRemoteBook(
new List<Book> { GetAlbum(1), GetAlbum(2) }, new List<Book> { GetBook(1), GetBook(2) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
@ -106,8 +106,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_return_downloaded_reports() public void should_return_downloaded_reports()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -118,12 +118,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_return_all_downloaded_reports() public void should_return_all_downloaded_reports()
{ {
var remoteBook1 = GetRemoteAlbum( var remoteBook1 = GetRemoteBook(
new List<Book> { GetAlbum(1) }, new List<Book> { GetBook(1) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var remoteBook2 = GetRemoteAlbum( var remoteBook2 = GetRemoteBook(
new List<Book> { GetAlbum(2) }, new List<Book> { GetBook(2) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
@ -136,16 +136,16 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_only_return_downloaded_reports() public void should_only_return_downloaded_reports()
{ {
var remoteBook1 = GetRemoteAlbum( var remoteBook1 = GetRemoteBook(
new List<Book> { GetAlbum(1) }, new List<Book> { GetBook(1) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var remoteBook2 = GetRemoteAlbum( var remoteBook2 = GetRemoteBook(
new List<Book> { GetAlbum(2) }, new List<Book> { GetBook(2) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var remoteBook3 = GetRemoteAlbum( var remoteBook3 = GetRemoteBook(
new List<Book> { GetAlbum(2) }, new List<Book> { GetBook(2) },
new QualityModel(Quality.MP3_320)); new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
@ -159,8 +159,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_not_add_to_downloaded_list_when_download_fails() public void should_not_add_to_downloaded_list_when_download_fails()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -183,8 +183,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_not_grab_if_pending() public void should_not_grab_if_pending()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook, new Rejection("Failure!", RejectionType.Temporary))); decisions.Add(new DownloadDecision(remoteBook, new Rejection("Failure!", RejectionType.Temporary)));
@ -194,10 +194,10 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
} }
[Test] [Test]
public void should_not_add_to_pending_if_album_was_grabbed() public void should_not_add_to_pending_if_book_was_grabbed()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -210,8 +210,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_add_to_pending_even_if_already_added_to_pending() public void should_add_to_pending_even_if_already_added_to_pending()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook, new Rejection("Failure!", RejectionType.Temporary))); decisions.Add(new DownloadDecision(remoteBook, new Rejection("Failure!", RejectionType.Temporary)));
@ -224,8 +224,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_add_to_failed_if_already_failed_for_that_protocol() public void should_add_to_failed_if_already_failed_for_that_protocol()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -241,9 +241,9 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_not_add_to_failed_if_failed_for_a_different_protocol() public void should_not_add_to_failed_if_failed_for_a_different_protocol()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320), DownloadProtocol.Usenet); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320), DownloadProtocol.Usenet);
var remoteBook2 = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320), DownloadProtocol.Torrent); var remoteBook2 = GetRemoteBook(books, new QualityModel(Quality.MP3_320), DownloadProtocol.Torrent);
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));
@ -260,8 +260,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
[Test] [Test]
public void should_add_to_rejected_if_release_unavailable_on_indexer() public void should_add_to_rejected_if_release_unavailable_on_indexer()
{ {
var albums = new List<Book> { GetAlbum(1) }; var books = new List<Book> { GetBook(1) };
var remoteBook = GetRemoteAlbum(albums, new QualityModel(Quality.MP3_320)); var remoteBook = GetRemoteBook(books, new QualityModel(Quality.MP3_320));
var decisions = new List<DownloadDecision>(); var decisions = new List<DownloadDecision>();
decisions.Add(new DownloadDecision(remoteBook)); decisions.Add(new DownloadDecision(remoteBook));

@ -87,15 +87,15 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
_magnetFilePath = Path.ChangeExtension(_filePath, extension); _magnetFilePath = Path.ChangeExtension(_filePath, extension);
} }
protected override RemoteBook CreateRemoteAlbum() protected override RemoteBook CreateRemoteBook()
{ {
var remoteBook = base.CreateRemoteAlbum(); var remoteBook = base.CreateRemoteBook();
var torrentInfo = new TorrentInfo(); var torrentInfo = new TorrentInfo();
torrentInfo.Title = remoteBook.Release.Title; torrentInfo.Title = remoteBook.Release.Title;
torrentInfo.DownloadUrl = remoteBook.Release.DownloadUrl; torrentInfo.DownloadUrl = remoteBook.Release.DownloadUrl;
torrentInfo.DownloadProtocol = remoteBook.Release.DownloadProtocol; torrentInfo.DownloadProtocol = remoteBook.Release.DownloadProtocol;
torrentInfo.MagnetUrl = "magnet:?xt=urn:btih:755248817d32b00cc853e633ecdc48e4c21bff15&dn=Artist.Album.FLAC.loseless-DEFiNE%5Brartv%5D&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710&tr=udp%3A%2F%2F9.rarbg.to%3A2710"; torrentInfo.MagnetUrl = "magnet:?xt=urn:btih:755248817d32b00cc853e633ecdc48e4c21bff15&dn=Author.Book.FLAC.loseless-DEFiNE%5Brartv%5D&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710&tr=udp%3A%2F%2F9.rarbg.to%3A2710";
remoteBook.Release = torrentInfo; remoteBook.Release = torrentInfo;
@ -141,7 +141,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
[Test] [Test]
public void Download_should_download_file_if_it_doesnt_exist() public void Download_should_download_file_if_it_doesnt_exist()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Subject.Download(remoteBook); Subject.Download(remoteBook);
@ -155,7 +155,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
{ {
GivenMagnetFilePath(); GivenMagnetFilePath();
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true; Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = null; remoteBook.Release.DownloadUrl = null;
Subject.Download(remoteBook); Subject.Download(remoteBook);
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never()); Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Never());
@ -173,7 +173,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true; Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
Subject.Definition.Settings.As<TorrentBlackholeSettings>().MagnetFileExtension = magnetFileExtension; Subject.Definition.Settings.As<TorrentBlackholeSettings>().MagnetFileExtension = magnetFileExtension;
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = null; remoteBook.Release.DownloadUrl = null;
Subject.Download(remoteBook); Subject.Download(remoteBook);
@ -188,7 +188,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
public void Download_should_not_save_magnet_if_disabled() public void Download_should_not_save_magnet_if_disabled()
{ {
GivenMagnetFilePath(); GivenMagnetFilePath();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = null; remoteBook.Release.DownloadUrl = null;
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook)); Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook));
@ -204,7 +204,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
{ {
Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true; Subject.Definition.Settings.As<TorrentBlackholeSettings>().SaveMagnetFiles = true;
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Subject.Download(remoteBook); Subject.Download(remoteBook);
@ -220,7 +220,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
var illegalTitle = "Radiohead - Scotch Mist [2008/FLAC/Lossless]"; var illegalTitle = "Radiohead - Scotch Mist [2008/FLAC/Lossless]";
var expectedFilename = Path.Combine(_blackholeFolder, "Radiohead - Scotch Mist [2008+FLAC+Lossless]" + Path.GetExtension(_filePath)); var expectedFilename = Path.Combine(_blackholeFolder, "Radiohead - Scotch Mist [2008+FLAC+Lossless]" + Path.GetExtension(_filePath));
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.Title = illegalTitle; remoteBook.Release.Title = illegalTitle;
Subject.Download(remoteBook); Subject.Download(remoteBook);
@ -233,7 +233,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
[Test] [Test]
public void Download_should_throw_if_magnet_and_torrent_url_does_not_exist() public void Download_should_throw_if_magnet_and_torrent_url_does_not_exist()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = null; remoteBook.Release.DownloadUrl = null;
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook)); Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook));
@ -308,7 +308,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
[Test] [Test]
public void should_return_null_hash() public void should_return_null_hash()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Subject.Download(remoteBook).Should().BeNull(); Subject.Download(remoteBook).Should().BeNull();
} }

@ -113,7 +113,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
[Test] [Test]
public void Download_should_download_file_if_it_doesnt_exist() public void Download_should_download_file_if_it_doesnt_exist()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Subject.Download(remoteBook); Subject.Download(remoteBook);
@ -128,7 +128,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
var illegalTitle = "Radiohead - Scotch Mist [2008/FLAC/Lossless]"; var illegalTitle = "Radiohead - Scotch Mist [2008/FLAC/Lossless]";
var expectedFilename = Path.Combine(_blackholeFolder, "Radiohead - Scotch Mist [2008+FLAC+Lossless]" + Path.GetExtension(_filePath)); var expectedFilename = Path.Combine(_blackholeFolder, "Radiohead - Scotch Mist [2008+FLAC+Lossless]" + Path.GetExtension(_filePath));
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.Title = illegalTitle; remoteBook.Release.Title = illegalTitle;
Subject.Download(remoteBook); Subject.Download(remoteBook);

@ -204,7 +204,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -216,7 +216,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = magnetUrl; remoteBook.Release.DownloadUrl = magnetUrl;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -30,7 +30,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.Map(It.IsAny<ParsedBookInfo>(), null)) .Setup(s => s.Map(It.IsAny<ParsedBookInfo>(), null))
.Returns(() => CreateRemoteAlbum()); .Returns(() => CreateRemoteBook());
Mocker.GetMock<IHttpClient>() Mocker.GetMock<IHttpClient>()
.Setup(s => s.Get(It.IsAny<HttpRequest>())) .Setup(s => s.Get(It.IsAny<HttpRequest>()))
@ -41,7 +41,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests
.Returns<string, OsPath>((h, r) => r); .Returns<string, OsPath>((h, r) => r);
} }
protected virtual RemoteBook CreateRemoteAlbum() protected virtual RemoteBook CreateRemoteBook()
{ {
var remoteBook = new RemoteBook(); var remoteBook = new RemoteBook();
remoteBook.Release = new ReleaseInfo(); remoteBook.Release = new ReleaseInfo();

@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
protected string _serialNumber = "SERIALNUMBER"; protected string _serialNumber = "SERIALNUMBER";
protected string _category = "readarr"; protected string _category = "readarr";
protected string _musicDirectory = @"music/Artist"; protected string _musicDirectory = @"music/Author";
protected string _defaultDestination = "somepath"; protected string _defaultDestination = "somepath";
protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata"); protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata");
@ -360,13 +360,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
.Callback(PrepareClientToReturnQueuedItem); .Callback(PrepareClientToReturnQueuedItem);
} }
protected override RemoteBook CreateRemoteAlbum() protected override RemoteBook CreateRemoteBook()
{ {
var album = base.CreateRemoteAlbum(); var book = base.CreateRemoteBook();
album.Release.DownloadUrl = DownloadURL; book.Release.DownloadUrl = DownloadURL;
return album; return book;
} }
protected int GivenAllKindOfTasks() protected int GivenAllKindOfTasks()
@ -387,7 +387,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenTvDirectory(); GivenTvDirectory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -404,7 +404,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenMusicCategory(); GivenMusicCategory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -420,7 +420,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenSerialNumber(); GivenSerialNumber();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -495,7 +495,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
[Test] [Test]
public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number() public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Mocker.GetMock<ISerialNumberProvider>() Mocker.GetMock<ISerialNumberProvider>()
.Setup(s => s.GetSerialNumber(_settings)) .Setup(s => s.GetSerialNumber(_settings))

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
protected string _serialNumber = "SERIALNUMBER"; protected string _serialNumber = "SERIALNUMBER";
protected string _category = "readarr"; protected string _category = "readarr";
protected string _musicDirectory = @"music/Artist"; protected string _musicDirectory = @"music/Author";
protected string _defaultDestination = "somepath"; protected string _defaultDestination = "somepath";
protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata"); protected OsPath _physicalPath = new OsPath("/mnt/sdb1/mydata");
@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_remoteBook = CreateRemoteAlbum(); _remoteBook = CreateRemoteBook();
_settings = new DownloadStationSettings() _settings = new DownloadStationSettings()
{ {
@ -264,7 +264,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenTvDirectory(); GivenTvDirectory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -281,7 +281,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenMusicCategory(); GivenMusicCategory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -297,7 +297,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
GivenSerialNumber(); GivenSerialNumber();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -372,7 +372,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests
[Test] [Test]
public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number() public void Download_should_throw_and_not_add_task_if_cannot_get_serial_number()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Mocker.GetMock<ISerialNumberProvider>() Mocker.GetMock<ISerialNumberProvider>()
.Setup(s => s.GetSerialNumber(_settings)) .Setup(s => s.GetSerialNumber(_settings))

@ -200,7 +200,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -279,7 +279,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
[Test] [Test]
public void Download_from_magnet_link_should_return_hash_uppercase() public void Download_from_magnet_link_should_return_hash_uppercase()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:a45129e59d8750f9da982f53552b1e4f0457ee9f"; remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:a45129e59d8750f9da982f53552b1e4f0457ee9f";
@ -294,7 +294,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests
[Test] [Test]
public void Download_from_torrent_file_should_return_hash_uppercase() public void Download_from_torrent_file_should_return_hash_uppercase()
{ {
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Mocker.GetMock<IHadoukenProxy>() Mocker.GetMock<IHadoukenProxy>()
.Setup(v => v.AddTorrentFile(It.IsAny<HadoukenSettings>(), It.IsAny<byte[]>())) .Setup(v => v.AddTorrentFile(It.IsAny<HadoukenSettings>(), It.IsAny<byte[]>()))

@ -204,7 +204,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -216,7 +216,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests
{ {
GivenFailedDownload(); GivenFailedDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Assert.Throws<DownloadClientException>(() => Subject.Download(remoteBook)); Assert.Throws<DownloadClientException>(() => Subject.Download(remoteBook));
} }

@ -335,7 +335,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -347,7 +347,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
{ {
GivenFailedDownload(); GivenFailedDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
Assert.Throws<DownloadClientRejectedReleaseException>(() => Subject.Download(remoteBook)); Assert.Throws<DownloadClientRejectedReleaseException>(() => Subject.Download(remoteBook));
} }
@ -452,7 +452,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests
[Test] [Test]
public void should_use_final_dir_when_set_instead_of_dest_dir() public void should_use_final_dir_when_set_instead_of_dest_dir()
{ {
_completed.FinalDir = "/remote/mount/music2/Some.Artist-Some.Album.FLAC.2018-DRONE"; _completed.FinalDir = "/remote/mount/music2/Some.Author-Some.Book.FLAC.2018-DRONE";
GivenQueue(null); GivenQueue(null);
GivenHistory(_completed); GivenHistory(_completed);

@ -422,7 +422,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -434,7 +434,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = magnetUrl; remoteBook.Release.DownloadUrl = magnetUrl;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -449,7 +449,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>())) .Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
.Returns(new QBittorrentPreferences() { DhtEnabled = false }); .Returns(new QBittorrentPreferences() { DhtEnabled = false });
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR"; remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR";
Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook)); Assert.Throws<ReleaseDownloadException>(() => Subject.Download(remoteBook));
@ -462,7 +462,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>())) .Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
.Returns(new QBittorrentPreferences { DhtEnabled = false }); .Returns(new QBittorrentPreferences { DhtEnabled = false });
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp://abc"; remoteBook.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp://abc";
Assert.DoesNotThrow(() => Subject.Download(remoteBook)); Assert.DoesNotThrow(() => Subject.Download(remoteBook));
@ -477,7 +477,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
GivenHighPriority(); GivenHighPriority();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -495,7 +495,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
.Setup(v => v.MoveTorrentToTopInQueue(It.IsAny<string>(), It.IsAny<QBittorrentSettings>())) .Setup(v => v.MoveTorrentToTopInQueue(It.IsAny<string>(), It.IsAny<QBittorrentSettings>()))
.Throws(new HttpException(new HttpResponse(new HttpRequest("http://me.local/"), new HttpHeader(), new byte[0], System.Net.HttpStatusCode.Forbidden))); .Throws(new HttpException(new HttpResponse(new HttpRequest("http://me.local/"), new HttpHeader(), new byte[0], System.Net.HttpStatusCode.Forbidden)));
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -529,7 +529,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
GivenRedirectToMagnet(); GivenRedirectToMagnet();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -542,7 +542,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
GivenRedirectToTorrent(); GivenRedirectToTorrent();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -115,7 +115,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -298,7 +298,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.Title = title; remoteBook.Release.Title = title;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -312,7 +312,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -353,7 +353,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
.Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>())) .Setup(s => s.DownloadNzb(It.IsAny<byte[]>(), It.IsAny<string>(), It.IsAny<string>(), (int)SabnzbdPriority.High, It.IsAny<SabnzbdSettings>()))
.Returns(new SabnzbdAddResponse { Ids = new List<string> { "readarrtest" } }); .Returns(new SabnzbdAddResponse { Ids = new List<string> { "readarrtest" } });
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Books = Builder<Book>.CreateListOfSize(1) remoteBook.Books = Builder<Book>.CreateListOfSize(1)
.All() .All()
.With(e => e.ReleaseDate = DateTime.Today) .With(e => e.ReleaseDate = DateTime.Today)

@ -58,7 +58,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -71,7 +71,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
GivenTvDirectory(); GivenTvDirectory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -87,7 +87,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
GivenMusicCategory(); GivenMusicCategory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -105,7 +105,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
_transmissionConfigItems["download-dir"] += "/"; _transmissionConfigItems["download-dir"] += "/";
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -120,7 +120,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -135,7 +135,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = magnetUrl; remoteBook.Release.DownloadUrl = magnetUrl;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -232,7 +232,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -256,7 +256,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = magnetUrl; remoteBook.Release.DownloadUrl = magnetUrl;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -355,7 +355,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
GivenRedirectToMagnet(); GivenRedirectToMagnet();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -368,7 +368,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests
GivenRedirectToTorrent(); GivenRedirectToTorrent();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -67,7 +67,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
GivenTvDirectory(); GivenTvDirectory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -96,7 +96,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
GivenMusicCategory(); GivenMusicCategory();
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -114,7 +114,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
_transmissionConfigItems["download-dir"] += "/"; _transmissionConfigItems["download-dir"] += "/";
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -129,7 +129,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);
@ -144,7 +144,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
{ {
GivenSuccessfulDownload(); GivenSuccessfulDownload();
var remoteBook = CreateRemoteAlbum(); var remoteBook = CreateRemoteBook();
remoteBook.Release.DownloadUrl = magnetUrl; remoteBook.Release.DownloadUrl = magnetUrl;
var id = Subject.Download(remoteBook); var id = Subject.Download(remoteBook);

@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Download.FailedDownloadServiceTests
var completed = Builder<DownloadClientItem>.CreateNew() var completed = Builder<DownloadClientItem>.CreateNew()
.With(h => h.Status = DownloadItemStatus.Completed) .With(h => h.Status = DownloadItemStatus.Completed)
.With(h => h.OutputPath = new OsPath(@"C:\DropFolder\MyDownload".AsOsAgnostic())) .With(h => h.OutputPath = new OsPath(@"C:\DropFolder\MyDownload".AsOsAgnostic()))
.With(h => h.Title = "Drone.DroneTheAlbum.FLAC") .With(h => h.Title = "Drone.DroneTheBook.FLAC")
.Build(); .Build();
_grabHistory = Builder<History.History>.CreateListOfSize(2).BuildList(); _grabHistory = Builder<History.History>.CreateListOfSize(2).BuildList();

@ -21,8 +21,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
public class AddFixture : CoreTest<PendingReleaseService> public class AddFixture : CoreTest<PendingReleaseService>
{ {
private DownloadDecision _temporarilyRejected; private DownloadDecision _temporarilyRejected;
private Author _artist; private Author _author;
private Book _album; private Book _book;
private QualityProfile _profile; private QualityProfile _profile;
private ReleaseInfo _release; private ReleaseInfo _release;
private ParsedBookInfo _parsedBookInfo; private ParsedBookInfo _parsedBookInfo;
@ -32,10 +32,10 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.Build(); .Build();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.Build(); .Build();
_profile = new QualityProfile _profile = new QualityProfile
@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
}, },
}; };
_artist.QualityProfile = new LazyLoaded<QualityProfile>(_profile); _author.QualityProfile = new LazyLoaded<QualityProfile>(_profile);
_release = Builder<ReleaseInfo>.CreateNew().Build(); _release = Builder<ReleaseInfo>.CreateNew().Build();
@ -58,8 +58,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
_parsedBookInfo.Quality = new QualityModel(Quality.MP3_320); _parsedBookInfo.Quality = new QualityModel(Quality.MP3_320);
_remoteBook = new RemoteBook(); _remoteBook = new RemoteBook();
_remoteBook.Books = new List<Book> { _album }; _remoteBook.Books = new List<Book> { _book };
_remoteBook.Author = _artist; _remoteBook.Author = _author;
_remoteBook.ParsedBookInfo = _parsedBookInfo; _remoteBook.ParsedBookInfo = _parsedBookInfo;
_remoteBook.Release = _release; _remoteBook.Release = _release;
@ -77,15 +77,15 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthor(It.IsAny<int>())) .Setup(s => s.GetAuthor(It.IsAny<int>()))
.Returns(_artist); .Returns(_author);
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>())) .Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>()))
.Returns(new List<Author> { _artist }); .Returns(new List<Author> { _author });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetAlbums(It.IsAny<ParsedBookInfo>(), _artist, null)) .Setup(s => s.GetBooks(It.IsAny<ParsedBookInfo>(), _author, null))
.Returns(new List<Book> { _album }); .Returns(new List<Book> { _book });
Mocker.GetMock<IPrioritizeDownloadDecision>() Mocker.GetMock<IPrioritizeDownloadDecision>()
.Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>())) .Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
@ -100,7 +100,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
var heldReleases = Builder<PendingRelease>.CreateListOfSize(1) var heldReleases = Builder<PendingRelease>.CreateListOfSize(1)
.All() .All()
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.With(h => h.Title = title) .With(h => h.Title = title)
.With(h => h.Release = release) .With(h => h.Release = release)
.With(h => h.Reason = reason) .With(h => h.Reason = reason)

@ -21,8 +21,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
public class RemoveGrabbedFixture : CoreTest<PendingReleaseService> public class RemoveGrabbedFixture : CoreTest<PendingReleaseService>
{ {
private DownloadDecision _temporarilyRejected; private DownloadDecision _temporarilyRejected;
private Author _artist; private Author _author;
private Book _album; private Book _book;
private QualityProfile _profile; private QualityProfile _profile;
private ReleaseInfo _release; private ReleaseInfo _release;
private ParsedBookInfo _parsedBookInfo; private ParsedBookInfo _parsedBookInfo;
@ -32,10 +32,10 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.Build(); .Build();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.Build(); .Build();
_profile = new QualityProfile _profile = new QualityProfile
@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
}, },
}; };
_artist.QualityProfile = new LazyLoaded<QualityProfile>(_profile); _author.QualityProfile = new LazyLoaded<QualityProfile>(_profile);
_release = Builder<ReleaseInfo>.CreateNew().Build(); _release = Builder<ReleaseInfo>.CreateNew().Build();
@ -58,8 +58,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
_parsedBookInfo.Quality = new QualityModel(Quality.MP3_320); _parsedBookInfo.Quality = new QualityModel(Quality.MP3_320);
_remoteBook = new RemoteBook(); _remoteBook = new RemoteBook();
_remoteBook.Books = new List<Book> { _album }; _remoteBook.Books = new List<Book> { _book };
_remoteBook.Author = _artist; _remoteBook.Author = _author;
_remoteBook.ParsedBookInfo = _parsedBookInfo; _remoteBook.ParsedBookInfo = _parsedBookInfo;
_remoteBook.Release = _release; _remoteBook.Release = _release;
@ -77,15 +77,15 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthor(It.IsAny<int>())) .Setup(s => s.GetAuthor(It.IsAny<int>()))
.Returns(_artist); .Returns(_author);
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>())) .Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>()))
.Returns(new List<Author> { _artist }); .Returns(new List<Author> { _author });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetAlbums(It.IsAny<ParsedBookInfo>(), _artist, null)) .Setup(s => s.GetBooks(It.IsAny<ParsedBookInfo>(), _author, null))
.Returns(new List<Book> { _album }); .Returns(new List<Book> { _book });
Mocker.GetMock<IPrioritizeDownloadDecision>() Mocker.GetMock<IPrioritizeDownloadDecision>()
.Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>())) .Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
@ -99,7 +99,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
var heldReleases = Builder<PendingRelease>.CreateListOfSize(1) var heldReleases = Builder<PendingRelease>.CreateListOfSize(1)
.All() .All()
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.With(h => h.Release = _release.JsonClone()) .With(h => h.Release = _release.JsonClone())
.With(h => h.ParsedBookInfo = parsedEpisodeInfo) .With(h => h.ParsedBookInfo = parsedEpisodeInfo)
.Build(); .Build();

@ -16,14 +16,14 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
public class RemovePendingFixture : CoreTest<PendingReleaseService> public class RemovePendingFixture : CoreTest<PendingReleaseService>
{ {
private List<PendingRelease> _pending; private List<PendingRelease> _pending;
private Book _album; private Book _book;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_pending = new List<PendingRelease>(); _pending = new List<PendingRelease>();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.Build(); .Build();
Mocker.GetMock<IPendingReleaseRepository>() Mocker.GetMock<IPendingReleaseRepository>()
@ -43,25 +43,25 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
.Returns(new List<Author> { new Author() }); .Returns(new List<Author> { new Author() });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetAlbums(It.IsAny<ParsedBookInfo>(), It.IsAny<Author>(), null)) .Setup(s => s.GetBooks(It.IsAny<ParsedBookInfo>(), It.IsAny<Author>(), null))
.Returns(new List<Book> { _album }); .Returns(new List<Book> { _book });
} }
private void AddPending(int id, string album) private void AddPending(int id, string book)
{ {
_pending.Add(new PendingRelease _pending.Add(new PendingRelease
{ {
Id = id, Id = id,
ParsedBookInfo = new ParsedBookInfo { BookTitle = album } ParsedBookInfo = new ParsedBookInfo { BookTitle = book }
}); });
} }
[Test] [Test]
public void should_remove_same_release() public void should_remove_same_release()
{ {
AddPending(id: 1, album: "Album"); AddPending(id: 1, book: "Book");
var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 1, _album.Id)); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 1, _book.Id));
Subject.RemovePendingQueueItems(queueId); Subject.RemovePendingQueueItems(queueId);
@ -71,12 +71,12 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
[Test] [Test]
public void should_remove_multiple_releases_release() public void should_remove_multiple_releases_release()
{ {
AddPending(id: 1, album: "Album 1"); AddPending(id: 1, book: "Book 1");
AddPending(id: 2, album: "Album 2"); AddPending(id: 2, book: "Book 2");
AddPending(id: 3, album: "Album 3"); AddPending(id: 3, book: "Book 3");
AddPending(id: 4, album: "Album 3"); AddPending(id: 4, book: "Book 3");
var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 3, _album.Id)); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 3, _book.Id));
Subject.RemovePendingQueueItems(queueId); Subject.RemovePendingQueueItems(queueId);
@ -84,14 +84,14 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
} }
[Test] [Test]
public void should_not_remove_diffrent_albums() public void should_not_remove_diffrent_books()
{ {
AddPending(id: 1, album: "Album 1"); AddPending(id: 1, book: "Book 1");
AddPending(id: 2, album: "Album 1"); AddPending(id: 2, book: "Book 1");
AddPending(id: 3, album: "Album 2"); AddPending(id: 3, book: "Book 2");
AddPending(id: 4, album: "Album 3"); AddPending(id: 4, book: "Book 3");
var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 1, _album.Id)); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-book{1}", 1, _book.Id));
Subject.RemovePendingQueueItems(queueId); Subject.RemovePendingQueueItems(queueId);

@ -22,8 +22,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
public class RemoveRejectedFixture : CoreTest<PendingReleaseService> public class RemoveRejectedFixture : CoreTest<PendingReleaseService>
{ {
private DownloadDecision _temporarilyRejected; private DownloadDecision _temporarilyRejected;
private Author _artist; private Author _author;
private Book _album; private Book _book;
private QualityProfile _profile; private QualityProfile _profile;
private ReleaseInfo _release; private ReleaseInfo _release;
private ParsedBookInfo _parsedBookInfo; private ParsedBookInfo _parsedBookInfo;
@ -32,10 +32,10 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.Build(); .Build();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.Build(); .Build();
_profile = new QualityProfile _profile = new QualityProfile
@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
}, },
}; };
_artist.QualityProfile = new LazyLoaded<QualityProfile>(_profile); _author.QualityProfile = new LazyLoaded<QualityProfile>(_profile);
_release = Builder<ReleaseInfo>.CreateNew().Build(); _release = Builder<ReleaseInfo>.CreateNew().Build();
@ -58,8 +58,8 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
_parsedBookInfo.Quality = new QualityModel(Quality.MP3_320); _parsedBookInfo.Quality = new QualityModel(Quality.MP3_320);
_remoteBook = new RemoteBook(); _remoteBook = new RemoteBook();
_remoteBook.Books = new List<Book> { _album }; _remoteBook.Books = new List<Book> { _book };
_remoteBook.Author = _artist; _remoteBook.Author = _author;
_remoteBook.ParsedBookInfo = _parsedBookInfo; _remoteBook.ParsedBookInfo = _parsedBookInfo;
_remoteBook.Release = _release; _remoteBook.Release = _release;
@ -71,15 +71,15 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthor(It.IsAny<int>())) .Setup(s => s.GetAuthor(It.IsAny<int>()))
.Returns(_artist); .Returns(_author);
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>())) .Setup(s => s.GetAuthors(It.IsAny<IEnumerable<int>>()))
.Returns(new List<Author> { _artist }); .Returns(new List<Author> { _author });
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetAlbums(It.IsAny<ParsedBookInfo>(), _artist, null)) .Setup(s => s.GetBooks(It.IsAny<ParsedBookInfo>(), _author, null))
.Returns(new List<Book> { _album }); .Returns(new List<Book> { _book });
Mocker.GetMock<IPrioritizeDownloadDecision>() Mocker.GetMock<IPrioritizeDownloadDecision>()
.Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>())) .Setup(s => s.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
@ -94,7 +94,7 @@ namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests
var heldReleases = Builder<PendingRelease>.CreateListOfSize(1) var heldReleases = Builder<PendingRelease>.CreateListOfSize(1)
.All() .All()
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.With(h => h.Title = title) .With(h => h.Title = title)
.With(h => h.Release = release) .With(h => h.Release = release)
.Build(); .Build();

@ -64,7 +64,7 @@ namespace NzbDrone.Core.Test.Download
} }
[Test] [Test]
public void should_redownload_album_on_failure() public void should_redownload_book_on_failure()
{ {
var failedEvent = new DownloadFailedEvent var failedEvent = new DownloadFailedEvent
{ {
@ -87,7 +87,7 @@ namespace NzbDrone.Core.Test.Download
} }
[Test] [Test]
public void should_redownload_multiple_albums_on_failure() public void should_redownload_multiple_books_on_failure()
{ {
var failedEvent = new DownloadFailedEvent var failedEvent = new DownloadFailedEvent
{ {
@ -111,9 +111,9 @@ namespace NzbDrone.Core.Test.Download
} }
[Test] [Test]
public void should_redownload_artist_on_failure() public void should_redownload_author_on_failure()
{ {
// note that artist is set to have 3 albums in setup // note that author is set to have 3 books in setup
var failedEvent = new DownloadFailedEvent var failedEvent = new DownloadFailedEvent
{ {
AuthorId = 2, AuthorId = 2,

@ -13,17 +13,17 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
[TestFixture] [TestFixture]
public class TrackedDownloadAlreadyImportedFixture : CoreTest<TrackedDownloadAlreadyImported> public class TrackedDownloadAlreadyImportedFixture : CoreTest<TrackedDownloadAlreadyImported>
{ {
private List<Book> _albums; private List<Book> _books;
private TrackedDownload _trackedDownload; private TrackedDownload _trackedDownload;
private List<History.History> _historyItems; private List<History.History> _historyItems;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_albums = new List<Book>(); _books = new List<Book>();
var remoteBook = Builder<RemoteBook>.CreateNew() var remoteBook = Builder<RemoteBook>.CreateNew()
.With(r => r.Books = _albums) .With(r => r.Books = _books)
.Build(); .Build();
_trackedDownload = Builder<TrackedDownload>.CreateNew() _trackedDownload = Builder<TrackedDownload>.CreateNew()
@ -35,7 +35,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
public void GivenEpisodes(int count) public void GivenEpisodes(int count)
{ {
_albums.AddRange(Builder<Book>.CreateListOfSize(count) _books.AddRange(Builder<Book>.CreateListOfSize(count)
.BuildList()); .BuildList());
} }
@ -66,7 +66,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
{ {
GivenEpisodes(1); GivenEpisodes(1);
GivenHistoryForEpisode(_albums[0], HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[0], HistoryEventType.Grabbed);
Subject.IsImported(_trackedDownload, _historyItems) Subject.IsImported(_trackedDownload, _historyItems)
.Should() .Should()
@ -78,8 +78,8 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
{ {
GivenEpisodes(2); GivenEpisodes(2);
GivenHistoryForEpisode(_albums[0], HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[0], HistoryEventType.Grabbed);
GivenHistoryForEpisode(_albums[1], HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[1], HistoryEventType.Grabbed);
Subject.IsImported(_trackedDownload, _historyItems) Subject.IsImported(_trackedDownload, _historyItems)
.Should() .Should()
@ -91,8 +91,8 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
{ {
GivenEpisodes(2); GivenEpisodes(2);
GivenHistoryForEpisode(_albums[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed);
GivenHistoryForEpisode(_albums[1], HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[1], HistoryEventType.Grabbed);
Subject.IsImported(_trackedDownload, _historyItems) Subject.IsImported(_trackedDownload, _historyItems)
.Should() .Should()
@ -104,7 +104,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
{ {
GivenEpisodes(1); GivenEpisodes(1);
GivenHistoryForEpisode(_albums[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed);
Subject.IsImported(_trackedDownload, _historyItems) Subject.IsImported(_trackedDownload, _historyItems)
.Should() .Should()
@ -116,8 +116,8 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
{ {
GivenEpisodes(2); GivenEpisodes(2);
GivenHistoryForEpisode(_albums[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[0], HistoryEventType.DownloadImported, HistoryEventType.Grabbed);
GivenHistoryForEpisode(_albums[1], HistoryEventType.DownloadImported, HistoryEventType.Grabbed); GivenHistoryForEpisode(_books[1], HistoryEventType.DownloadImported, HistoryEventType.Grabbed);
Subject.IsImported(_trackedDownload, _historyItems) Subject.IsImported(_trackedDownload, _historyItems)
.Should() .Should()

@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
new History.History() new History.History()
{ {
DownloadId = "35238", DownloadId = "35238",
SourceTitle = "Audio Artist - Audio Album [2018 - FLAC]", SourceTitle = "Audio Author - Audio Book [2018 - FLAC]",
AuthorId = 5, AuthorId = 5,
BookId = 4, BookId = 4,
} }
@ -45,13 +45,13 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
Books = new List<Book> { new Book { Id = 4 } }, Books = new List<Book> { new Book { Id = 4 } },
ParsedBookInfo = new ParsedBookInfo() ParsedBookInfo = new ParsedBookInfo()
{ {
BookTitle = "Audio Album", BookTitle = "Audio Book",
AuthorName = "Audio Artist" AuthorName = "Audio Author"
} }
}; };
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Album" && i.AuthorName == "Audio Artist"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>())) .Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Book" && i.AuthorName == "Audio Author"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>()))
.Returns(remoteBook); .Returns(remoteBook);
var client = new DownloadClientDefinition() var client = new DownloadClientDefinition()
@ -82,7 +82,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
} }
[Test] [Test]
public void should_unmap_tracked_download_if_album_deleted() public void should_unmap_tracked_download_if_book_deleted()
{ {
GivenDownloadHistory(); GivenDownloadHistory();
@ -92,13 +92,13 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
Books = new List<Book> { new Book { Id = 4 } }, Books = new List<Book> { new Book { Id = 4 } },
ParsedBookInfo = new ParsedBookInfo() ParsedBookInfo = new ParsedBookInfo()
{ {
BookTitle = "Audio Album", BookTitle = "Audio Book",
AuthorName = "Audio Artist" AuthorName = "Audio Author"
} }
}; };
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Album" && i.AuthorName == "Audio Artist"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>())) .Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Book" && i.AuthorName == "Audio Author"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>()))
.Returns(remoteBook); .Returns(remoteBook);
var client = new DownloadClientDefinition() var client = new DownloadClientDefinition()
@ -109,7 +109,7 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
var item = new DownloadClientItem() var item = new DownloadClientItem()
{ {
Title = "Audio Artist - Audio Album [2018 - FLAC]", Title = "Audio Author - Audio Book [2018 - FLAC]",
DownloadId = "35238", DownloadId = "35238",
DownloadClientInfo = new DownloadClientItemClientInfo DownloadClientInfo = new DownloadClientItemClientInfo
{ {
@ -123,15 +123,15 @@ namespace NzbDrone.Core.Test.Download.TrackedDownloads
var trackedDownload = Subject.TrackDownload(client, item); var trackedDownload = Subject.TrackDownload(client, item);
Subject.GetTrackedDownloads().Should().HaveCount(1); Subject.GetTrackedDownloads().Should().HaveCount(1);
// simulate deletion - album no longer maps // simulate deletion - book no longer maps
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Album" && i.AuthorName == "Audio Artist"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>())) .Setup(s => s.Map(It.Is<ParsedBookInfo>(i => i.BookTitle == "Audio Book" && i.AuthorName == "Audio Author"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>()))
.Returns(default(RemoteBook)); .Returns(default(RemoteBook));
// handle deletion event // handle deletion event
Subject.Handle(new BookDeletedEvent(remoteBook.Books.First(), false, false)); Subject.Handle(new BookDeletedEvent(remoteBook.Books.First(), false, false));
// verify download has null remote album // verify download has null remote book
var trackedDownloads = Subject.GetTrackedDownloads(); var trackedDownloads = Subject.GetTrackedDownloads();
trackedDownloads.Should().HaveCount(1); trackedDownloads.Should().HaveCount(1);
trackedDownloads.First().RemoteBook.Should().BeNull(); trackedDownloads.First().RemoteBook.Should().BeNull();

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"e34999c7-36bd-4d77-a10b-627b1b4f3904" "e34999c7-36bd-4d77-a10b-627b1b4f3904"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "401c3991-b76b-499d-8082-9f2df958ef78", "author": "401c3991-b76b-499d-8082-9f2df958ef78",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -156,8 +156,8 @@
{ {
"path": "/media/nas/video/unpacked/music/Phil_Collins_The_Essential_Going_Back_(081227946470)_REMASTERED_DELUXE_EDITION_2CD_FLAC_2016_WRE/101-phil_collins-going_back.flac", "path": "/media/nas/video/unpacked/music/Phil_Collins_The_Essential_Going_Back_(081227946470)_REMASTERED_DELUXE_EDITION_2CD_FLAC_2016_WRE/101-phil_collins-going_back.flac",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitle": "Phil Collins The Essential Going Back (081227946470) REMASTERED DELUXE EDITION 2CD FLAC 2016 WRE 101", "authorTitle": "Phil Collins The Essential Going Back (081227946470) REMASTERED DELUXE EDITION 2CD FLAC 2016 WRE 101",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins The Essential Going Back (081227946470) REMASTERED DELUXE EDITION 2CD FLAC 2016 WRE 101", "title": "Phil Collins The Essential Going Back (081227946470) REMASTERED DELUXE EDITION 2CD FLAC 2016 WRE 101",
"year": 0 "year": 0
}, },
@ -183,9 +183,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Girl (Why You Wanna Make Me Blue)", "title": "Girl (Why You Wanna Make Me Blue)",
"cleanTitle": "Girl (Why You Wanna Make Me Blue)", "cleanTitle": "Girl (Why You Wanna Make Me Blue)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -221,9 +221,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "(Love Is Like A) Heatwave", "title": "(Love Is Like A) Heatwave",
"cleanTitle": "(Love Is Like A) Heatwave", "cleanTitle": "(Love Is Like A) Heatwave",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -259,9 +259,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Some Of Your Lovin'", "title": "Some Of Your Lovin'",
"cleanTitle": "Some Of Your Lovin'", "cleanTitle": "Some Of Your Lovin'",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -297,9 +297,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Going To A Go-Go", "title": "Going To A Go-Go",
"cleanTitle": "Going To A Go-Go", "cleanTitle": "Going To A Go-Go",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -335,9 +335,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Papa Was A Rolling Stone", "title": "Papa Was A Rolling Stone",
"cleanTitle": "Papa Was A Rolling Stone", "cleanTitle": "Papa Was A Rolling Stone",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -373,9 +373,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Loving You Is Sweeter Than Ever", "title": "Loving You Is Sweeter Than Ever",
"cleanTitle": "Loving You Is Sweeter Than Ever", "cleanTitle": "Loving You Is Sweeter Than Ever",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -411,9 +411,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Something About You", "title": "Something About You",
"cleanTitle": "Something About You", "cleanTitle": "Something About You",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -449,9 +449,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Talkin' About My Baby", "title": "Talkin' About My Baby",
"cleanTitle": "Talkin' About My Baby", "cleanTitle": "Talkin' About My Baby",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -487,9 +487,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Do I Love You", "title": "Do I Love You",
"cleanTitle": "Do I Love You", "cleanTitle": "Do I Love You",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -525,9 +525,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Never Dreamed You'd Leave In Summer", "title": "Never Dreamed You'd Leave In Summer",
"cleanTitle": "Never Dreamed You'd Leave In Summer", "cleanTitle": "Never Dreamed You'd Leave In Summer",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -563,9 +563,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Take Me In Your Arms (Rock Me For A Little While)", "title": "Take Me In Your Arms (Rock Me For A Little While)",
"cleanTitle": "Take Me In Your Arms (Rock Me For A Little While)", "cleanTitle": "Take Me In Your Arms (Rock Me For A Little While)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -601,9 +601,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Too Many Fish In The Sea", "title": "Too Many Fish In The Sea",
"cleanTitle": "Too Many Fish In The Sea", "cleanTitle": "Too Many Fish In The Sea",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -639,9 +639,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Uptight (Everything's Alright)", "title": "Uptight (Everything's Alright)",
"cleanTitle": "Uptight (Everything's Alright)", "cleanTitle": "Uptight (Everything's Alright)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -677,9 +677,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Signed, Sealed, Delivered (I'm Yours) Intro (Live)", "title": "Signed, Sealed, Delivered (I'm Yours) Intro (Live)",
"cleanTitle": "Signed, Sealed, Delivered (I'm Yours) Intro (Live)", "cleanTitle": "Signed, Sealed, Delivered (I'm Yours) Intro (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -715,9 +715,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Ain't Too Proud To Beg (Live)", "title": "Ain't Too Proud To Beg (Live)",
"cleanTitle": "Ain't Too Proud To Beg (Live)", "cleanTitle": "Ain't Too Proud To Beg (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -753,9 +753,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Girl (Why You Wanna Make Me Blue) (Live)", "title": "Girl (Why You Wanna Make Me Blue) (Live)",
"cleanTitle": "Girl (Why You Wanna Make Me Blue) (Live)", "cleanTitle": "Girl (Why You Wanna Make Me Blue) (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -791,9 +791,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Dancing In The Street (Live)", "title": "Dancing In The Street (Live)",
"cleanTitle": "Dancing In The Street (Live)", "cleanTitle": "Dancing In The Street (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -829,9 +829,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "(Love Is Like A) Heatwave (Live)", "title": "(Love Is Like A) Heatwave (Live)",
"cleanTitle": "(Love Is Like A) Heatwave (Live)", "cleanTitle": "(Love Is Like A) Heatwave (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -867,9 +867,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Papa Was A Rolling Stone (Live)", "title": "Papa Was A Rolling Stone (Live)",
"cleanTitle": "Papa Was A Rolling Stone (Live)", "cleanTitle": "Papa Was A Rolling Stone (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -905,9 +905,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Never Dreamed You'd Leave In Summer (Live)", "title": "Never Dreamed You'd Leave In Summer (Live)",
"cleanTitle": "Never Dreamed You'd Leave In Summer (Live)", "cleanTitle": "Never Dreamed You'd Leave In Summer (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -943,9 +943,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Talkin' About My Baby (Live)", "title": "Talkin' About My Baby (Live)",
"cleanTitle": "Talkin' About My Baby (Live)", "cleanTitle": "Talkin' About My Baby (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -981,9 +981,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Do I Love You (Live)", "title": "Do I Love You (Live)",
"cleanTitle": "Do I Love You (Live)", "cleanTitle": "Do I Love You (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1019,9 +1019,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Ain't That Peculiar (Live)", "title": "Ain't That Peculiar (Live)",
"cleanTitle": "Ain't That Peculiar (Live)", "cleanTitle": "Ain't That Peculiar (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1057,9 +1057,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Too Many Fish In The Sea (Live)", "title": "Too Many Fish In The Sea (Live)",
"cleanTitle": "Too Many Fish In The Sea (Live)", "cleanTitle": "Too Many Fish In The Sea (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1095,9 +1095,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "You Really Got A Hold On Me (Live)", "title": "You Really Got A Hold On Me (Live)",
"cleanTitle": "You Really Got A Hold On Me (Live)", "cleanTitle": "You Really Got A Hold On Me (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1133,9 +1133,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Something About You (Live)", "title": "Something About You (Live)",
"cleanTitle": "Something About You (Live)", "cleanTitle": "Something About You (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1171,9 +1171,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Uptight (Everything's Alright) (Live)", "title": "Uptight (Everything's Alright) (Live)",
"cleanTitle": "Uptight (Everything's Alright) (Live)", "cleanTitle": "Uptight (Everything's Alright) (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1209,9 +1209,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "My Girl (Live)", "title": "My Girl (Live)",
"cleanTitle": "My Girl (Live)", "cleanTitle": "My Girl (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },
@ -1247,9 +1247,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Going Back (Live)", "title": "Going Back (Live)",
"cleanTitle": "Going Back (Live)", "cleanTitle": "Going Back (Live)",
"artistTitle": "Phil Collins", "authorTitle": "Phil Collins",
"albumTitle": "The Essential Going Back", "bookTitle": "The Essential Going Back",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Phil Collins", "title": "Phil Collins",
"year": 2016 "year": 2016
}, },

@ -4,114 +4,114 @@
"97189482-89ee-4d31-90c7-ba07b412d7f9", "97189482-89ee-4d31-90c7-ba07b412d7f9",
"9105a5b3-eb68-3a03-9aa8-f3495e602a4f" "9105a5b3-eb68-3a03-9aa8-f3495e602a4f"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "author": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -160,14 +160,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Rolling in the Deep", "title": "Rolling in the Deep",
"cleanTitle": "Rolling in the Deep", "cleanTitle": "Rolling in the Deep",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "1a13c710-4b7e-4701-8968-cd61f2e58110", "recordingMBId": "1a13c710-4b7e-4701-8968-cd61f2e58110",
"discNumber": 1, "discNumber": 1,
@ -207,14 +207,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Rumour Has It", "title": "Rumour Has It",
"cleanTitle": "Rumour Has It", "cleanTitle": "Rumour Has It",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "797ae656-81d4-4d89-bddb-eca56f77ba72", "recordingMBId": "797ae656-81d4-4d89-bddb-eca56f77ba72",
"discNumber": 1, "discNumber": 1,
@ -254,14 +254,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Turning Tables", "title": "Turning Tables",
"cleanTitle": "Turning Tables", "cleanTitle": "Turning Tables",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "5ac6c47f-bce8-4718-8bc6-f1de40693d14", "recordingMBId": "5ac6c47f-bce8-4718-8bc6-f1de40693d14",
"discNumber": 1, "discNumber": 1,
@ -301,14 +301,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Dont You Remember", "title": "Dont You Remember",
"cleanTitle": "Dont You Remember", "cleanTitle": "Dont You Remember",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "f5057d26-1aac-47fe-b766-18c5a28927b1", "recordingMBId": "f5057d26-1aac-47fe-b766-18c5a28927b1",
"discNumber": 1, "discNumber": 1,
@ -348,14 +348,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Set Fire to the Rain", "title": "Set Fire to the Rain",
"cleanTitle": "Set Fire to the Rain", "cleanTitle": "Set Fire to the Rain",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "d1e0a99e-1894-457b-ba6a-985eeef4d0c4", "recordingMBId": "d1e0a99e-1894-457b-ba6a-985eeef4d0c4",
"discNumber": 1, "discNumber": 1,
@ -395,14 +395,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "He Wont Go", "title": "He Wont Go",
"cleanTitle": "He Wont Go", "cleanTitle": "He Wont Go",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "4dd209b9-80fd-4e11-8093-3bab2db810fc", "recordingMBId": "4dd209b9-80fd-4e11-8093-3bab2db810fc",
"discNumber": 1, "discNumber": 1,
@ -442,14 +442,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Take It All", "title": "Take It All",
"cleanTitle": "Take It All", "cleanTitle": "Take It All",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "4f515654-052b-4631-8a78-57ea362cd18a", "recordingMBId": "4f515654-052b-4631-8a78-57ea362cd18a",
"discNumber": 1, "discNumber": 1,
@ -489,14 +489,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Ill Be Waiting", "title": "Ill Be Waiting",
"cleanTitle": "Ill Be Waiting", "cleanTitle": "Ill Be Waiting",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "dd2d2073-50c4-438a-91cc-a1fea1c81b12", "recordingMBId": "dd2d2073-50c4-438a-91cc-a1fea1c81b12",
"discNumber": 1, "discNumber": 1,
@ -536,14 +536,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "One and Only", "title": "One and Only",
"cleanTitle": "One and Only", "cleanTitle": "One and Only",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "04f96056-91ac-4b64-af89-24c596013f05", "recordingMBId": "04f96056-91ac-4b64-af89-24c596013f05",
"discNumber": 1, "discNumber": 1,
@ -583,14 +583,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Lovesong", "title": "Lovesong",
"cleanTitle": "Lovesong", "cleanTitle": "Lovesong",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "7932ba40-a0d3-4a7e-8d85-b351fd33317e", "recordingMBId": "7932ba40-a0d3-4a7e-8d85-b351fd33317e",
"discNumber": 1, "discNumber": 1,
@ -630,14 +630,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Someone Like You", "title": "Someone Like You",
"cleanTitle": "Someone Like You", "cleanTitle": "Someone Like You",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "028efe7f-cdfb-4135-846f-848f2fff15b1", "recordingMBId": "028efe7f-cdfb-4135-846f-848f2fff15b1",
"discNumber": 1, "discNumber": 1,
@ -677,14 +677,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "I Found a Boy", "title": "I Found a Boy",
"cleanTitle": "I Found a Boy", "cleanTitle": "I Found a Boy",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "a027bfd5-c002-4a85-906e-f2c613c45022", "recordingMBId": "a027bfd5-c002-4a85-906e-f2c613c45022",
"discNumber": 1, "discNumber": 1,
@ -724,14 +724,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Turning Tables (live acoustic)", "title": "Turning Tables (live acoustic)",
"cleanTitle": "Turning Tables (live acoustic)", "cleanTitle": "Turning Tables (live acoustic)",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "b2e47e6d-b69a-420a-aa52-31d3f38978ed", "recordingMBId": "b2e47e6d-b69a-420a-aa52-31d3f38978ed",
"discNumber": 1, "discNumber": 1,
@ -771,14 +771,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Dont You Remember (live acoustic)", "title": "Dont You Remember (live acoustic)",
"cleanTitle": "Dont You Remember (live acoustic)", "cleanTitle": "Dont You Remember (live acoustic)",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "b19a4995-7fbf-406a-8ff1-db5b8896bd28", "recordingMBId": "b19a4995-7fbf-406a-8ff1-db5b8896bd28",
"discNumber": 1, "discNumber": 1,
@ -818,14 +818,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Someone Like You (live acoustic)", "title": "Someone Like You (live acoustic)",
"cleanTitle": "Someone Like You (live acoustic)", "cleanTitle": "Someone Like You (live acoustic)",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "21", "bookTitle": "21",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2011 "year": 2011
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e", "bookMBId": "e4174758-d333-4a8e-a31f-dd0edd51518e",
"releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6", "releaseMBId": "768bc7f7-6b91-4b57-8a7b-1508636719e6",
"recordingMBId": "c365d988-0f2d-4313-9c5f-a557c30f027b", "recordingMBId": "c365d988-0f2d-4313-9c5f-a557c30f027b",
"discNumber": 1, "discNumber": 1,
@ -865,14 +865,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Hello", "title": "Hello",
"cleanTitle": "Hello", "cleanTitle": "Hello",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "0a8e8d55-4b83-4f8a-9732-fbb5ded9f344", "recordingMBId": "0a8e8d55-4b83-4f8a-9732-fbb5ded9f344",
"discNumber": 1, "discNumber": 1,
@ -912,14 +912,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Send My Love (to Your New Lover)", "title": "Send My Love (to Your New Lover)",
"cleanTitle": "Send My Love (to Your New Lover)", "cleanTitle": "Send My Love (to Your New Lover)",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "1e74cd4c-cfa7-4bdb-99da-41869f5f1171", "recordingMBId": "1e74cd4c-cfa7-4bdb-99da-41869f5f1171",
"discNumber": 1, "discNumber": 1,
@ -959,14 +959,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "I Miss You", "title": "I Miss You",
"cleanTitle": "I Miss You", "cleanTitle": "I Miss You",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "20594682-fa10-43e8-80fa-b116c68f1b7f", "recordingMBId": "20594682-fa10-43e8-80fa-b116c68f1b7f",
"discNumber": 1, "discNumber": 1,
@ -1006,14 +1006,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "When We Were Young", "title": "When We Were Young",
"cleanTitle": "When We Were Young", "cleanTitle": "When We Were Young",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "c5ad2611-071b-4003-bb22-eee8b4f48fe9", "recordingMBId": "c5ad2611-071b-4003-bb22-eee8b4f48fe9",
"discNumber": 1, "discNumber": 1,
@ -1053,14 +1053,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Remedy", "title": "Remedy",
"cleanTitle": "Remedy", "cleanTitle": "Remedy",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "cdc9f701-60b4-4e37-a94f-87d0e396f2bc", "recordingMBId": "cdc9f701-60b4-4e37-a94f-87d0e396f2bc",
"discNumber": 1, "discNumber": 1,
@ -1100,14 +1100,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Water Under the Bridge", "title": "Water Under the Bridge",
"cleanTitle": "Water Under the Bridge", "cleanTitle": "Water Under the Bridge",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "ade2f0f3-39bf-46ad-a44d-7fc4a8069db7", "recordingMBId": "ade2f0f3-39bf-46ad-a44d-7fc4a8069db7",
"discNumber": 1, "discNumber": 1,
@ -1147,14 +1147,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "River Lea", "title": "River Lea",
"cleanTitle": "River Lea", "cleanTitle": "River Lea",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "b7c37d3d-feea-4a73-8346-9e2392a292e6", "recordingMBId": "b7c37d3d-feea-4a73-8346-9e2392a292e6",
"discNumber": 1, "discNumber": 1,
@ -1194,14 +1194,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Love in the Dark", "title": "Love in the Dark",
"cleanTitle": "Love in the Dark", "cleanTitle": "Love in the Dark",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "dedf519d-8eca-4756-9f93-c390308e0c1b", "recordingMBId": "dedf519d-8eca-4756-9f93-c390308e0c1b",
"discNumber": 1, "discNumber": 1,
@ -1241,14 +1241,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Million Years Ago", "title": "Million Years Ago",
"cleanTitle": "Million Years Ago", "cleanTitle": "Million Years Ago",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "870c62b6-ba2c-4873-b962-6289128e4a90", "recordingMBId": "870c62b6-ba2c-4873-b962-6289128e4a90",
"discNumber": 1, "discNumber": 1,
@ -1288,14 +1288,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "All I Ask", "title": "All I Ask",
"cleanTitle": "All I Ask", "cleanTitle": "All I Ask",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "bfe7a94e-4161-4802-8916-efe57e611842", "recordingMBId": "bfe7a94e-4161-4802-8916-efe57e611842",
"discNumber": 1, "discNumber": 1,
@ -1335,14 +1335,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Sweetest Devotion", "title": "Sweetest Devotion",
"cleanTitle": "Sweetest Devotion", "cleanTitle": "Sweetest Devotion",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "25", "bookTitle": "25",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2015 "year": 2015
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "5537624c-3d2f-4f5c-8099-df916082c85c", "bookMBId": "5537624c-3d2f-4f5c-8099-df916082c85c",
"releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9", "releaseMBId": "97189482-89ee-4d31-90c7-ba07b412d7f9",
"recordingMBId": "b2c8aed1-777d-409b-941e-7d4c594697a2", "recordingMBId": "b2c8aed1-777d-409b-941e-7d4c594697a2",
"discNumber": 1, "discNumber": 1,
@ -1382,14 +1382,14 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Right as Rain", "title": "Right as Rain",
"cleanTitle": "Right as Rain", "cleanTitle": "Right as Rain",
"artistTitle": "Adele", "authorTitle": "Adele",
"albumTitle": "19", "bookTitle": "19",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Adele", "title": "Adele",
"year": 2008 "year": 2008
}, },
"artistMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "authorMBId": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"albumMBId": "9796da06-2d59-3176-8598-2105f31ee54a", "bookMBId": "9796da06-2d59-3176-8598-2105f31ee54a",
"releaseMBId": "9105a5b3-eb68-3a03-9aa8-f3495e602a4f", "releaseMBId": "9105a5b3-eb68-3a03-9aa8-f3495e602a4f",
"recordingMBId": "e5aa0386-15cc-43a8-a059-b14fc39b8301", "recordingMBId": "e5aa0386-15cc-43a8-a059-b14fc39b8301",
"trackMBId": "d98b4797-f47e-3acf-b334-54c71c9cb608", "trackMBId": "d98b4797-f47e-3acf-b334-54c71c9cb608",

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"9105a5b3-eb68-3a03-9aa8-f3495e602a4f" "9105a5b3-eb68-3a03-9aa8-f3495e602a4f"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493", "author": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -156,7 +156,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 101 - Daydreamer.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 101 - Daydreamer.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -188,7 +188,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 102 - Best for Last.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 102 - Best for Last.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -220,7 +220,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 103 - Chasing Pavements.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 103 - Chasing Pavements.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -252,7 +252,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 104 - Cold Shoulder.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 104 - Cold Shoulder.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -284,7 +284,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 105 - Crazy for You.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 105 - Crazy for You.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -316,7 +316,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 106 - Melt My Heart to Stone.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 106 - Melt My Heart to Stone.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -348,7 +348,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 107 - First Love.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 107 - First Love.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -380,7 +380,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 108 - Right as Rain.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 108 - Right as Rain.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -412,7 +412,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 109 - Make You Feel My Love.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 109 - Make You Feel My Love.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -444,7 +444,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 110 - My Same.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 110 - My Same.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -476,7 +476,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 111 - Tired.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 111 - Tired.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -508,7 +508,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 112 - Hometown Glory.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD1/Adele - 19 - 112 - Hometown Glory.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -540,7 +540,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 201 - Chasing Pavements.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 201 - Chasing Pavements.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -572,7 +572,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 202 - Melt My Heart to Stone.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 202 - Melt My Heart to Stone.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -604,7 +604,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 203 - That's It, I Quit, I'm Moving On.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 203 - That's It, I Quit, I'm Moving On.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -636,7 +636,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 204 - Crazy for You.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 204 - Crazy for You.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -668,7 +668,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 205 - Right as Rain.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 205 - Right as Rain.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -700,7 +700,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 206 - My Same.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 206 - My Same.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -732,7 +732,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 207 - Make You Feel My Love.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 207 - Make You Feel My Love.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -764,7 +764,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 208 - Daydreamer.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 208 - Daydreamer.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -796,7 +796,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 209 - Hometown Glory.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 209 - Hometown Glory.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,
@ -828,7 +828,7 @@
{ {
"path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 210 - Many Shades of Black.mp3", "path": "/mnt/data1/ImportTest/19_no_tags/CD2/Adele - 19 - 210 - Many Shades of Black.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"artistTitleInfo": { "authorTitleInfo": {
"year": 0 "year": 0
}, },
"discNumber": 0, "discNumber": 0,

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"134f5f3e-8b5f-46ab-809d-8c0dbc794f3e" "134f5f3e-8b5f-46ab-809d-8c0dbc794f3e"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "c296e10c-110a-4103-9e77-47bfebb7fb2e", "author": "c296e10c-110a-4103-9e77-47bfebb7fb2e",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -158,9 +158,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Positive Vibration", "title": "Positive Vibration",
"cleanTitle": "Positive Vibration", "cleanTitle": "Positive Vibration",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -195,9 +195,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Roots Rock Reggae", "title": "Roots Rock Reggae",
"cleanTitle": "Roots Rock Reggae", "cleanTitle": "Roots Rock Reggae",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -232,9 +232,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Johnny Was", "title": "Johnny Was",
"cleanTitle": "Johnny Was", "cleanTitle": "Johnny Was",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -269,9 +269,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Cry To Me", "title": "Cry To Me",
"cleanTitle": "Cry To Me", "cleanTitle": "Cry To Me",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -306,9 +306,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Want More", "title": "Want More",
"cleanTitle": "Want More", "cleanTitle": "Want More",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -343,9 +343,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Crazy Baldhead", "title": "Crazy Baldhead",
"cleanTitle": "Crazy Baldhead", "cleanTitle": "Crazy Baldhead",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -380,9 +380,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Who The Cap Fit", "title": "Who The Cap Fit",
"cleanTitle": "Who The Cap Fit", "cleanTitle": "Who The Cap Fit",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -417,9 +417,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Night Shift", "title": "Night Shift",
"cleanTitle": "Night Shift", "cleanTitle": "Night Shift",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -454,9 +454,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "War", "title": "War",
"cleanTitle": "War", "cleanTitle": "War",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -491,9 +491,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Rat Race", "title": "Rat Race",
"cleanTitle": "Rat Race", "cleanTitle": "Rat Race",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -528,9 +528,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Jah Live (Original Mix)", "title": "Jah Live (Original Mix)",
"cleanTitle": "Jah Live (Original Mix)", "cleanTitle": "Jah Live (Original Mix)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -565,9 +565,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Concrete", "title": "Concrete",
"cleanTitle": "Concrete", "cleanTitle": "Concrete",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -602,9 +602,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Roots Rock Reggae", "title": "Roots Rock Reggae",
"cleanTitle": "Roots Rock Reggae", "cleanTitle": "Roots Rock Reggae",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -639,9 +639,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Roots Rock Dub", "title": "Roots Rock Dub",
"cleanTitle": "Roots Rock Dub", "cleanTitle": "Roots Rock Dub",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -676,9 +676,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Want More (Alternate Mix)", "title": "Want More (Alternate Mix)",
"cleanTitle": "Want More (Alternate Mix)", "cleanTitle": "Want More (Alternate Mix)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -713,9 +713,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Crazy Baldhead (Alternate Mix)", "title": "Crazy Baldhead (Alternate Mix)",
"cleanTitle": "Crazy Baldhead (Alternate Mix)", "cleanTitle": "Crazy Baldhead (Alternate Mix)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -750,9 +750,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "War (Alternate Mix)", "title": "War (Alternate Mix)",
"cleanTitle": "War (Alternate Mix)", "cleanTitle": "War (Alternate Mix)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -787,9 +787,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Johnny Was (Alternate Mix)", "title": "Johnny Was (Alternate Mix)",
"cleanTitle": "Johnny Was (Alternate Mix)", "cleanTitle": "Johnny Was (Alternate Mix)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered", "bookTitle": "Rastaman Vibration (Remastered",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -824,9 +824,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Introduction", "title": "Introduction",
"cleanTitle": "Introduction", "cleanTitle": "Introduction",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -861,9 +861,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Trenchtown Rock (Live)", "title": "Trenchtown Rock (Live)",
"cleanTitle": "Trenchtown Rock (Live)", "cleanTitle": "Trenchtown Rock (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -898,9 +898,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Burnin And Looting (Live)", "title": "Burnin And Looting (Live)",
"cleanTitle": "Burnin And Looting (Live)", "cleanTitle": "Burnin And Looting (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -935,9 +935,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Them Belly Full (Live)", "title": "Them Belly Full (Live)",
"cleanTitle": "Them Belly Full (Live)", "cleanTitle": "Them Belly Full (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -972,9 +972,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Rebel Music (Live)", "title": "Rebel Music (Live)",
"cleanTitle": "Rebel Music (Live)", "cleanTitle": "Rebel Music (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1009,9 +1009,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "I Shot The Sheriff (Live)", "title": "I Shot The Sheriff (Live)",
"cleanTitle": "I Shot The Sheriff (Live)", "cleanTitle": "I Shot The Sheriff (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1046,9 +1046,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Want More (Live)", "title": "Want More (Live)",
"cleanTitle": "Want More (Live)", "cleanTitle": "Want More (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1083,9 +1083,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "No Woman No Cry (Live)", "title": "No Woman No Cry (Live)",
"cleanTitle": "No Woman No Cry (Live)", "cleanTitle": "No Woman No Cry (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1120,9 +1120,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Lively Up Yourself (Live)", "title": "Lively Up Yourself (Live)",
"cleanTitle": "Lively Up Yourself (Live)", "cleanTitle": "Lively Up Yourself (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1157,9 +1157,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Roots Rock Reggae (Live)", "title": "Roots Rock Reggae (Live)",
"cleanTitle": "Roots Rock Reggae (Live)", "cleanTitle": "Roots Rock Reggae (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1194,9 +1194,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Rat Race (Live)", "title": "Rat Race (Live)",
"cleanTitle": "Rat Race (Live)", "cleanTitle": "Rat Race (Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1231,9 +1231,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Smile Jamica (Part One Live)", "title": "Smile Jamica (Part One Live)",
"cleanTitle": "Smile Jamica (Part One Live)", "cleanTitle": "Smile Jamica (Part One Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },
@ -1268,9 +1268,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Smile Jamica (Part 2 Live)", "title": "Smile Jamica (Part 2 Live)",
"cleanTitle": "Smile Jamica (Part 2 Live)", "cleanTitle": "Smile Jamica (Part 2 Live)",
"artistTitle": "Bob Marley & The Wailers", "authorTitle": "Bob Marley & The Wailers",
"albumTitle": "Rastaman Vibration (Remastered)", "bookTitle": "Rastaman Vibration (Remastered)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bob Marley & The Wailers", "title": "Bob Marley & The Wailers",
"year": 2002 "year": 2002
}, },

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"0ce2d66f-e871-415a-9a85-e564f99d4021" "0ce2d66f-e871-415a-9a85-e564f99d4021"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "7ac055fa-e357-4890-9098-010b8094a900", "author": "7ac055fa-e357-4890-9098-010b8094a900",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": true "allowed": true
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -158,9 +158,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Touch Me When We're Dancing", "title": "Touch Me When We're Dancing",
"cleanTitle": "Touch Me When We're Dancing", "cleanTitle": "Touch Me When We're Dancing",
"artistTitle": "Alabama", "authorTitle": "Alabama",
"albumTitle": "The Touch", "bookTitle": "The Touch",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Alabama", "title": "Alabama",
"year": 1986 "year": 1986
}, },

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"25f0fa1b-ae04-479a-a182-18a655ff6040" "25f0fa1b-ae04-479a-a182-18a655ff6040"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "70248960-cb53-4ea4-943a-edb18f7d336f", "author": "70248960-cb53-4ea4-943a-edb18f7d336f",
"metadataProfile": { "metadataProfile": {
"name": "Album+Single", "name": "Book+Single",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": true "allowed": true
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
@ -154,13 +154,13 @@
"singleRelease": false, "singleRelease": false,
"tracks": [ "tracks": [
{ {
"path": "/mnt/data1/ReadarrTest/Bruce Springsteen/Album/10_Glory_Days.mp3", "path": "/mnt/data1/ReadarrTest/Bruce Springsteen/Book/10_Glory_Days.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"title": "Glory Days", "title": "Glory Days",
"cleanTitle": "Glory Days", "cleanTitle": "Glory Days",
"artistTitle": "Bruce Springsteen", "authorTitle": "Bruce Springsteen",
"albumTitle": "Born in the U.S.A.", "bookTitle": "Born in the U.S.A.",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bruce Springsteen", "title": "Bruce Springsteen",
"year": 1984 "year": 1984
}, },
@ -191,13 +191,13 @@
} }
}, },
{ {
"path": "/mnt/data1/ReadarrTest/Bruce Springsteen/Album/11_Dancing_In_The_Dark.mp3", "path": "/mnt/data1/ReadarrTest/Bruce Springsteen/Book/11_Dancing_In_The_Dark.mp3",
"fileTrackInfo": { "fileTrackInfo": {
"title": "Dancing In The Dark", "title": "Dancing In The Dark",
"cleanTitle": "Dancing In The Dark", "cleanTitle": "Dancing In The Dark",
"artistTitle": "Bruce Springsteen", "authorTitle": "Bruce Springsteen",
"albumTitle": "Born in the U.S.A.", "bookTitle": "Born in the U.S.A.",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Bruce Springsteen", "title": "Bruce Springsteen",
"year": 1984 "year": 1984
}, },

@ -2,114 +2,114 @@
"expectedMusicBrainzReleaseIds": [ "expectedMusicBrainzReleaseIds": [
"4e2dd34f-53fe-4d54-b564-b14a2871505e" "4e2dd34f-53fe-4d54-b564-b14a2871505e"
], ],
"libraryArtists": [ "libraryAuthors": [
{ {
"artist": "6fe07aa5-fec0-4eca-a456-f29bff451b04", "author": "6fe07aa5-fec0-4eca-a456-f29bff451b04",
"metadataProfile": { "metadataProfile": {
"name": "Standard", "name": "Standard",
"primaryAlbumTypes": [ "primaryBookTypes": [
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 2, "id": 2,
"name": "Single" "name": "Single"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 4, "id": 4,
"name": "Other" "name": "Other"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 1, "id": 1,
"name": "EP" "name": "EP"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 3, "id": 3,
"name": "Broadcast" "name": "Broadcast"
}, },
"allowed": false "allowed": false
}, },
{ {
"primaryAlbumType": { "primaryBookType": {
"id": 0, "id": 0,
"name": "Album" "name": "Book"
}, },
"allowed": true "allowed": true
} }
], ],
"secondaryAlbumTypes": [ "secondaryBookTypes": [
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 0, "id": 0,
"name": "Studio" "name": "Studio"
}, },
"allowed": true "allowed": true
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 3, "id": 3,
"name": "Spokenword" "name": "Spokenword"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 2, "id": 2,
"name": "Soundtrack" "name": "Soundtrack"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 7, "id": 7,
"name": "Remix" "name": "Remix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 9, "id": 9,
"name": "Mixtape/Street" "name": "Mixtape/Street"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 6, "id": 6,
"name": "Live" "name": "Live"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 4, "id": 4,
"name": "Interview" "name": "Interview"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 8, "id": 8,
"name": "DJ-mix" "name": "DJ-mix"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 10, "id": 10,
"name": "Demo" "name": "Demo"
}, },
"allowed": false "allowed": false
}, },
{ {
"secondaryAlbumType": { "secondaryBookType": {
"id": 1, "id": 1,
"name": "Compilation" "name": "Compilation"
}, },
@ -158,9 +158,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Africa", "title": "Africa",
"cleanTitle": "Africa", "cleanTitle": "Africa",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -196,9 +196,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Everybody Wants To Rule The World", "title": "Everybody Wants To Rule The World",
"cleanTitle": "Everybody Wants To Rule The World", "cleanTitle": "Everybody Wants To Rule The World",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -234,9 +234,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Sweet Dreams (Are Made Of This)", "title": "Sweet Dreams (Are Made Of This)",
"cleanTitle": "Sweet Dreams (Are Made Of This)", "cleanTitle": "Sweet Dreams (Are Made Of This)",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -272,9 +272,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Take On Me", "title": "Take On Me",
"cleanTitle": "Take On Me", "cleanTitle": "Take On Me",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -310,9 +310,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Happy Together", "title": "Happy Together",
"cleanTitle": "Happy Together", "cleanTitle": "Happy Together",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -348,9 +348,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Paranoid", "title": "Paranoid",
"cleanTitle": "Paranoid", "cleanTitle": "Paranoid",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -386,9 +386,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Mr. Blue Sky", "title": "Mr. Blue Sky",
"cleanTitle": "Mr. Blue Sky", "cleanTitle": "Mr. Blue Sky",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -424,9 +424,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "No Scrubs", "title": "No Scrubs",
"cleanTitle": "No Scrubs", "cleanTitle": "No Scrubs",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -462,9 +462,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Billie Jean", "title": "Billie Jean",
"cleanTitle": "Billie Jean", "cleanTitle": "Billie Jean",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },
@ -500,9 +500,9 @@
"fileTrackInfo": { "fileTrackInfo": {
"title": "Stand By Me", "title": "Stand By Me",
"cleanTitle": "Stand By Me", "cleanTitle": "Stand By Me",
"artistTitle": "Weezer", "authorTitle": "Weezer",
"albumTitle": "Weezer (Teal Album)", "bookTitle": "Weezer (Teal Book)",
"artistTitleInfo": { "authorTitleInfo": {
"title": "Weezer", "title": "Weezer",
"year": 2019 "year": 2019
}, },

@ -7,7 +7,7 @@
{ {
"groupId": 106951, "groupId": 106951,
"groupName": "Shania Twain", "groupName": "Shania Twain",
"artist": "Shania Twain", "author": "Shania Twain",
"cover": "https:\\/\\/ptpimg.me\\/460az6.jpg", "cover": "https:\\/\\/ptpimg.me\\/460az6.jpg",
"tags": [ "tags": [
"rock", "rock",
@ -16,7 +16,7 @@
"bookmarked": false, "bookmarked": false,
"vanityHouse": false, "vanityHouse": false,
"groupYear": 1993, "groupYear": 1993,
"releaseType": "Album", "releaseType": "Book",
"groupTime": "1512951473", "groupTime": "1512951473",
"maxSize": 653734702, "maxSize": 653734702,
"totalSnatched": 33, "totalSnatched": 33,
@ -26,7 +26,7 @@
{ {
"torrentId": 194008, "torrentId": 194008,
"editionId": 1, "editionId": 1,
"artists": [ "authors": [
{ {
"id": 9504, "id": 9504,
"name": "Shania Twain", "name": "Shania Twain",
@ -60,7 +60,7 @@
{ {
"torrentId": 230096, "torrentId": 230096,
"editionId": 1, "editionId": 1,
"artists": [ "authors": [
{ {
"id": 9504, "id": 9504,
"name": "Shania Twain", "name": "Shania Twain",
@ -94,7 +94,7 @@
{ {
"torrentId": 230086, "torrentId": 230086,
"editionId": 1, "editionId": 1,
"artists": [ "authors": [
{ {
"id": 9504, "id": 9504,
"name": "Shania Twain", "name": "Shania Twain",
@ -128,7 +128,7 @@
{ {
"torrentId": 1541452, "torrentId": 1541452,
"editionId": 2, "editionId": 2,
"artists": [ "authors": [
{ {
"id": 9504, "id": 9504,
"name": "Shania Twain", "name": "Shania Twain",

@ -28,8 +28,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="492735000" /> <newznab:attr name="size" value="492735000" />
<newznab:attr name="guid" value="38884827e1e56b9336278a449e0a38ec" /> <newznab:attr name="guid" value="38884827e1e56b9336278a449e0a38ec" />
<newznab:attr name="album" value="Scary Creatures" /> <newznab:attr name="book" value="Scary Creatures" />
<newznab:attr name="artist" value="Brainstorm" /> <newznab:attr name="author" value="Brainstorm" />
<newznab:attr name="label" value="AFM Records" /> <newznab:attr name="label" value="AFM Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -49,8 +49,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="295696000" /> <newznab:attr name="size" value="295696000" />
<newznab:attr name="guid" value="d6395e3218b0b2ed15cbc3743df77112" /> <newznab:attr name="guid" value="d6395e3218b0b2ed15cbc3743df77112" />
<newznab:attr name="album" value="Cautionary Tale" /> <newznab:attr name="book" value="Cautionary Tale" />
<newznab:attr name="artist" value="Dylan LeBlanc" /> <newznab:attr name="author" value="Dylan LeBlanc" />
<newznab:attr name="label" value="Single Lock Records" /> <newznab:attr name="label" value="Single Lock Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Folk" /> <newznab:attr name="genre" value="Folk" />
@ -71,8 +71,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="608379000" /> <newznab:attr name="size" value="608379000" />
<newznab:attr name="guid" value="dc3230ac8143dd9a2fab65c07ad0f295" /> <newznab:attr name="guid" value="dc3230ac8143dd9a2fab65c07ad0f295" />
<newznab:attr name="album" value="This Is Acting" /> <newznab:attr name="book" value="This Is Acting" />
<newznab:attr name="artist" value="Sia" /> <newznab:attr name="author" value="Sia" />
<newznab:attr name="label" value="Monkey Puzzle RecordsRCA Records" /> <newznab:attr name="label" value="Monkey Puzzle RecordsRCA Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -93,8 +93,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="908727000" /> <newznab:attr name="size" value="908727000" />
<newznab:attr name="guid" value="a5560bb5ecf2ad19642527a567d427d0" /> <newznab:attr name="guid" value="a5560bb5ecf2ad19642527a567d427d0" />
<newznab:attr name="album" value="Leben II Explicit" /> <newznab:attr name="book" value="Leben II Explicit" />
<newznab:attr name="artist" value="Azad" /> <newznab:attr name="author" value="Azad" />
<newznab:attr name="label" value="Bozz Music" /> <newznab:attr name="label" value="Bozz Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rap &amp; Hip-Hop" /> <newznab:attr name="genre" value="Rap &amp; Hip-Hop" />
@ -115,8 +115,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="693728000" /> <newznab:attr name="size" value="693728000" />
<newznab:attr name="guid" value="eb42bbef1b5d8e0697962a291371655b" /> <newznab:attr name="guid" value="eb42bbef1b5d8e0697962a291371655b" />
<newznab:attr name="album" value="Planeta Mix Hits 2016 Winter Edition" /> <newznab:attr name="book" value="Planeta Mix Hits 2016 Winter Edition" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Planet Dance Music" /> <newznab:attr name="label" value="Planet Dance Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -137,8 +137,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="557772000" /> <newznab:attr name="size" value="557772000" />
<newznab:attr name="guid" value="812d0f7b9c38b6989d07c125eb35eabd" /> <newznab:attr name="guid" value="812d0f7b9c38b6989d07c125eb35eabd" />
<newznab:attr name="album" value="Into the Legend" /> <newznab:attr name="book" value="Into the Legend" />
<newznab:attr name="artist" value="Rhapsody Of Fire" /> <newznab:attr name="author" value="Rhapsody Of Fire" />
<newznab:attr name="label" value="AFM Records" /> <newznab:attr name="label" value="AFM Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -159,8 +159,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="433859000" /> <newznab:attr name="size" value="433859000" />
<newznab:attr name="guid" value="6ac8a40d20fb27a3d8fc11cb41afae4b" /> <newznab:attr name="guid" value="6ac8a40d20fb27a3d8fc11cb41afae4b" />
<newznab:attr name="album" value="Dystopia" /> <newznab:attr name="book" value="Dystopia" />
<newznab:attr name="artist" value="Megadeth" /> <newznab:attr name="author" value="Megadeth" />
<newznab:attr name="label" value="UMeTBoy Records" /> <newznab:attr name="label" value="UMeTBoy Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -181,8 +181,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="409419000" /> <newznab:attr name="size" value="409419000" />
<newznab:attr name="guid" value="36b4176e900767359b5ad2cb5c3b9906" /> <newznab:attr name="guid" value="36b4176e900767359b5ad2cb5c3b9906" />
<newznab:attr name="album" value="Wildfire" /> <newznab:attr name="book" value="Wildfire" />
<newznab:attr name="artist" value="Rachel Platten" /> <newznab:attr name="author" value="Rachel Platten" />
<newznab:attr name="label" value="Columbia" /> <newznab:attr name="label" value="Columbia" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -203,8 +203,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="602702000" /> <newznab:attr name="size" value="602702000" />
<newznab:attr name="guid" value="fc1aaca4356bef96677483c7da2b5693" /> <newznab:attr name="guid" value="fc1aaca4356bef96677483c7da2b5693" />
<newznab:attr name="album" value="For All Kings" /> <newznab:attr name="book" value="For All Kings" />
<newznab:attr name="artist" value="Anthrax" /> <newznab:attr name="author" value="Anthrax" />
<newznab:attr name="label" value="Megaforce" /> <newznab:attr name="label" value="Megaforce" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -225,8 +225,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="331143000" /> <newznab:attr name="size" value="331143000" />
<newznab:attr name="guid" value="c14b90c40483c0fe9ab9e93541453449" /> <newznab:attr name="guid" value="c14b90c40483c0fe9ab9e93541453449" />
<newznab:attr name="album" value="Rare Breed" /> <newznab:attr name="book" value="Rare Breed" />
<newznab:attr name="artist" value="Shrine, The" /> <newznab:attr name="author" value="Shrine, The" />
<newznab:attr name="label" value="Century Media" /> <newznab:attr name="label" value="Century Media" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -247,8 +247,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="512689000" /> <newznab:attr name="size" value="512689000" />
<newznab:attr name="guid" value="cf9908f3c878107d84c015aad48b8845" /> <newznab:attr name="guid" value="cf9908f3c878107d84c015aad48b8845" />
<newznab:attr name="album" value="For All Kings" /> <newznab:attr name="book" value="For All Kings" />
<newznab:attr name="artist" value="Anthrax" /> <newznab:attr name="author" value="Anthrax" />
<newznab:attr name="label" value="Megaforce" /> <newznab:attr name="label" value="Megaforce" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -269,8 +269,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="164608000" /> <newznab:attr name="size" value="164608000" />
<newznab:attr name="guid" value="06dcfac7a4b7f46dc1e9ec483f8ec73f" /> <newznab:attr name="guid" value="06dcfac7a4b7f46dc1e9ec483f8ec73f" />
<newznab:attr name="album" value="For All Kings" /> <newznab:attr name="book" value="For All Kings" />
<newznab:attr name="artist" value="Anthrax" /> <newznab:attr name="author" value="Anthrax" />
<newznab:attr name="label" value="Megaforce" /> <newznab:attr name="label" value="Megaforce" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -291,8 +291,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="116494000" /> <newznab:attr name="size" value="116494000" />
<newznab:attr name="guid" value="952effe2dc87e5d1c271d5ea8fa3801f" /> <newznab:attr name="guid" value="952effe2dc87e5d1c271d5ea8fa3801f" />
<newznab:attr name="album" value="Exoplanet" /> <newznab:attr name="book" value="Exoplanet" />
<newznab:attr name="artist" value="Contortionist, The" /> <newznab:attr name="author" value="Contortionist, The" />
<newznab:attr name="label" value="Good Fight Music" /> <newznab:attr name="label" value="Good Fight Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -313,8 +313,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="627256000" /> <newznab:attr name="size" value="627256000" />
<newznab:attr name="guid" value="474de3b6fe44b3190bf35fba59328327" /> <newznab:attr name="guid" value="474de3b6fe44b3190bf35fba59328327" />
<newznab:attr name="album" value="Hard Bass 2016" /> <newznab:attr name="book" value="Hard Bass 2016" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Imports" /> <newznab:attr name="label" value="Imports" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -335,8 +335,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="400294000" /> <newznab:attr name="size" value="400294000" />
<newznab:attr name="guid" value="31c118f3e86f87b071768a7e090176d1" /> <newznab:attr name="guid" value="31c118f3e86f87b071768a7e090176d1" />
<newznab:attr name="album" value="This Is Acting" /> <newznab:attr name="book" value="This Is Acting" />
<newznab:attr name="artist" value="Sia" /> <newznab:attr name="author" value="Sia" />
<newznab:attr name="label" value="Monkey Puzzle RecordsRCA Records" /> <newznab:attr name="label" value="Monkey Puzzle RecordsRCA Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -357,8 +357,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="549938000" /> <newznab:attr name="size" value="549938000" />
<newznab:attr name="guid" value="664f15bd457f6669745fa494091f8108" /> <newznab:attr name="guid" value="664f15bd457f6669745fa494091f8108" />
<newznab:attr name="album" value="Monsieur Fall" /> <newznab:attr name="book" value="Monsieur Fall" />
<newznab:attr name="artist" value="Lefa" /> <newznab:attr name="author" value="Lefa" />
<newznab:attr name="label" value="Imports" /> <newznab:attr name="label" value="Imports" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -379,8 +379,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="624799000" /> <newznab:attr name="size" value="624799000" />
<newznab:attr name="guid" value="a57f2a5d61f0b403b05904dc0e8a0d9e" /> <newznab:attr name="guid" value="a57f2a5d61f0b403b05904dc0e8a0d9e" />
<newznab:attr name="album" value="Now Thats What I Call Classic Rock" /> <newznab:attr name="book" value="Now Thats What I Call Classic Rock" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="NOW Joint Venture" /> <newznab:attr name="label" value="NOW Joint Venture" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -401,8 +401,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="971446000" /> <newznab:attr name="size" value="971446000" />
<newznab:attr name="guid" value="6b0315222a1df2a4b07f2681a9dbbc41" /> <newznab:attr name="guid" value="6b0315222a1df2a4b07f2681a9dbbc41" />
<newznab:attr name="album" value="Exterminate Extended DJ Versions WEB" /> <newznab:attr name="book" value="Exterminate Extended DJ Versions WEB" />
<newznab:attr name="artist" value="Anime" /> <newznab:attr name="author" value="Anime" />
<newznab:attr name="genre" value="Hardcore" /> <newznab:attr name="genre" value="Hardcore" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="5" /> <newznab:attr name="grabs" value="5" />
@ -421,8 +421,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="154908000" /> <newznab:attr name="size" value="154908000" />
<newznab:attr name="guid" value="51ac24dbb3122346e6fa2860efc3cff7" /> <newznab:attr name="guid" value="51ac24dbb3122346e6fa2860efc3cff7" />
<newznab:attr name="album" value="Absolute Uplifter, Vol 2 Euphoric Trance" /> <newznab:attr name="book" value="Absolute Uplifter, Vol 2 Euphoric Trance" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Rimoshee Traxx" /> <newznab:attr name="label" value="Rimoshee Traxx" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -443,8 +443,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="358513000" /> <newznab:attr name="size" value="358513000" />
<newznab:attr name="guid" value="d9e64c5efa86444f4c227fc99c155861" /> <newznab:attr name="guid" value="d9e64c5efa86444f4c227fc99c155861" />
<newznab:attr name="album" value="The Gift Of Music" /> <newznab:attr name="book" value="The Gift Of Music" />
<newznab:attr name="artist" value="Dream Theater" /> <newznab:attr name="author" value="Dream Theater" />
<newznab:attr name="label" value="Roadrunner Records" /> <newznab:attr name="label" value="Roadrunner Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -465,8 +465,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="152033000" /> <newznab:attr name="size" value="152033000" />
<newznab:attr name="guid" value="0d720fffa565fd1ab16f2f1eb8ef2129" /> <newznab:attr name="guid" value="0d720fffa565fd1ab16f2f1eb8ef2129" />
<newznab:attr name="album" value="The End" /> <newznab:attr name="book" value="The End" />
<newznab:attr name="artist" value="Black Sabbath" /> <newznab:attr name="author" value="Black Sabbath" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="341" /> <newznab:attr name="grabs" value="341" />
<newznab:attr name="usenetdate" value="Mon, 25 Jan 2016 18:52:05 +0000" /> <newznab:attr name="usenetdate" value="Mon, 25 Jan 2016 18:52:05 +0000" />
@ -484,8 +484,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="253814000" /> <newznab:attr name="size" value="253814000" />
<newznab:attr name="guid" value="0040f26df09ad3b0742f3b32afe7f3ab" /> <newznab:attr name="guid" value="0040f26df09ad3b0742f3b32afe7f3ab" />
<newznab:attr name="album" value="Status Quo Remastered Explicit" /> <newznab:attr name="book" value="Status Quo Remastered Explicit" />
<newznab:attr name="artist" value="Status Quo Quo" /> <newznab:attr name="author" value="Status Quo Quo" />
<newznab:attr name="label" value="Sidipus Records" /> <newznab:attr name="label" value="Sidipus Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -506,8 +506,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="307205000" /> <newznab:attr name="size" value="307205000" />
<newznab:attr name="guid" value="b0109c03014ff38a7b080e4791a31cb1" /> <newznab:attr name="guid" value="b0109c03014ff38a7b080e4791a31cb1" />
<newznab:attr name="album" value="Polonaise Deel 12" /> <newznab:attr name="book" value="Polonaise Deel 12" />
<newznab:attr name="artist" value="Stanneke amp Goldfinger" /> <newznab:attr name="author" value="Stanneke amp Goldfinger" />
<newznab:attr name="genre" value="Folk" /> <newznab:attr name="genre" value="Folk" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="3" /> <newznab:attr name="grabs" value="3" />
@ -526,8 +526,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="139348000" /> <newznab:attr name="size" value="139348000" />
<newznab:attr name="guid" value="3606e4c22779a8aa9da0fda29c851913" /> <newznab:attr name="guid" value="3606e4c22779a8aa9da0fda29c851913" />
<newznab:attr name="album" value="From Glory Towards Void" /> <newznab:attr name="book" value="From Glory Towards Void" />
<newznab:attr name="artist" value="Lutece" /> <newznab:attr name="author" value="Lutece" />
<newznab:attr name="label" value="Dooweet Records" /> <newznab:attr name="label" value="Dooweet Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Classical" /> <newznab:attr name="genre" value="Classical" />
@ -548,8 +548,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="85396000" /> <newznab:attr name="size" value="85396000" />
<newznab:attr name="guid" value="94b8ed888b3b42279961c3472e0b080d" /> <newznab:attr name="guid" value="94b8ed888b3b42279961c3472e0b080d" />
<newznab:attr name="album" value="II" /> <newznab:attr name="book" value="II" />
<newznab:attr name="artist" value="The Black Market Trust" /> <newznab:attr name="author" value="The Black Market Trust" />
<newznab:attr name="genre" value="Vocal Jazz; Pop" /> <newznab:attr name="genre" value="Vocal Jazz; Pop" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="usenetdate" value="Mon, 25 Jan 2016 04:00:51 +0000" /> <newznab:attr name="usenetdate" value="Mon, 25 Jan 2016 04:00:51 +0000" />
@ -567,8 +567,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="494061000" /> <newznab:attr name="size" value="494061000" />
<newznab:attr name="guid" value="ab70097392213165d77bc41b5375aa4a" /> <newznab:attr name="guid" value="ab70097392213165d77bc41b5375aa4a" />
<newznab:attr name="album" value="Winter Thrice" /> <newznab:attr name="book" value="Winter Thrice" />
<newznab:attr name="artist" value="Borknagar" /> <newznab:attr name="author" value="Borknagar" />
<newznab:attr name="label" value="Century Media" /> <newznab:attr name="label" value="Century Media" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -589,8 +589,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="157346000" /> <newznab:attr name="size" value="157346000" />
<newznab:attr name="guid" value="e562e530012f8e7b8e0340baed72060e" /> <newznab:attr name="guid" value="e562e530012f8e7b8e0340baed72060e" />
<newznab:attr name="album" value="Straight Outta Compton Original Motion Picture Score" /> <newznab:attr name="book" value="Straight Outta Compton Original Motion Picture Score" />
<newznab:attr name="artist" value="Joseph Trapanese" /> <newznab:attr name="author" value="Joseph Trapanese" />
<newznab:attr name="label" value="UME" /> <newznab:attr name="label" value="UME" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Soundtracks" /> <newznab:attr name="genre" value="Soundtracks" />
@ -611,8 +611,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="344739000" /> <newznab:attr name="size" value="344739000" />
<newznab:attr name="guid" value="1b1d1cf2690e9cf344968d6e4cd5432f" /> <newznab:attr name="guid" value="1b1d1cf2690e9cf344968d6e4cd5432f" />
<newznab:attr name="album" value="Deephouse Top 100 Vol3" /> <newznab:attr name="book" value="Deephouse Top 100 Vol3" />
<newznab:attr name="artist" value="VA" /> <newznab:attr name="author" value="VA" />
<newznab:attr name="genre" value="House" /> <newznab:attr name="genre" value="House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="6" /> <newznab:attr name="grabs" value="6" />
@ -631,8 +631,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="344739000" /> <newznab:attr name="size" value="344739000" />
<newznab:attr name="guid" value="bde795d6aa76e337ca996075d092f79a" /> <newznab:attr name="guid" value="bde795d6aa76e337ca996075d092f79a" />
<newznab:attr name="album" value="Deephouse Top 100 Vol3" /> <newznab:attr name="book" value="Deephouse Top 100 Vol3" />
<newznab:attr name="artist" value="VA" /> <newznab:attr name="author" value="VA" />
<newznab:attr name="genre" value="House" /> <newznab:attr name="genre" value="House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="8" /> <newznab:attr name="grabs" value="8" />
@ -651,8 +651,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="627117000" /> <newznab:attr name="size" value="627117000" />
<newznab:attr name="guid" value="4deac3811667801dce66637d05f4e6ca" /> <newznab:attr name="guid" value="4deac3811667801dce66637d05f4e6ca" />
<newznab:attr name="album" value="2016 GRAMMY Nominees" /> <newznab:attr name="book" value="2016 GRAMMY Nominees" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="NARAS Grammy Nominees Republic" /> <newznab:attr name="label" value="NARAS Grammy Nominees Republic" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -673,8 +673,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="109371000" /> <newznab:attr name="size" value="109371000" />
<newznab:attr name="guid" value="ba6e1b072dc863b65c1ea73c8c0994f3" /> <newznab:attr name="guid" value="ba6e1b072dc863b65c1ea73c8c0994f3" />
<newznab:attr name="album" value="Aus Dem Schatten" /> <newznab:attr name="book" value="Aus Dem Schatten" />
<newznab:attr name="artist" value="Dvalin" /> <newznab:attr name="author" value="Dvalin" />
<newznab:attr name="label" value="Imports" /> <newznab:attr name="label" value="Imports" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -695,8 +695,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="24272000" /> <newznab:attr name="size" value="24272000" />
<newznab:attr name="guid" value="c6cca22fbd4e5c21584a88d7f7324965" /> <newznab:attr name="guid" value="c6cca22fbd4e5c21584a88d7f7324965" />
<newznab:attr name="album" value="Pond Scum" /> <newznab:attr name="book" value="Pond Scum" />
<newznab:attr name="artist" value="Bonnie Prince Billy" /> <newznab:attr name="author" value="Bonnie Prince Billy" />
<newznab:attr name="label" value="Drag City" /> <newznab:attr name="label" value="Drag City" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -717,8 +717,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="456256000" /> <newznab:attr name="size" value="456256000" />
<newznab:attr name="guid" value="c3a554620060484770cd0d2034b5191d" /> <newznab:attr name="guid" value="c3a554620060484770cd0d2034b5191d" />
<newznab:attr name="album" value="Urban Vibes, Vol 15 the Underground Sound of House Music" /> <newznab:attr name="book" value="Urban Vibes, Vol 15 the Underground Sound of House Music" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Recovery House" /> <newznab:attr name="label" value="Recovery House" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -739,8 +739,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="456256000" /> <newznab:attr name="size" value="456256000" />
<newznab:attr name="guid" value="19ad406b3e21480794e5905f335fe19c" /> <newznab:attr name="guid" value="19ad406b3e21480794e5905f335fe19c" />
<newznab:attr name="album" value="Urban Vibes, Vol 15 the Underground Sound of House Music" /> <newznab:attr name="book" value="Urban Vibes, Vol 15 the Underground Sound of House Music" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Recovery House" /> <newznab:attr name="label" value="Recovery House" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -761,8 +761,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="358555000" /> <newznab:attr name="size" value="358555000" />
<newznab:attr name="guid" value="44905e4b6dd3be7488dce4959d23103a" /> <newznab:attr name="guid" value="44905e4b6dd3be7488dce4959d23103a" />
<newznab:attr name="album" value="Handsup Hits 2 Explicit" /> <newznab:attr name="book" value="Handsup Hits 2 Explicit" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Earthquake" /> <newznab:attr name="label" value="Earthquake" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -783,8 +783,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="358555000" /> <newznab:attr name="size" value="358555000" />
<newznab:attr name="guid" value="32968fa3ecc7f15d9145477dc3f823aa" /> <newznab:attr name="guid" value="32968fa3ecc7f15d9145477dc3f823aa" />
<newznab:attr name="album" value="Handsup Hits 2 Explicit" /> <newznab:attr name="book" value="Handsup Hits 2 Explicit" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Earthquake" /> <newznab:attr name="label" value="Earthquake" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -805,8 +805,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="1324404000" /> <newznab:attr name="size" value="1324404000" />
<newznab:attr name="guid" value="878d45b6cac8ccdb8d80ae60ae581af8" /> <newznab:attr name="guid" value="878d45b6cac8ccdb8d80ae60ae581af8" />
<newznab:attr name="album" value="Ultimate Trance Reflections" /> <newznab:attr name="book" value="Ultimate Trance Reflections" />
<newznab:attr name="artist" value="MKampTW" /> <newznab:attr name="author" value="MKampTW" />
<newznab:attr name="genre" value="Trance" /> <newznab:attr name="genre" value="Trance" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="4" /> <newznab:attr name="grabs" value="4" />
@ -825,8 +825,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="111538000" /> <newznab:attr name="size" value="111538000" />
<newznab:attr name="guid" value="81f9e2d70f1164aef1a9543ccf817331" /> <newznab:attr name="guid" value="81f9e2d70f1164aef1a9543ccf817331" />
<newznab:attr name="album" value="Descent" /> <newznab:attr name="book" value="Descent" />
<newznab:attr name="artist" value="Highborne" /> <newznab:attr name="author" value="Highborne" />
<newznab:attr name="label" value="Imminent Records" /> <newznab:attr name="label" value="Imminent Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -847,8 +847,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="117578000" /> <newznab:attr name="size" value="117578000" />
<newznab:attr name="guid" value="da8c9de4ee5e9a4362dcac650ae42ef7" /> <newznab:attr name="guid" value="da8c9de4ee5e9a4362dcac650ae42ef7" />
<newznab:attr name="album" value="L2l" /> <newznab:attr name="book" value="L2l" />
<newznab:attr name="artist" value="Lifelss 2 Life" /> <newznab:attr name="author" value="Lifelss 2 Life" />
<newznab:attr name="label" value="Unsigned" /> <newznab:attr name="label" value="Unsigned" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Christian &amp; Gospel" /> <newznab:attr name="genre" value="Christian &amp; Gospel" />
@ -869,8 +869,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="110230000" /> <newznab:attr name="size" value="110230000" />
<newznab:attr name="guid" value="682506affbe0a2aaccc0f5f830e5349e" /> <newznab:attr name="guid" value="682506affbe0a2aaccc0f5f830e5349e" />
<newznab:attr name="album" value="Blackened Visions" /> <newznab:attr name="book" value="Blackened Visions" />
<newznab:attr name="artist" value="Lumberjack Feedback" /> <newznab:attr name="author" value="Lumberjack Feedback" />
<newznab:attr name="label" value="KAOTOXIN" /> <newznab:attr name="label" value="KAOTOXIN" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -891,8 +891,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="120720000" /> <newznab:attr name="size" value="120720000" />
<newznab:attr name="guid" value="6a1b8e3bdae227fc1f6d1a1819123ea0" /> <newznab:attr name="guid" value="6a1b8e3bdae227fc1f6d1a1819123ea0" />
<newznab:attr name="album" value="The Same Old Stories" /> <newznab:attr name="book" value="The Same Old Stories" />
<newznab:attr name="artist" value="Semidimes" /> <newznab:attr name="author" value="Semidimes" />
<newznab:attr name="label" value="Gateways Productions Art Gates Records" /> <newznab:attr name="label" value="Gateways Productions Art Gates Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -913,8 +913,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="105702000" /> <newznab:attr name="size" value="105702000" />
<newznab:attr name="guid" value="6afe8e823a75b1e122701e58ef31f4ed" /> <newznab:attr name="guid" value="6afe8e823a75b1e122701e58ef31f4ed" />
<newznab:attr name="album" value="Rare Breed" /> <newznab:attr name="book" value="Rare Breed" />
<newznab:attr name="artist" value="Shrine, The" /> <newznab:attr name="author" value="Shrine, The" />
<newznab:attr name="label" value="Century Media" /> <newznab:attr name="label" value="Century Media" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -935,8 +935,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="121798000" /> <newznab:attr name="size" value="121798000" />
<newznab:attr name="guid" value="c8d7048ddbb7044eecb3722dd532f2b9" /> <newznab:attr name="guid" value="c8d7048ddbb7044eecb3722dd532f2b9" />
<newznab:attr name="album" value="Exoplanet" /> <newznab:attr name="book" value="Exoplanet" />
<newznab:attr name="artist" value="Contortionist, The" /> <newznab:attr name="author" value="Contortionist, The" />
<newznab:attr name="label" value="Good Fight Music" /> <newznab:attr name="label" value="Good Fight Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -957,8 +957,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="138935000" /> <newznab:attr name="size" value="138935000" />
<newznab:attr name="guid" value="ec0d7b18c13a076f6417ca7da1018c04" /> <newznab:attr name="guid" value="ec0d7b18c13a076f6417ca7da1018c04" />
<newznab:attr name="album" value="Dystopia" /> <newznab:attr name="book" value="Dystopia" />
<newznab:attr name="artist" value="Megadeth" /> <newznab:attr name="author" value="Megadeth" />
<newznab:attr name="label" value="UMeTBoy Records" /> <newznab:attr name="label" value="UMeTBoy Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -979,8 +979,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="100495000" /> <newznab:attr name="size" value="100495000" />
<newznab:attr name="guid" value="fef4f9ead88a88d33253efdc25909263" /> <newznab:attr name="guid" value="fef4f9ead88a88d33253efdc25909263" />
<newznab:attr name="album" value="Klein Geluk" /> <newznab:attr name="book" value="Klein Geluk" />
<newznab:attr name="artist" value="Will Tura" /> <newznab:attr name="author" value="Will Tura" />
<newznab:attr name="label" value="Universal Music Belgium" /> <newznab:attr name="label" value="Universal Music Belgium" />
<newznab:attr name="genre" value="Folk" /> <newznab:attr name="genre" value="Folk" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -1000,8 +1000,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="124254000" /> <newznab:attr name="size" value="124254000" />
<newznab:attr name="guid" value="a932af5da0bc8e35967f4b00f72b2790" /> <newznab:attr name="guid" value="a932af5da0bc8e35967f4b00f72b2790" />
<newznab:attr name="album" value="Winter Thrice" /> <newznab:attr name="book" value="Winter Thrice" />
<newznab:attr name="artist" value="Borknagar" /> <newznab:attr name="author" value="Borknagar" />
<newznab:attr name="label" value="Century Media" /> <newznab:attr name="label" value="Century Media" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1022,8 +1022,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="491897000" /> <newznab:attr name="size" value="491897000" />
<newznab:attr name="guid" value="8a5309e266d1fb7676dff6c256de0b6a" /> <newznab:attr name="guid" value="8a5309e266d1fb7676dff6c256de0b6a" />
<newznab:attr name="album" value="Media Markt TOP 40 2016 WEEK 04" /> <newznab:attr name="book" value="Media Markt TOP 40 2016 WEEK 04" />
<newznab:attr name="artist" value="Justin Bieber" /> <newznab:attr name="author" value="Justin Bieber" />
<newznab:attr name="genre" value="Top 40" /> <newznab:attr name="genre" value="Top 40" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="4" /> <newznab:attr name="grabs" value="4" />
@ -1042,8 +1042,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="393058000" /> <newznab:attr name="size" value="393058000" />
<newznab:attr name="guid" value="3a1cd051d0d477f35e9255fcbc77b0c9" /> <newznab:attr name="guid" value="3a1cd051d0d477f35e9255fcbc77b0c9" />
<newznab:attr name="album" value="Exterminate Extended DJ Versions WEB" /> <newznab:attr name="book" value="Exterminate Extended DJ Versions WEB" />
<newznab:attr name="artist" value="Anime" /> <newznab:attr name="author" value="Anime" />
<newznab:attr name="genre" value="Hardcore" /> <newznab:attr name="genre" value="Hardcore" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="4" /> <newznab:attr name="grabs" value="4" />
@ -1062,8 +1062,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="228128000" /> <newznab:attr name="size" value="228128000" />
<newznab:attr name="guid" value="7cf3e8abcb2a7ac2e660b97d2d7df788" /> <newznab:attr name="guid" value="7cf3e8abcb2a7ac2e660b97d2d7df788" />
<newznab:attr name="album" value="Number Two Explicit" /> <newznab:attr name="book" value="Number Two Explicit" />
<newznab:attr name="artist" value="Turkish Techno" /> <newznab:attr name="author" value="Turkish Techno" />
<newznab:attr name="label" value="Dirt Cult Records" /> <newznab:attr name="label" value="Dirt Cult Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />
@ -1084,8 +1084,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="480863000" /> <newznab:attr name="size" value="480863000" />
<newznab:attr name="guid" value="31482d6031794cfb9cb52eedd4e8b960" /> <newznab:attr name="guid" value="31482d6031794cfb9cb52eedd4e8b960" />
<newznab:attr name="album" value="Dystopia" /> <newznab:attr name="book" value="Dystopia" />
<newznab:attr name="artist" value="Megadeth" /> <newznab:attr name="author" value="Megadeth" />
<newznab:attr name="label" value="UMeTBoy Records" /> <newznab:attr name="label" value="UMeTBoy Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1106,8 +1106,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="264470000" /> <newznab:attr name="size" value="264470000" />
<newznab:attr name="guid" value="7fdf940f3d459c1e33c31d6a89ef13f2" /> <newznab:attr name="guid" value="7fdf940f3d459c1e33c31d6a89ef13f2" />
<newznab:attr name="album" value="Love Dont Live Here Explicit" /> <newznab:attr name="book" value="Love Dont Live Here Explicit" />
<newznab:attr name="artist" value="Lionheart" /> <newznab:attr name="author" value="Lionheart" />
<newznab:attr name="label" value="LHHC RECORDS" /> <newznab:attr name="label" value="LHHC RECORDS" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1128,8 +1128,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="517476000" /> <newznab:attr name="size" value="517476000" />
<newznab:attr name="guid" value="6bbf1e1423d477a6f942224e54eac60b" /> <newznab:attr name="guid" value="6bbf1e1423d477a6f942224e54eac60b" />
<newznab:attr name="album" value="House Clubhits Megamix Vol6" /> <newznab:attr name="book" value="House Clubhits Megamix Vol6" />
<newznab:attr name="artist" value="VA" /> <newznab:attr name="author" value="VA" />
<newznab:attr name="genre" value="House" /> <newznab:attr name="genre" value="House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="10" /> <newznab:attr name="grabs" value="10" />
@ -1148,8 +1148,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="337003000" /> <newznab:attr name="size" value="337003000" />
<newznab:attr name="guid" value="a88a5cc38ea18ea66e4e2b6ab918a0b8" /> <newznab:attr name="guid" value="a88a5cc38ea18ea66e4e2b6ab918a0b8" />
<newznab:attr name="album" value="Wildfire" /> <newznab:attr name="book" value="Wildfire" />
<newznab:attr name="artist" value="Rachel Platten" /> <newznab:attr name="author" value="Rachel Platten" />
<newznab:attr name="label" value="Columbia" /> <newznab:attr name="label" value="Columbia" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -1170,8 +1170,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="319452000" /> <newznab:attr name="size" value="319452000" />
<newznab:attr name="guid" value="427874c8793cdbf0998d1271b5523b49" /> <newznab:attr name="guid" value="427874c8793cdbf0998d1271b5523b49" />
<newznab:attr name="album" value="Moth" /> <newznab:attr name="book" value="Moth" />
<newznab:attr name="artist" value="Chairlift" /> <newznab:attr name="author" value="Chairlift" />
<newznab:attr name="label" value="Columbia" /> <newznab:attr name="label" value="Columbia" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />
@ -1192,8 +1192,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="393726000" /> <newznab:attr name="size" value="393726000" />
<newznab:attr name="guid" value="573e6c6b7320094b89a9135538559f21" /> <newznab:attr name="guid" value="573e6c6b7320094b89a9135538559f21" />
<newznab:attr name="album" value="Exterminate Extended DJ Versions WEB" /> <newznab:attr name="book" value="Exterminate Extended DJ Versions WEB" />
<newznab:attr name="artist" value="Anime" /> <newznab:attr name="author" value="Anime" />
<newznab:attr name="genre" value="Hardcore" /> <newznab:attr name="genre" value="Hardcore" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="3" /> <newznab:attr name="grabs" value="3" />
@ -1212,8 +1212,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="215392000" /> <newznab:attr name="size" value="215392000" />
<newznab:attr name="guid" value="e3e39d2cac1e2f7b509d02f8391ec0ac" /> <newznab:attr name="guid" value="e3e39d2cac1e2f7b509d02f8391ec0ac" />
<newznab:attr name="album" value="Crack House Explicit" /> <newznab:attr name="book" value="Crack House Explicit" />
<newznab:attr name="artist" value="Danforth" /> <newznab:attr name="author" value="Danforth" />
<newznab:attr name="label" value="Danforth Hardcore Paris" /> <newznab:attr name="label" value="Danforth Hardcore Paris" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />
@ -1234,8 +1234,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="483771000" /> <newznab:attr name="size" value="483771000" />
<newznab:attr name="guid" value="5011e7db085ac89d11c6a6378ca7d7d2" /> <newznab:attr name="guid" value="5011e7db085ac89d11c6a6378ca7d7d2" />
<newznab:attr name="album" value="Monster Tape" /> <newznab:attr name="book" value="Monster Tape" />
<newznab:attr name="artist" value="Rimk" /> <newznab:attr name="author" value="Rimk" />
<newznab:attr name="label" value="Imports" /> <newznab:attr name="label" value="Imports" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
@ -1256,8 +1256,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="580190000" /> <newznab:attr name="size" value="580190000" />
<newznab:attr name="guid" value="b00e5ec0b5466aaf1b5ae33d0e7c7036" /> <newznab:attr name="guid" value="b00e5ec0b5466aaf1b5ae33d0e7c7036" />
<newznab:attr name="album" value="Fin de Dream Avant Gotham City Explicit" /> <newznab:attr name="book" value="Fin de Dream Avant Gotham City Explicit" />
<newznab:attr name="artist" value="HMagnum" /> <newznab:attr name="author" value="HMagnum" />
<newznab:attr name="label" value="Loudschool" /> <newznab:attr name="label" value="Loudschool" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="World Music" /> <newznab:attr name="genre" value="World Music" />
@ -1278,8 +1278,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="2786608000" /> <newznab:attr name="size" value="2786608000" />
<newznab:attr name="guid" value="7cf1334353e9196b8473f0ea361c099b" /> <newznab:attr name="guid" value="7cf1334353e9196b8473f0ea361c099b" />
<newznab:attr name="album" value="Hard Bass 2016" /> <newznab:attr name="book" value="Hard Bass 2016" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Imports" /> <newznab:attr name="label" value="Imports" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -1300,8 +1300,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="329213000" /> <newznab:attr name="size" value="329213000" />
<newznab:attr name="guid" value="34f4a16d0bb579dde38de29f716f1bdf" /> <newznab:attr name="guid" value="34f4a16d0bb579dde38de29f716f1bdf" />
<newznab:attr name="album" value="Cautionary Tale" /> <newznab:attr name="book" value="Cautionary Tale" />
<newznab:attr name="artist" value="Dylan LeBlanc" /> <newznab:attr name="author" value="Dylan LeBlanc" />
<newznab:attr name="label" value="Single Lock Records" /> <newznab:attr name="label" value="Single Lock Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Folk" /> <newznab:attr name="genre" value="Folk" />
@ -1322,8 +1322,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="44773000" /> <newznab:attr name="size" value="44773000" />
<newznab:attr name="guid" value="d47f7d44a4aef15259e21323f3780ec1" /> <newznab:attr name="guid" value="d47f7d44a4aef15259e21323f3780ec1" />
<newznab:attr name="album" value="Jan 20 2016" /> <newznab:attr name="book" value="Jan 20 2016" />
<newznab:attr name="artist" value="Howard Stern Show" /> <newznab:attr name="author" value="Howard Stern Show" />
<newznab:attr name="genre" value="Comedy" /> <newznab:attr name="genre" value="Comedy" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="7" /> <newznab:attr name="grabs" value="7" />
@ -1342,8 +1342,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="28241000" /> <newznab:attr name="size" value="28241000" />
<newznab:attr name="guid" value="2dc103b2b15a63f2779e36dd7cf40232" /> <newznab:attr name="guid" value="2dc103b2b15a63f2779e36dd7cf40232" />
<newznab:attr name="album" value="Cautionary Tale" /> <newznab:attr name="book" value="Cautionary Tale" />
<newznab:attr name="artist" value="Dylan LeBlanc" /> <newznab:attr name="author" value="Dylan LeBlanc" />
<newznab:attr name="label" value="Single Lock Records" /> <newznab:attr name="label" value="Single Lock Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Folk" /> <newznab:attr name="genre" value="Folk" />
@ -1364,8 +1364,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="44754000" /> <newznab:attr name="size" value="44754000" />
<newznab:attr name="guid" value="be3cf337f012387b0e26c5e3a9c51281" /> <newznab:attr name="guid" value="be3cf337f012387b0e26c5e3a9c51281" />
<newznab:attr name="album" value="Jan 20 2016" /> <newznab:attr name="book" value="Jan 20 2016" />
<newznab:attr name="artist" value="Howard Stern Show" /> <newznab:attr name="author" value="Howard Stern Show" />
<newznab:attr name="genre" value="Comedy" /> <newznab:attr name="genre" value="Comedy" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="7" /> <newznab:attr name="grabs" value="7" />
@ -1384,8 +1384,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="44763000" /> <newznab:attr name="size" value="44763000" />
<newznab:attr name="guid" value="218d85679fdc286720b35763380d715b" /> <newznab:attr name="guid" value="218d85679fdc286720b35763380d715b" />
<newznab:attr name="album" value="Jan 20 2016" /> <newznab:attr name="book" value="Jan 20 2016" />
<newznab:attr name="artist" value="Howard Stern Show" /> <newznab:attr name="author" value="Howard Stern Show" />
<newznab:attr name="genre" value="Comedy" /> <newznab:attr name="genre" value="Comedy" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="7" /> <newznab:attr name="grabs" value="7" />
@ -1404,8 +1404,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="393377000" /> <newznab:attr name="size" value="393377000" />
<newznab:attr name="guid" value="158c3782cbb82996b0a67dc43b5ad87b" /> <newznab:attr name="guid" value="158c3782cbb82996b0a67dc43b5ad87b" />
<newznab:attr name="album" value="NRJ Winter Hits 2016" /> <newznab:attr name="book" value="NRJ Winter Hits 2016" />
<newznab:attr name="artist" value="Justin Bieber" /> <newznab:attr name="author" value="Justin Bieber" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="8" /> <newznab:attr name="grabs" value="8" />
@ -1424,8 +1424,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="42361000" /> <newznab:attr name="size" value="42361000" />
<newznab:attr name="guid" value="fbc231e82faef5759a9742f678946e78" /> <newznab:attr name="guid" value="fbc231e82faef5759a9742f678946e78" />
<newznab:attr name="album" value="Jan 20 2016" /> <newznab:attr name="book" value="Jan 20 2016" />
<newznab:attr name="artist" value="Howard Stern Show" /> <newznab:attr name="author" value="Howard Stern Show" />
<newznab:attr name="genre" value="Comedy" /> <newznab:attr name="genre" value="Comedy" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="8" /> <newznab:attr name="grabs" value="8" />
@ -1444,8 +1444,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="41082000" /> <newznab:attr name="size" value="41082000" />
<newznab:attr name="guid" value="2a6101c2e09ba53517186c3f211525c0" /> <newznab:attr name="guid" value="2a6101c2e09ba53517186c3f211525c0" />
<newznab:attr name="album" value="Jan 20 2016" /> <newznab:attr name="book" value="Jan 20 2016" />
<newznab:attr name="artist" value="Howard Stern Show" /> <newznab:attr name="author" value="Howard Stern Show" />
<newznab:attr name="genre" value="Comedy" /> <newznab:attr name="genre" value="Comedy" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="8" /> <newznab:attr name="grabs" value="8" />
@ -1464,8 +1464,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="991267000" /> <newznab:attr name="size" value="991267000" />
<newznab:attr name="guid" value="b051509428cf7d265677e57e55e21a78" /> <newznab:attr name="guid" value="b051509428cf7d265677e57e55e21a78" />
<newznab:attr name="album" value="German Top 100 Single Charts 16 Jan 2016" /> <newznab:attr name="book" value="German Top 100 Single Charts 16 Jan 2016" />
<newznab:attr name="artist" value="Adele" /> <newznab:attr name="author" value="Adele" />
<newznab:attr name="genre" value="Pop" /> <newznab:attr name="genre" value="Pop" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="6" /> <newznab:attr name="grabs" value="6" />
@ -1484,8 +1484,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="672245000" /> <newznab:attr name="size" value="672245000" />
<newznab:attr name="guid" value="f6263050e63c48b3c169deea08019ae2" /> <newznab:attr name="guid" value="f6263050e63c48b3c169deea08019ae2" />
<newznab:attr name="album" value="DJ Sounds 20161" /> <newznab:attr name="book" value="DJ Sounds 20161" />
<newznab:attr name="artist" value="Avicii" /> <newznab:attr name="author" value="Avicii" />
<newznab:attr name="label" value="Pink Revolver" /> <newznab:attr name="label" value="Pink Revolver" />
<newznab:attr name="genre" value="Dance" /> <newznab:attr name="genre" value="Dance" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -1505,8 +1505,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="672245000" /> <newznab:attr name="size" value="672245000" />
<newznab:attr name="guid" value="6ce01dc1a826621c1892276af045b938" /> <newznab:attr name="guid" value="6ce01dc1a826621c1892276af045b938" />
<newznab:attr name="album" value="DJ Sounds 20161" /> <newznab:attr name="book" value="DJ Sounds 20161" />
<newznab:attr name="artist" value="Avicii" /> <newznab:attr name="author" value="Avicii" />
<newznab:attr name="label" value="Pink Revolver" /> <newznab:attr name="label" value="Pink Revolver" />
<newznab:attr name="genre" value="Dance" /> <newznab:attr name="genre" value="Dance" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -1526,8 +1526,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="135093000" /> <newznab:attr name="size" value="135093000" />
<newznab:attr name="guid" value="be1bd46c6ecdf495bfcc780137853514" /> <newznab:attr name="guid" value="be1bd46c6ecdf495bfcc780137853514" />
<newznab:attr name="album" value="Caged In Memories" /> <newznab:attr name="book" value="Caged In Memories" />
<newznab:attr name="artist" value="Anima Tempo" /> <newznab:attr name="author" value="Anima Tempo" />
<newznab:attr name="genre" value="Metal" /> <newznab:attr name="genre" value="Metal" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="4" /> <newznab:attr name="grabs" value="4" />
@ -1546,8 +1546,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="303751000" /> <newznab:attr name="size" value="303751000" />
<newznab:attr name="guid" value="2408b6aff117464c5a577dcc35b8bac1" /> <newznab:attr name="guid" value="2408b6aff117464c5a577dcc35b8bac1" />
<newznab:attr name="album" value="Into the Legend" /> <newznab:attr name="book" value="Into the Legend" />
<newznab:attr name="artist" value="Rhapsody Of Fire" /> <newznab:attr name="author" value="Rhapsody Of Fire" />
<newznab:attr name="label" value="AFM Records" /> <newznab:attr name="label" value="AFM Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1568,8 +1568,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="220695000" /> <newznab:attr name="size" value="220695000" />
<newznab:attr name="guid" value="0eee04bc2599d4b9627944cc3fef6b0a" /> <newznab:attr name="guid" value="0eee04bc2599d4b9627944cc3fef6b0a" />
<newznab:attr name="album" value="Scary Creatures" /> <newznab:attr name="book" value="Scary Creatures" />
<newznab:attr name="artist" value="Brainstorm" /> <newznab:attr name="author" value="Brainstorm" />
<newznab:attr name="label" value="AFM Records" /> <newznab:attr name="label" value="AFM Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1590,8 +1590,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="661012000" /> <newznab:attr name="size" value="661012000" />
<newznab:attr name="guid" value="be4ac48e3a40631b3611cd50bb471841" /> <newznab:attr name="guid" value="be4ac48e3a40631b3611cd50bb471841" />
<newznab:attr name="album" value="Hardstyle The Annual 2016 Explicit" /> <newznab:attr name="book" value="Hardstyle The Annual 2016 Explicit" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Be Yourself Music" /> <newznab:attr name="label" value="Be Yourself Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -1612,7 +1612,7 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="271778000" /> <newznab:attr name="size" value="271778000" />
<newznab:attr name="guid" value="e2afc175525a5ea0f5269ef5a03b507d" /> <newznab:attr name="guid" value="e2afc175525a5ea0f5269ef5a03b507d" />
<newznab:attr name="artist" value="Benjamin Bluemchen" /> <newznab:attr name="author" value="Benjamin Bluemchen" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -1632,8 +1632,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="117666000" /> <newznab:attr name="size" value="117666000" />
<newznab:attr name="guid" value="59b0acad0a23ae5c0ccf2ef7a9d994b6" /> <newznab:attr name="guid" value="59b0acad0a23ae5c0ccf2ef7a9d994b6" />
<newznab:attr name="album" value="Melancholia" /> <newznab:attr name="book" value="Melancholia" />
<newznab:attr name="artist" value="Tribulation" /> <newznab:attr name="author" value="Tribulation" />
<newznab:attr name="label" value="Century Media" /> <newznab:attr name="label" value="Century Media" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1654,8 +1654,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="205842000" /> <newznab:attr name="size" value="205842000" />
<newznab:attr name="guid" value="f55fd82e73969feee4a18a561bf61df1" /> <newznab:attr name="guid" value="f55fd82e73969feee4a18a561bf61df1" />
<newznab:attr name="album" value="A State Of Trance Radio Top 20 January 2016" /> <newznab:attr name="book" value="A State Of Trance Radio Top 20 January 2016" />
<newznab:attr name="artist" value="Dash Berlin" /> <newznab:attr name="author" value="Dash Berlin" />
<newznab:attr name="genre" value="Trance" /> <newznab:attr name="genre" value="Trance" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="14" /> <newznab:attr name="grabs" value="14" />
@ -1674,8 +1674,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="145323000" /> <newznab:attr name="size" value="145323000" />
<newznab:attr name="guid" value="39992159d6488a00adcfb39ee26408e8" /> <newznab:attr name="guid" value="39992159d6488a00adcfb39ee26408e8" />
<newznab:attr name="album" value="Tanz Der Skelette Folge 48 by Videomann" /> <newznab:attr name="book" value="Tanz Der Skelette Folge 48 by Videomann" />
<newznab:attr name="artist" value="Die Drei Fragezeichen Kids" /> <newznab:attr name="author" value="Die Drei Fragezeichen Kids" />
<newznab:attr name="genre" value="Hoerspiel" /> <newznab:attr name="genre" value="Hoerspiel" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="usenetdate" value="Sun, 17 Jan 2016 00:01:02 +0000" /> <newznab:attr name="usenetdate" value="Sun, 17 Jan 2016 00:01:02 +0000" />
@ -1693,8 +1693,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="145144000" /> <newznab:attr name="size" value="145144000" />
<newznab:attr name="guid" value="9568ef54e722af0d827fadd7c4f3719e" /> <newznab:attr name="guid" value="9568ef54e722af0d827fadd7c4f3719e" />
<newznab:attr name="album" value="Tanz Der Skelette Folge 48 by Videomann" /> <newznab:attr name="book" value="Tanz Der Skelette Folge 48 by Videomann" />
<newznab:attr name="artist" value="Die Drei Fragezeichen Kids" /> <newznab:attr name="author" value="Die Drei Fragezeichen Kids" />
<newznab:attr name="genre" value="Hoerspiel" /> <newznab:attr name="genre" value="Hoerspiel" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="usenetdate" value="Sun, 17 Jan 2016 00:01:02 +0000" /> <newznab:attr name="usenetdate" value="Sun, 17 Jan 2016 00:01:02 +0000" />
@ -1712,8 +1712,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="303085000" /> <newznab:attr name="size" value="303085000" />
<newznab:attr name="guid" value="7a545e70c7fb59de811a164089ca3cd4" /> <newznab:attr name="guid" value="7a545e70c7fb59de811a164089ca3cd4" />
<newznab:attr name="album" value="Deep Nirvana, Vol 4 25 DeepHouse Tunes" /> <newznab:attr name="book" value="Deep Nirvana, Vol 4 25 DeepHouse Tunes" />
<newznab:attr name="artist" value="Deep Nirvana Vol 4 25 Deep" /> <newznab:attr name="author" value="Deep Nirvana Vol 4 25 Deep" />
<newznab:attr name="label" value="Groove Nation" /> <newznab:attr name="label" value="Groove Nation" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -1734,8 +1734,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="626000000" /> <newznab:attr name="size" value="626000000" />
<newznab:attr name="guid" value="03a7c325f9c7f5c90d3a0b9200f58b86" /> <newznab:attr name="guid" value="03a7c325f9c7f5c90d3a0b9200f58b86" />
<newznab:attr name="album" value="Straight Outta Compton Music From The Motion Picture Explicit" /> <newznab:attr name="book" value="Straight Outta Compton Music From The Motion Picture Explicit" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="UME" /> <newznab:attr name="label" value="UME" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Soundtracks" /> <newznab:attr name="genre" value="Soundtracks" />
@ -1757,8 +1757,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="460165000" /> <newznab:attr name="size" value="460165000" />
<newznab:attr name="guid" value="201513128394d6471174f4c42d73e26c" /> <newznab:attr name="guid" value="201513128394d6471174f4c42d73e26c" />
<newznab:attr name="album" value="The Infinite Steve Vai An Anthology" /> <newznab:attr name="book" value="The Infinite Steve Vai An Anthology" />
<newznab:attr name="artist" value="Steve Vai" /> <newznab:attr name="author" value="Steve Vai" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="9" /> <newznab:attr name="grabs" value="9" />
<newznab:attr name="usenetdate" value="Sat, 16 Jan 2016 11:49:53 +0000" /> <newznab:attr name="usenetdate" value="Sat, 16 Jan 2016 11:49:53 +0000" />
@ -1776,7 +1776,7 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="190955000" /> <newznab:attr name="size" value="190955000" />
<newznab:attr name="guid" value="577a981b680b896fce8bb8a5c6829c4d" /> <newznab:attr name="guid" value="577a981b680b896fce8bb8a5c6829c4d" />
<newznab:attr name="artist" value="Varg" /> <newznab:attr name="author" value="Varg" />
<newznab:attr name="label" value="Napalm Records" /> <newznab:attr name="label" value="Napalm Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1797,8 +1797,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="133681000" /> <newznab:attr name="size" value="133681000" />
<newznab:attr name="guid" value="8297d9b82646f8aff603b1f8b277d673" /> <newznab:attr name="guid" value="8297d9b82646f8aff603b1f8b277d673" />
<newznab:attr name="album" value="Motvind" /> <newznab:attr name="book" value="Motvind" />
<newznab:attr name="artist" value="Nifrost" /> <newznab:attr name="author" value="Nifrost" />
<newznab:attr name="label" value="IndiGoBoom" /> <newznab:attr name="label" value="IndiGoBoom" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -1819,8 +1819,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="158783000" /> <newznab:attr name="size" value="158783000" />
<newznab:attr name="guid" value="5c3ef6652729ed046a22f5b749b6c8f1" /> <newznab:attr name="guid" value="5c3ef6652729ed046a22f5b749b6c8f1" />
<newznab:attr name="album" value="Die Rache des Untoten Folge 179 by Videomann" /> <newznab:attr name="book" value="Die Rache des Untoten Folge 179 by Videomann" />
<newznab:attr name="artist" value="Die drei Fragezeichen" /> <newznab:attr name="author" value="Die drei Fragezeichen" />
<newznab:attr name="genre" value="Hoespiel" /> <newznab:attr name="genre" value="Hoespiel" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="7" /> <newznab:attr name="grabs" value="7" />
@ -1839,8 +1839,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="384044000" /> <newznab:attr name="size" value="384044000" />
<newznab:attr name="guid" value="f8b01b2bf982572922980b45ed587d47" /> <newznab:attr name="guid" value="f8b01b2bf982572922980b45ed587d47" />
<newznab:attr name="album" value="The Best Deep House, Vol 1" /> <newznab:attr name="book" value="The Best Deep House, Vol 1" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Twentythree Records" /> <newznab:attr name="label" value="Twentythree Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -1861,8 +1861,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="485959000" /> <newznab:attr name="size" value="485959000" />
<newznab:attr name="guid" value="dc53f812c384fadc25af8d800e3870a3" /> <newznab:attr name="guid" value="dc53f812c384fadc25af8d800e3870a3" />
<newznab:attr name="album" value="Hand aufs Herz Explicit" /> <newznab:attr name="book" value="Hand aufs Herz Explicit" />
<newznab:attr name="artist" value="Unantastbar" /> <newznab:attr name="author" value="Unantastbar" />
<newznab:attr name="label" value="RookiesampKings" /> <newznab:attr name="label" value="RookiesampKings" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rock" /> <newznab:attr name="genre" value="Rock" />
@ -1883,8 +1883,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="371163000" /> <newznab:attr name="size" value="371163000" />
<newznab:attr name="guid" value="288cd748eb0de993baad85d0ed13b0d2" /> <newznab:attr name="guid" value="288cd748eb0de993baad85d0ed13b0d2" />
<newznab:attr name="album" value="Tiergarten Explicit" /> <newznab:attr name="book" value="Tiergarten Explicit" />
<newznab:attr name="artist" value="Terrorgruppe" /> <newznab:attr name="author" value="Terrorgruppe" />
<newznab:attr name="label" value="AggropopRecords" /> <newznab:attr name="label" value="AggropopRecords" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />
@ -1905,8 +1905,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="412969000" /> <newznab:attr name="size" value="412969000" />
<newznab:attr name="guid" value="031f0dc6f560180a935521a35bc11170" /> <newznab:attr name="guid" value="031f0dc6f560180a935521a35bc11170" />
<newznab:attr name="album" value="Hardstyle Sounds Vol05" /> <newznab:attr name="book" value="Hardstyle Sounds Vol05" />
<newznab:attr name="artist" value="VA" /> <newznab:attr name="author" value="VA" />
<newznab:attr name="label" value="I Love This Sound" /> <newznab:attr name="label" value="I Love This Sound" />
<newznab:attr name="genre" value="Techno" /> <newznab:attr name="genre" value="Techno" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -1926,8 +1926,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="444843000" /> <newznab:attr name="size" value="444843000" />
<newznab:attr name="guid" value="8ce80d7775a0ef8799d91b432f842194" /> <newznab:attr name="guid" value="8ce80d7775a0ef8799d91b432f842194" />
<newznab:attr name="album" value="Media Markt TOP 40 2016 WEEK 03" /> <newznab:attr name="book" value="Media Markt TOP 40 2016 WEEK 03" />
<newznab:attr name="artist" value="Justin Bieber" /> <newznab:attr name="author" value="Justin Bieber" />
<newznab:attr name="genre" value="Top 40" /> <newznab:attr name="genre" value="Top 40" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="2" /> <newznab:attr name="grabs" value="2" />
@ -1946,8 +1946,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="444843000" /> <newznab:attr name="size" value="444843000" />
<newznab:attr name="guid" value="13763b97f75ee8245f9fb14f5ea0b5c7" /> <newznab:attr name="guid" value="13763b97f75ee8245f9fb14f5ea0b5c7" />
<newznab:attr name="album" value="Media Markt TOP 40 2016 WEEK 03" /> <newznab:attr name="book" value="Media Markt TOP 40 2016 WEEK 03" />
<newznab:attr name="artist" value="Justin Bieber" /> <newznab:attr name="author" value="Justin Bieber" />
<newznab:attr name="genre" value="Top 40" /> <newznab:attr name="genre" value="Top 40" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="4" /> <newznab:attr name="grabs" value="4" />
@ -1966,8 +1966,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="345186000" /> <newznab:attr name="size" value="345186000" />
<newznab:attr name="guid" value="8bb7a0045f07af8a39ae4568d366b2ca" /> <newznab:attr name="guid" value="8bb7a0045f07af8a39ae4568d366b2ca" />
<newznab:attr name="album" value="House Do Brasil, Vol 2" /> <newznab:attr name="book" value="House Do Brasil, Vol 2" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="label" value="Gaathy Recordings" /> <newznab:attr name="label" value="Gaathy Recordings" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Dance &amp; Electronic" /> <newznab:attr name="genre" value="Dance &amp; Electronic" />
@ -1988,8 +1988,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="233252000" /> <newznab:attr name="size" value="233252000" />
<newznab:attr name="guid" value="802c4caf3ac508b49abcd9a5f06ec97c" /> <newznab:attr name="guid" value="802c4caf3ac508b49abcd9a5f06ec97c" />
<newznab:attr name="album" value="Rinse FM 01012016" /> <newznab:attr name="book" value="Rinse FM 01012016" />
<newznab:attr name="artist" value="Todd Edwards" /> <newznab:attr name="author" value="Todd Edwards" />
<newznab:attr name="genre" value="House" /> <newznab:attr name="genre" value="House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="2" /> <newznab:attr name="grabs" value="2" />
@ -2008,8 +2008,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="414959000" /> <newznab:attr name="size" value="414959000" />
<newznab:attr name="guid" value="59c990e1a889c7e6d436ea069ab90336" /> <newznab:attr name="guid" value="59c990e1a889c7e6d436ea069ab90336" />
<newznab:attr name="album" value="Leben II Explicit" /> <newznab:attr name="book" value="Leben II Explicit" />
<newznab:attr name="artist" value="Azad" /> <newznab:attr name="author" value="Azad" />
<newznab:attr name="label" value="Bozz Music" /> <newznab:attr name="label" value="Bozz Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Rap &amp; Hip-Hop" /> <newznab:attr name="genre" value="Rap &amp; Hip-Hop" />
@ -2030,8 +2030,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="166201000" /> <newznab:attr name="size" value="166201000" />
<newznab:attr name="guid" value="9ea015decb1907fb579f8fcd2d08daa2" /> <newznab:attr name="guid" value="9ea015decb1907fb579f8fcd2d08daa2" />
<newznab:attr name="album" value="Into the Legend" /> <newznab:attr name="book" value="Into the Legend" />
<newznab:attr name="artist" value="Rhapsody Of Fire" /> <newznab:attr name="author" value="Rhapsody Of Fire" />
<newznab:attr name="label" value="AFM Records" /> <newznab:attr name="label" value="AFM Records" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Hard Rock &amp; Metal" /> <newznab:attr name="genre" value="Hard Rock &amp; Metal" />
@ -2052,8 +2052,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="721704000" /> <newznab:attr name="size" value="721704000" />
<newznab:attr name="guid" value="10e3b9bc3c73702d3e1be80bdaceba5c" /> <newznab:attr name="guid" value="10e3b9bc3c73702d3e1be80bdaceba5c" />
<newznab:attr name="album" value="Berlin Deep House 20161" /> <newznab:attr name="book" value="Berlin Deep House 20161" />
<newznab:attr name="artist" value="Various Artists" /> <newznab:attr name="author" value="Various Authors" />
<newznab:attr name="genre" value="House, Club House, Deep House" /> <newznab:attr name="genre" value="House, Club House, Deep House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="6" /> <newznab:attr name="grabs" value="6" />
@ -2072,8 +2072,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="1544589000" /> <newznab:attr name="size" value="1544589000" />
<newznab:attr name="guid" value="d62c60cd848b93d55d44266338f2918b" /> <newznab:attr name="guid" value="d62c60cd848b93d55d44266338f2918b" />
<newznab:attr name="album" value="Tech House Masters Fresh" /> <newznab:attr name="book" value="Tech House Masters Fresh" />
<newznab:attr name="artist" value="Derek Howell" /> <newznab:attr name="author" value="Derek Howell" />
<newznab:attr name="genre" value="Electronic" /> <newznab:attr name="genre" value="Electronic" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="5" /> <newznab:attr name="grabs" value="5" />
@ -2092,8 +2092,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="1470081000" /> <newznab:attr name="size" value="1470081000" />
<newznab:attr name="guid" value="792c03529273a5f8fe44cd29c177ce22" /> <newznab:attr name="guid" value="792c03529273a5f8fe44cd29c177ce22" />
<newznab:attr name="album" value="EDM Essentials Future Banging Concert" /> <newznab:attr name="book" value="EDM Essentials Future Banging Concert" />
<newznab:attr name="artist" value="Hardwell amp Armin van Buuren" /> <newznab:attr name="author" value="Hardwell amp Armin van Buuren" />
<newznab:attr name="label" value="DO IT YOURSELF" /> <newznab:attr name="label" value="DO IT YOURSELF" />
<newznab:attr name="genre" value="House" /> <newznab:attr name="genre" value="House" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
@ -2113,8 +2113,8 @@
<newznab:attr name="category" value="3010" /> <newznab:attr name="category" value="3010" />
<newznab:attr name="size" value="619827000" /> <newznab:attr name="size" value="619827000" />
<newznab:attr name="guid" value="a98724fb81f939a0c7b8b5a9852ea731" /> <newznab:attr name="guid" value="a98724fb81f939a0c7b8b5a9852ea731" />
<newznab:attr name="album" value="Dance 2016" /> <newznab:attr name="book" value="Dance 2016" />
<newznab:attr name="artist" value="Sigala featuring Bryn Christopher" /> <newznab:attr name="author" value="Sigala featuring Bryn Christopher" />
<newznab:attr name="genre" value="Dance" /> <newznab:attr name="genre" value="Dance" />
<newznab:attr name="year" value="2016" /> <newznab:attr name="year" value="2016" />
<newznab:attr name="grabs" value="5" /> <newznab:attr name="grabs" value="5" />
@ -2133,8 +2133,8 @@
<newznab:attr name="category" value="3040" /> <newznab:attr name="category" value="3040" />
<newznab:attr name="size" value="302517000" /> <newznab:attr name="size" value="302517000" />
<newznab:attr name="guid" value="184ba8c920c587da880b55bacb3d43c6" /> <newznab:attr name="guid" value="184ba8c920c587da880b55bacb3d43c6" />
<newznab:attr name="album" value="Leave Me Alone" /> <newznab:attr name="book" value="Leave Me Alone" />
<newznab:attr name="artist" value="Hinds" /> <newznab:attr name="author" value="Hinds" />
<newznab:attr name="label" value="Mom amp Pop Music" /> <newznab:attr name="label" value="Mom amp Pop Music" />
<newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" /> <newznab:attr name="coverurl" value="https://api.nzbgeek.info/covers/music/.jpg" />
<newznab:attr name="genre" value="Alternative Rock" /> <newznab:attr name="genre" value="Alternative Rock" />

@ -8,12 +8,12 @@
<copyright>Copyright 2009 Waffles</copyright> <copyright>Copyright 2009 Waffles</copyright>
<webMaster>waffles@waffles.ch</webMaster> <webMaster>waffles@waffles.ch</webMaster>
<image> <image>
<title>artist:coldplay</title> <title>author:coldplay</title>
<url>https://waffles.ch/favicon.ico</url> <url>https://waffles.ch/favicon.ico</url>
<link>https://waffles.ch/browse.php?c0=1&#x26;q=artist%3Acoldplay&#x26;limit=50</link> <link>https://waffles.ch/browse.php?c0=1&#x26;q=author%3Acoldplay&#x26;limit=50</link>
<width>16</width> <width>16</width>
<height>16</height> <height>16</height>
<description>artist:coldplay</description> <description>author:coldplay</description>
</image> </image>
<item> <item>
<title>Coldplay - Kaleidoscope EP (FLAC HD) [2017-Web-FLAC-Lossless]</title> <title>Coldplay - Kaleidoscope EP (FLAC HD) [2017-Web-FLAC-Lossless]</title>
@ -81,7 +81,7 @@
&lt;br /&gt; &lt;br /&gt;
&lt;b&gt;Total length:&lt;/b&gt; 24:56&lt;br /&gt; &lt;b&gt;Total length:&lt;/b&gt; 24:56&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
More information: &lt;a href=&quot;https://anon.click/https://itunes.apple.com/us/album/kaleidoscope-ep/id1248904974?uo=4&quot; target=&quot;_blank&quot;&gt;https://itunes.apple.com/us/album/kaleidoscope-ep/id1248904974?uo=4&lt;/a&gt; More information: &lt;a href=&quot;https://anon.click/https://itunes.apple.com/us/book/kaleidoscope-ep/id1248904974?uo=4&quot; target=&quot;_blank&quot;&gt;https://itunes.apple.com/us/book/kaleidoscope-ep/id1248904974?uo=4&lt;/a&gt;
</description> </description>
<link>https://waffles.ch/download.php/xxx/1166785/Coldplay%20-%20Kaleidoscope%20EP%20%5B2017-Web-MP3-320%5D.torrent?passkey=123456789&#x26;uid=xxx&#x26;rss=1</link> <link>https://waffles.ch/download.php/xxx/1166785/Coldplay%20-%20Kaleidoscope%20EP%20%5B2017-Web-MP3-320%5D.torrent?passkey=123456789&#x26;uid=xxx&#x26;rss=1</link>
<comments>https://waffles.ch/details.php?id=1166785&#x26;hit=1</comments> <comments>https://waffles.ch/details.php?id=1166785&#x26;hit=1</comments>
@ -156,7 +156,7 @@
&lt;br /&gt; &lt;br /&gt;
&lt;b&gt;Total length:&lt;/b&gt; 24:56&lt;br /&gt; &lt;b&gt;Total length:&lt;/b&gt; 24:56&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
More information: &lt;a href=&quot;https://anon.click/https://itunes.apple.com/us/album/kaleidoscope-ep/id1248904974?uo=4&quot; target=&quot;_blank&quot;&gt;https://itunes.apple.com/us/album/kaleidoscope-ep/id1248904974?uo=4&lt;/a&gt; More information: &lt;a href=&quot;https://anon.click/https://itunes.apple.com/us/book/kaleidoscope-ep/id1248904974?uo=4&quot; target=&quot;_blank&quot;&gt;https://itunes.apple.com/us/book/kaleidoscope-ep/id1248904974?uo=4&lt;/a&gt;
</description> </description>
<link>https://waffles.ch/download.php/xxx/1166765/Coldplay%20-%20Kaleidoscope%20EP%20%5B2017-Web-MP3-V0%28VBR%29%5D.torrent?passkey=123456789&#x26;uid=xxx&#x26;rss=1</link> <link>https://waffles.ch/download.php/xxx/1166765/Coldplay%20-%20Kaleidoscope%20EP%20%5B2017-Web-MP3-V0%28VBR%29%5D.torrent?passkey=123456789&#x26;uid=xxx&#x26;rss=1</link>
<comments>https://waffles.ch/details.php?id=1166765&#x26;hit=1</comments> <comments>https://waffles.ch/details.php?id=1166765&#x26;hit=1</comments>
@ -224,7 +224,7 @@
&lt;b&gt;Country:&lt;/b&gt; UK&lt;br /&gt; &lt;b&gt;Country:&lt;/b&gt; UK&lt;br /&gt;
&lt;b&gt;Year:&lt;/b&gt; 2000&lt;br /&gt; &lt;b&gt;Year:&lt;/b&gt; 2000&lt;br /&gt;
&lt;b&gt;Genre:&lt;/b&gt; Alternative Rock, Britpop&lt;br /&gt; &lt;b&gt;Genre:&lt;/b&gt; Alternative Rock, Britpop&lt;br /&gt;
&lt;b&gt;Format:&lt;/b&gt; WEB, Album&lt;br /&gt; &lt;b&gt;Format:&lt;/b&gt; WEB, Book&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
&lt;b&gt;Tracklist&lt;/b&gt;&lt;br /&gt; &lt;b&gt;Tracklist&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
@ -546,7 +546,7 @@
Bitrate: Lossless&lt;br/&gt; Bitrate: Lossless&lt;br/&gt;
&lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;&lt;br/&gt; &lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;&lt;br/&gt;
Year: 2017&lt;br /&gt; Year: 2017&lt;br /&gt;
Artist: The Chainsmokers &amp;amp; Coldplay&lt;br /&gt; Author: The Chainsmokers &amp;amp; Coldplay&lt;br /&gt;
Source: WEB &lt;br /&gt; Source: WEB &lt;br /&gt;
Quality: FLAC&lt;br /&gt; Quality: FLAC&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;

@ -1,9 +1,9 @@
nin.* in this directory are re-encodes of nin.mp3 nin.* in this directory are re-encodes of nin.mp3
title : 999,999 title : 999,999
artist : Nine Inch Nails author : Nine Inch Nails
track : 1 track : 1
album : The Slip book : The Slip
copyright : Attribution-Noncommercial-Share Alike 3.0 United States: http://creativecommons.org/licenses/by-nc-sa/3.0/us/ copyright : Attribution-Noncommercial-Share Alike 3.0 United States: http://creativecommons.org/licenses/by-nc-sa/3.0/us/
comment : URL: http://freemusicarchive.org/music/Nine_Inch_Nails/The_Slip/999999 comment : URL: http://freemusicarchive.org/music/Nine_Inch_Nails/The_Slip/999999
: Comments: http://freemusicarchive.org/ : Comments: http://freemusicarchive.org/

@ -20,12 +20,12 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public class DeleteBadMediaCoversFixture : CoreTest<DeleteBadMediaCovers> public class DeleteBadMediaCoversFixture : CoreTest<DeleteBadMediaCovers>
{ {
private List<MetadataFile> _metadata; private List<MetadataFile> _metadata;
private List<Author> _artist; private List<Author> _author;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateListOfSize(1) _author = Builder<Author>.CreateListOfSize(1)
.All() .All()
.With(c => c.Path = "C:\\Music\\".AsOsAgnostic()) .With(c => c.Path = "C:\\Music\\".AsOsAgnostic())
.Build().ToList(); .Build().ToList();
@ -33,12 +33,12 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
_metadata = Builder<MetadataFile>.CreateListOfSize(1) _metadata = Builder<MetadataFile>.CreateListOfSize(1)
.Build().ToList(); .Build().ToList();
Mocker.GetMock<IArtistService>() Mocker.GetMock<IAuthorService>()
.Setup(c => c.AllArtistPaths()) .Setup(c => c.AllAuthorPaths())
.Returns(_artist.ToDictionary(x => x.Id, x => x.Path)); .Returns(_author.ToDictionary(x => x.Id, x => x.Path));
Mocker.GetMock<IMetadataFileService>() Mocker.GetMock<IMetadataFileService>()
.Setup(c => c.GetFilesByAuthor(_artist.First().Id)) .Setup(c => c.GetFilesByAuthor(_author.First().Id))
.Returns(_metadata); .Returns(_metadata);
Mocker.GetMock<IConfigService>().SetupGet(c => c.CleanupMetadataImages).Returns(true); Mocker.GetMock<IConfigService>().SetupGet(c => c.CleanupMetadataImages).Returns(true);
@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
[Test] [Test]
public void should_not_process_non_image_files() public void should_not_process_non_image_files()
{ {
_metadata.First().RelativePath = "album\\file.xml".AsOsAgnostic(); _metadata.First().RelativePath = "book\\file.xml".AsOsAgnostic();
_metadata.First().Type = MetadataType.BookMetadata; _metadata.First().Type = MetadataType.BookMetadata;
Subject.Clean(); Subject.Clean();
@ -73,7 +73,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
Subject.Clean(); Subject.Clean();
Mocker.GetMock<IConfigService>().VerifySet(c => c.CleanupMetadataImages = true, Times.Never()); Mocker.GetMock<IConfigService>().VerifySet(c => c.CleanupMetadataImages = true, Times.Never());
Mocker.GetMock<IArtistService>().Verify(c => c.GetAllAuthors(), Times.Never()); Mocker.GetMock<IAuthorService>().Verify(c => c.GetAllAuthors(), Times.Never());
AssertImageWasNotRemoved(); AssertImageWasNotRemoved();
} }
@ -91,9 +91,9 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
[Test] [Test]
public void should_delete_html_images() public void should_delete_html_images()
{ {
var imagePath = "C:\\Music\\Album\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Music\\Book\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().RelativePath = "Album\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "Book\\image.jpg".AsOsAgnostic();
_metadata.First().Type = MetadataType.AuthorImage; _metadata.First().Type = MetadataType.AuthorImage;
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
@ -109,10 +109,10 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
[Test] [Test]
public void should_delete_empty_images() public void should_delete_empty_images()
{ {
var imagePath = "C:\\Music\\Album\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Music\\Book\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().Type = MetadataType.BookImage; _metadata.First().Type = MetadataType.BookImage;
_metadata.First().RelativePath = "Album\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "Book\\image.jpg".AsOsAgnostic();
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(c => c.OpenReadStream(imagePath)) .Setup(c => c.OpenReadStream(imagePath))
@ -127,9 +127,9 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
[Test] [Test]
public void should_not_delete_non_html_files() public void should_not_delete_non_html_files()
{ {
var imagePath = "C:\\Music\\Album\\image.jpg".AsOsAgnostic(); var imagePath = "C:\\Music\\Book\\image.jpg".AsOsAgnostic();
_metadata.First().LastUpdated = new DateTime(2014, 12, 29); _metadata.First().LastUpdated = new DateTime(2014, 12, 29);
_metadata.First().RelativePath = "Album\\image.jpg".AsOsAgnostic(); _metadata.First().RelativePath = "Book\\image.jpg".AsOsAgnostic();
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(c => c.OpenReadStream(imagePath)) .Setup(c => c.OpenReadStream(imagePath))

@ -16,7 +16,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
{ {
private void GivenMissingRootFolder() private void GivenMissingRootFolder()
{ {
var artist = Builder<Author>.CreateListOfSize(1) var author = Builder<Author>.CreateListOfSize(1)
.Build() .Build()
.ToList(); .ToList();
@ -26,14 +26,14 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.AllAuthorPaths()) .Setup(s => s.AllAuthorPaths())
.Returns(artist.ToDictionary(x => x.Id, x => x.Path)); .Returns(author.ToDictionary(x => x.Id, x => x.Path));
Mocker.GetMock<IImportListFactory>() Mocker.GetMock<IImportListFactory>()
.Setup(s => s.All()) .Setup(s => s.All())
.Returns(importList); .Returns(importList);
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(s => s.GetParentFolder(artist.First().Path)) .Setup(s => s.GetParentFolder(author.First().Path))
.Returns(@"C:\Music"); .Returns(@"C:\Music");
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
} }
[Test] [Test]
public void should_not_return_error_when_no_artist() public void should_not_return_error_when_no_author()
{ {
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.AllAuthorPaths()) .Setup(s => s.AllAuthorPaths())
@ -56,7 +56,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
} }
[Test] [Test]
public void should_return_error_if_artist_parent_is_missing() public void should_return_error_if_author_parent_is_missing()
{ {
GivenMissingRootFolder(); GivenMissingRootFolder();

@ -42,17 +42,17 @@ namespace NzbDrone.Core.Test.HistoryTests
[Test] [Test]
public void should_use_file_name_for_source_title_if_scene_name_is_null() public void should_use_file_name_for_source_title_if_scene_name_is_null()
{ {
var artist = Builder<Author>.CreateNew().Build(); var author = Builder<Author>.CreateNew().Build();
var trackFile = Builder<BookFile>.CreateNew() var trackFile = Builder<BookFile>.CreateNew()
.With(f => f.SceneName = null) .With(f => f.SceneName = null)
.With(f => f.Author = artist) .With(f => f.Author = author)
.Build(); .Build();
var localTrack = new LocalBook var localTrack = new LocalBook
{ {
Author = artist, Author = author,
Book = new Book(), Book = new Book(),
Path = @"C:\Test\Unsorted\Artist.01.Hymn.mp3" Path = @"C:\Test\Unsorted\Author.01.Hymn.mp3"
}; };
var downloadClientItem = new DownloadClientItem var downloadClientItem = new DownloadClientItem

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
public class CleanupDuplicateMetadataFilesFixture : DbTest<CleanupDuplicateMetadataFiles, MetadataFile> public class CleanupDuplicateMetadataFilesFixture : DbTest<CleanupDuplicateMetadataFiles, MetadataFile>
{ {
[Test] [Test]
public void should_not_delete_metadata_files_when_they_are_for_the_same_artist_but_different_consumers() public void should_not_delete_metadata_files_when_they_are_for_the_same_author_but_different_consumers()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_for_different_artist() public void should_not_delete_metadata_files_for_different_author()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_when_they_are_for_the_same_artist_and_consumer() public void should_delete_metadata_files_when_they_are_for_the_same_author_and_consumer()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_there_is_only_one_for_that_artist_and_consumer() public void should_not_delete_metadata_files_when_there_is_only_one_for_that_author_and_consumer()
{ {
var file = Builder<MetadataFile>.CreateNew() var file = Builder<MetadataFile>.CreateNew()
.BuildNew(); .BuildNew();
@ -66,7 +66,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_they_are_for_the_same_album_but_different_consumers() public void should_not_delete_metadata_files_when_they_are_for_the_same_book_but_different_consumers()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -81,7 +81,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_for_different_album() public void should_not_delete_metadata_files_for_different_book()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -96,7 +96,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_when_they_are_for_the_same_album_and_consumer() public void should_delete_metadata_files_when_they_are_for_the_same_book_and_consumer()
{ {
var files = Builder<MetadataFile>.CreateListOfSize(2) var files = Builder<MetadataFile>.CreateListOfSize(2)
.All() .All()
@ -112,7 +112,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_when_there_is_only_one_for_that_album_and_consumer() public void should_not_delete_metadata_files_when_there_is_only_one_for_that_book_and_consumer()
{ {
var file = Builder<MetadataFile>.CreateNew() var file = Builder<MetadataFile>.CreateNew()
.BuildNew(); .BuildNew();

@ -29,14 +29,14 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_not_delete_unorphaned_blacklist_items() public void should_not_delete_unorphaned_blacklist_items()
{ {
var artist = Builder<Author>.CreateNew().BuildNew(); var author = Builder<Author>.CreateNew().BuildNew();
Db.Insert(artist); Db.Insert(author);
var blacklist = Builder<Blacklist>.CreateNew() var blacklist = Builder<Blacklist>.CreateNew()
.With(h => h.BookIds = new List<int>()) .With(h => h.BookIds = new List<int>())
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.With(b => b.AuthorId = artist.Id) .With(b => b.AuthorId = author.Id)
.BuildNew(); .BuildNew();
Db.Insert(blacklist); Db.Insert(blacklist);

@ -11,34 +11,34 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
public class CleanupOrphanedBooksFixture : DbTest<CleanupOrphanedBooks, Book> public class CleanupOrphanedBooksFixture : DbTest<CleanupOrphanedBooks, Book>
{ {
[Test] [Test]
public void should_delete_orphaned_albums() public void should_delete_orphaned_books()
{ {
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(album); Db.Insert(book);
Subject.Clean(); Subject.Clean();
AllStoredModels.Should().BeEmpty(); AllStoredModels.Should().BeEmpty();
} }
[Test] [Test]
public void should_not_delete_unorphaned_albums() public void should_not_delete_unorphaned_books()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.With(e => e.Metadata = new AuthorMetadata { Id = 1 }) .With(e => e.Metadata = new AuthorMetadata { Id = 1 })
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var albums = Builder<Book>.CreateListOfSize(2) var books = Builder<Book>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(e => e.AuthorMetadataId = artist.Metadata.Value.Id) .With(e => e.AuthorMetadataId = author.Metadata.Value.Id)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(albums); Db.InsertMany(books);
Subject.Clean(); Subject.Clean();
AllStoredModels.Should().HaveCount(1); AllStoredModels.Should().HaveCount(1);
AllStoredModels.Should().Contain(e => e.AuthorMetadataId == artist.Metadata.Value.Id); AllStoredModels.Should().Contain(e => e.AuthorMetadataId == author.Metadata.Value.Id);
} }
} }
} }

@ -11,37 +11,37 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[TestFixture] [TestFixture]
public class CleanupOrphanedHistoryItemsFixture : DbTest<CleanupOrphanedHistoryItems, History.History> public class CleanupOrphanedHistoryItemsFixture : DbTest<CleanupOrphanedHistoryItems, History.History>
{ {
private Author _artist; private Author _author;
private Book _album; private Book _book;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
_album = Builder<Book>.CreateNew() _book = Builder<Book>.CreateNew()
.BuildNew(); .BuildNew();
} }
private void GivenArtist() private void GivenAuthor()
{ {
Db.Insert(_artist); Db.Insert(_author);
} }
private void GivenAlbum() private void GivenBook()
{ {
Db.Insert(_album); Db.Insert(_book);
} }
[Test] [Test]
public void should_delete_orphaned_items_by_artist() public void should_delete_orphaned_items_by_author()
{ {
GivenAlbum(); GivenBook();
var history = Builder<History.History>.CreateNew() var history = Builder<History.History>.CreateNew()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.With(h => h.BookId = _album.Id) .With(h => h.BookId = _book.Id)
.BuildNew(); .BuildNew();
Db.Insert(history); Db.Insert(history);
@ -50,13 +50,13 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_orphaned_items_by_album() public void should_delete_orphaned_items_by_book()
{ {
GivenArtist(); GivenAuthor();
var history = Builder<History.History>.CreateNew() var history = Builder<History.History>.CreateNew()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.BuildNew(); .BuildNew();
Db.Insert(history); Db.Insert(history);
@ -65,45 +65,45 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_unorphaned_data_by_artist() public void should_not_delete_unorphaned_data_by_author()
{ {
GivenArtist(); GivenAuthor();
GivenAlbum(); GivenBook();
var history = Builder<History.History>.CreateListOfSize(2) var history = Builder<History.History>.CreateListOfSize(2)
.All() .All()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.With(h => h.BookId = _album.Id) .With(h => h.BookId = _book.Id)
.TheFirst(1) .TheFirst(1)
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(history); Db.InsertMany(history);
Subject.Clean(); Subject.Clean();
AllStoredModels.Should().HaveCount(1); AllStoredModels.Should().HaveCount(1);
AllStoredModels.Should().Contain(h => h.AuthorId == _artist.Id); AllStoredModels.Should().Contain(h => h.AuthorId == _author.Id);
} }
[Test] [Test]
public void should_not_delete_unorphaned_data_by_album() public void should_not_delete_unorphaned_data_by_book()
{ {
GivenArtist(); GivenAuthor();
GivenAlbum(); GivenBook();
var history = Builder<History.History>.CreateListOfSize(2) var history = Builder<History.History>.CreateListOfSize(2)
.All() .All()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.With(h => h.AuthorId = _artist.Id) .With(h => h.AuthorId = _author.Id)
.TheFirst(1) .TheFirst(1)
.With(h => h.BookId = _album.Id) .With(h => h.BookId = _book.Id)
.BuildListOfNew(); .BuildListOfNew();
Db.InsertMany(history); Db.InsertMany(history);
Subject.Clean(); Subject.Clean();
AllStoredModels.Should().HaveCount(1); AllStoredModels.Should().HaveCount(1);
AllStoredModels.Should().Contain(h => h.BookId == _album.Id); AllStoredModels.Should().Contain(h => h.BookId == _book.Id);
} }
} }
} }

@ -15,7 +15,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
public class CleanupOrphanedMetadataFilesFixture : DbTest<CleanupOrphanedMetadataFiles, MetadataFile> public class CleanupOrphanedMetadataFilesFixture : DbTest<CleanupOrphanedMetadataFiles, MetadataFile>
{ {
[Test] [Test]
public void should_delete_metadata_files_that_dont_have_a_coresponding_artist() public void should_delete_metadata_files_that_dont_have_a_coresponding_author()
{ {
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
@ -27,15 +27,15 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_metadata_files_that_dont_have_a_coresponding_album() public void should_delete_metadata_files_that_dont_have_a_coresponding_book()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
.BuildNew(); .BuildNew();
@ -45,15 +45,15 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_that_have_a_coresponding_artist() public void should_not_delete_metadata_files_that_have_a_coresponding_author()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.BookId = null) .With(m => m.BookId = null)
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
.BuildNew(); .BuildNew();
@ -65,20 +65,20 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_not_delete_metadata_files_that_have_a_coresponding_album() public void should_not_delete_metadata_files_that_have_a_coresponding_book()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
Db.Insert(album); Db.Insert(book);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.BookId = album.Id) .With(m => m.BookId = book.Id)
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
.BuildNew(); .BuildNew();
@ -90,18 +90,18 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_delete_metadata_files_that_dont_have_a_coresponding_track_file() public void should_delete_metadata_files_that_dont_have_a_coresponding_track_file()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
Db.Insert(album); Db.Insert(book);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.BookId = album.Id) .With(m => m.BookId = book.Id)
.With(m => m.BookFileId = 10) .With(m => m.BookFileId = 10)
.BuildNew(); .BuildNew();
@ -113,23 +113,23 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_not_delete_metadata_files_that_have_a_coresponding_track_file() public void should_not_delete_metadata_files_that_have_a_coresponding_track_file()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.BuildNew(); .BuildNew();
var trackFile = Builder<BookFile>.CreateNew() var trackFile = Builder<BookFile>.CreateNew()
.With(h => h.Quality = new QualityModel()) .With(h => h.Quality = new QualityModel())
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
Db.Insert(album); Db.Insert(book);
Db.Insert(trackFile); Db.Insert(trackFile);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.BookId = album.Id) .With(m => m.BookId = book.Id)
.With(m => m.BookFileId = trackFile.Id) .With(m => m.BookFileId = trackFile.Id)
.BuildNew(); .BuildNew();
@ -139,15 +139,15 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_album_metadata_files_that_have_albumid_of_zero() public void should_delete_book_metadata_files_that_have_bookid_of_zero()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.Type = MetadataType.BookMetadata) .With(m => m.Type = MetadataType.BookMetadata)
.With(m => m.BookId = 0) .With(m => m.BookId = 0)
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
@ -159,15 +159,15 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
} }
[Test] [Test]
public void should_delete_album_image_files_that_have_albumid_of_zero() public void should_delete_book_image_files_that_have_bookid_of_zero()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.Type = MetadataType.BookImage) .With(m => m.Type = MetadataType.BookImage)
.With(m => m.BookId = 0) .With(m => m.BookId = 0)
.With(m => m.BookFileId = null) .With(m => m.BookFileId = null)
@ -181,13 +181,13 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_delete_track_metadata_files_that_have_trackfileid_of_zero() public void should_delete_track_metadata_files_that_have_trackfileid_of_zero()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.BuildNew(); .BuildNew();
Db.Insert(artist); Db.Insert(author);
var metadataFile = Builder<MetadataFile>.CreateNew() var metadataFile = Builder<MetadataFile>.CreateNew()
.With(m => m.AuthorId = artist.Id) .With(m => m.AuthorId = author.Id)
.With(m => m.Type = MetadataType.BookMetadata) .With(m => m.Type = MetadataType.BookMetadata)
.With(m => m.BookFileId = 0) .With(m => m.BookFileId = 0)
.BuildNew(); .BuildNew();

@ -28,12 +28,12 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_not_delete_unorphaned_pending_items() public void should_not_delete_unorphaned_pending_items()
{ {
var artist = Builder<Author>.CreateNew().BuildNew(); var author = Builder<Author>.CreateNew().BuildNew();
Db.Insert(artist); Db.Insert(author);
var pendingRelease = Builder<PendingRelease>.CreateNew() var pendingRelease = Builder<PendingRelease>.CreateNew()
.With(h => h.AuthorId = artist.Id) .With(h => h.AuthorId = author.Id)
.With(h => h.ParsedBookInfo = new ParsedBookInfo()) .With(h => h.ParsedBookInfo = new ParsedBookInfo())
.With(h => h.Release = new ReleaseInfo()) .With(h => h.Release = new ReleaseInfo())
.BuildNew(); .BuildNew();

@ -13,14 +13,14 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_update_clean_title() public void should_update_clean_title()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.With(s => s.Name = "Full Name") .With(s => s.Name = "Full Name")
.With(s => s.CleanName = "unclean") .With(s => s.CleanName = "unclean")
.Build(); .Build();
Mocker.GetMock<IAuthorRepository>() Mocker.GetMock<IAuthorRepository>()
.Setup(s => s.All()) .Setup(s => s.All())
.Returns(new[] { artist }); .Returns(new[] { author });
Subject.Clean(); Subject.Clean();
@ -31,14 +31,14 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
[Test] [Test]
public void should_not_update_unchanged_title() public void should_not_update_unchanged_title()
{ {
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.With(s => s.Name = "Full Name") .With(s => s.Name = "Full Name")
.With(s => s.CleanName = "fullname") .With(s => s.CleanName = "fullname")
.Build(); .Build();
Mocker.GetMock<IAuthorRepository>() Mocker.GetMock<IAuthorRepository>()
.Setup(s => s.All()) .Setup(s => s.All())
.Returns(new[] { artist }); .Returns(new[] { author });
Subject.Clean(); Subject.Clean();

@ -73,7 +73,7 @@ namespace NzbDrone.Core.Test.ImportListTests
.Returns<List<Author>, bool>((x, y) => x); .Returns<List<Author>, bool>((x, y) => x);
} }
private void WithAlbum() private void WithBook()
{ {
_importListReports.First().Book = "Meteora"; _importListReports.First().Book = "Meteora";
} }
@ -88,21 +88,21 @@ namespace NzbDrone.Core.Test.ImportListTests
_importListReports.First().EditionGoodreadsId = "1234"; _importListReports.First().EditionGoodreadsId = "1234";
} }
private void WithExistingArtist() private void WithExistingAuthor()
{ {
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(v => v.FindById(_importListReports.First().AuthorGoodreadsId)) .Setup(v => v.FindById(_importListReports.First().AuthorGoodreadsId))
.Returns(new Author { ForeignAuthorId = _importListReports.First().AuthorGoodreadsId }); .Returns(new Author { ForeignAuthorId = _importListReports.First().AuthorGoodreadsId });
} }
private void WithExistingAlbum() private void WithExistingBook()
{ {
Mocker.GetMock<IBookService>() Mocker.GetMock<IBookService>()
.Setup(v => v.FindById(_importListReports.First().EditionGoodreadsId)) .Setup(v => v.FindById(_importListReports.First().EditionGoodreadsId))
.Returns(new Book { ForeignBookId = _importListReports.First().EditionGoodreadsId }); .Returns(new Book { ForeignBookId = _importListReports.First().EditionGoodreadsId });
} }
private void WithExcludedArtist() private void WithExcludedAuthor()
{ {
Mocker.GetMock<IImportListExclusionService>() Mocker.GetMock<IImportListExclusionService>()
.Setup(v => v.All()) .Setup(v => v.All())
@ -115,7 +115,7 @@ namespace NzbDrone.Core.Test.ImportListTests
}); });
} }
private void WithExcludedAlbum() private void WithExcludedBook()
{ {
Mocker.GetMock<IImportListExclusionService>() Mocker.GetMock<IImportListExclusionService>()
.Setup(v => v.All()) .Setup(v => v.All())
@ -136,7 +136,7 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_search_if_artist_title_and_no_artist_id() public void should_search_if_author_title_and_no_author_id()
{ {
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -145,7 +145,7 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_search_if_artist_title_and_artist_id() public void should_not_search_if_author_title_and_author_id()
{ {
WithAuthorId(); WithAuthorId();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -155,9 +155,9 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_search_if_album_title_and_no_album_id() public void should_search_if_book_title_and_no_book_id()
{ {
WithAlbum(); WithBook();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
Mocker.GetMock<ISearchForNewBook>() Mocker.GetMock<ISearchForNewBook>()
@ -165,7 +165,7 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_search_if_album_title_and_album_id() public void should_not_search_if_book_title_and_book_id()
{ {
WithAuthorId(); WithAuthorId();
WithBookId(); WithBookId();
@ -179,7 +179,7 @@ namespace NzbDrone.Core.Test.ImportListTests
public void should_not_search_if_all_info() public void should_not_search_if_all_info()
{ {
WithAuthorId(); WithAuthorId();
WithAlbum(); WithBook();
WithBookId(); WithBookId();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -191,10 +191,10 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_add_if_existing_artist() public void should_not_add_if_existing_author()
{ {
WithAuthorId(); WithAuthorId();
WithExistingArtist(); WithExistingAuthor();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -203,10 +203,10 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_add_if_existing_album() public void should_not_add_if_existing_book()
{ {
WithBookId(); WithBookId();
WithExistingAlbum(); WithExistingBook();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -215,10 +215,10 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_add_if_existing_artist_but_new_album() public void should_add_if_existing_author_but_new_book()
{ {
WithBookId(); WithBookId();
WithExistingArtist(); WithExistingAuthor();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -229,7 +229,7 @@ namespace NzbDrone.Core.Test.ImportListTests
[TestCase(ImportListMonitorType.None, false)] [TestCase(ImportListMonitorType.None, false)]
[TestCase(ImportListMonitorType.SpecificBook, true)] [TestCase(ImportListMonitorType.SpecificBook, true)]
[TestCase(ImportListMonitorType.EntireAuthor, true)] [TestCase(ImportListMonitorType.EntireAuthor, true)]
public void should_add_if_not_existing_artist(ImportListMonitorType monitor, bool expectedArtistMonitored) public void should_add_if_not_existing_author(ImportListMonitorType monitor, bool expectedAuthorMonitored)
{ {
WithAuthorId(); WithAuthorId();
WithMonitorType(monitor); WithMonitorType(monitor);
@ -237,13 +237,13 @@ namespace NzbDrone.Core.Test.ImportListTests
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
Mocker.GetMock<IAddAuthorService>() Mocker.GetMock<IAddAuthorService>()
.Verify(v => v.AddAuthors(It.Is<List<Author>>(t => t.Count == 1 && t.First().Monitored == expectedArtistMonitored), false)); .Verify(v => v.AddAuthors(It.Is<List<Author>>(t => t.Count == 1 && t.First().Monitored == expectedAuthorMonitored), false));
} }
[TestCase(ImportListMonitorType.None, false)] [TestCase(ImportListMonitorType.None, false)]
[TestCase(ImportListMonitorType.SpecificBook, true)] [TestCase(ImportListMonitorType.SpecificBook, true)]
[TestCase(ImportListMonitorType.EntireAuthor, true)] [TestCase(ImportListMonitorType.EntireAuthor, true)]
public void should_add_if_not_existing_album(ImportListMonitorType monitor, bool expectedAlbumMonitored) public void should_add_if_not_existing_book(ImportListMonitorType monitor, bool expectedBookMonitored)
{ {
WithBookId(); WithBookId();
WithMonitorType(monitor); WithMonitorType(monitor);
@ -251,14 +251,14 @@ namespace NzbDrone.Core.Test.ImportListTests
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
Mocker.GetMock<IAddBookService>() Mocker.GetMock<IAddBookService>()
.Verify(v => v.AddBooks(It.Is<List<Book>>(t => t.Count == 1 && t.First().Monitored == expectedAlbumMonitored), false)); .Verify(v => v.AddBooks(It.Is<List<Book>>(t => t.Count == 1 && t.First().Monitored == expectedBookMonitored), false));
} }
[Test] [Test]
public void should_not_add_artist_if_excluded_artist() public void should_not_add_author_if_excluded_author()
{ {
WithAuthorId(); WithAuthorId();
WithExcludedArtist(); WithExcludedAuthor();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -267,10 +267,10 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_add_album_if_excluded_album() public void should_not_add_book_if_excluded_book()
{ {
WithBookId(); WithBookId();
WithExcludedAlbum(); WithExcludedBook();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());
@ -279,11 +279,11 @@ namespace NzbDrone.Core.Test.ImportListTests
} }
[Test] [Test]
public void should_not_add_album_if_excluded_artist() public void should_not_add_book_if_excluded_author()
{ {
WithBookId(); WithBookId();
WithAuthorId(); WithAuthorId();
WithExcludedArtist(); WithExcludedAuthor();
Subject.Execute(new ImportListSyncCommand()); Subject.Execute(new ImportListSyncCommand());

@ -12,21 +12,21 @@ using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.IndexerSearchTests namespace NzbDrone.Core.Test.IndexerSearchTests
{ {
[TestFixture] [TestFixture]
public class ArtistSearchServiceFixture : CoreTest<AuthorSearchService> public class AuthorSearchServiceFixture : CoreTest<AuthorSearchService>
{ {
private Author _artist; private Author _author;
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_artist = new Author(); _author = new Author();
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.GetAuthor(It.IsAny<int>())) .Setup(s => s.GetAuthor(It.IsAny<int>()))
.Returns(_artist); .Returns(_author);
Mocker.GetMock<ISearchForNzb>() Mocker.GetMock<ISearchForNzb>()
.Setup(s => s.AuthorSearch(_artist.Id, false, true, false)) .Setup(s => s.AuthorSearch(_author.Id, false, true, false))
.Returns(new List<DownloadDecision>()); .Returns(new List<DownloadDecision>());
Mocker.GetMock<IProcessDownloadDecisions>() Mocker.GetMock<IProcessDownloadDecisions>()
@ -35,19 +35,19 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
} }
[Test] [Test]
public void should_only_include_monitored_albums() public void should_only_include_monitored_books()
{ {
_artist.Books = new List<Book> _author.Books = new List<Book>
{ {
new Book { Monitored = false }, new Book { Monitored = false },
new Book { Monitored = true } new Book { Monitored = true }
}; };
Subject.Execute(new AuthorSearchCommand { AuthorId = _artist.Id, Trigger = CommandTrigger.Manual }); Subject.Execute(new AuthorSearchCommand { AuthorId = _author.Id, Trigger = CommandTrigger.Manual });
Mocker.GetMock<ISearchForNzb>() Mocker.GetMock<ISearchForNzb>()
.Verify(v => v.AuthorSearch(_artist.Id, false, true, false), .Verify(v => v.AuthorSearch(_author.Id, false, true, false),
Times.Exactly(_artist.Books.Value.Count(s => s.Monitored))); Times.Exactly(_author.Books.Value.Count(s => s.Monitored)));
} }
} }
} }

@ -6,13 +6,13 @@ using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.IndexerSearchTests namespace NzbDrone.Core.Test.IndexerSearchTests
{ {
public class AlbumSearchDefinitionFixture : CoreTest<BookSearchCriteria> public class BookSearchDefinitionFixture : CoreTest<BookSearchCriteria>
{ {
[TestCase("Mötley Crüe", "Motley+Crue")] [TestCase("Mötley Crüe", "Motley+Crue")]
[TestCase("방탄소년단", "방탄소년단")] [TestCase("방탄소년단", "방탄소년단")]
public void should_replace_some_special_characters_artist(string artist, string expected) public void should_replace_some_special_characters_author(string author, string expected)
{ {
Subject.Author = new Author { Name = artist }; Subject.Author = new Author { Name = author };
Subject.AuthorQuery.Should().Be(expected); Subject.AuthorQuery.Should().Be(expected);
} }
@ -22,16 +22,16 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
[TestCase("¿Quién sabe?", "Quien+sabe")] [TestCase("¿Quién sabe?", "Quien+sabe")]
[TestCase("Seal the Deal & Lets Boogie", "Seal+the+Deal+Lets+Boogie")] [TestCase("Seal the Deal & Lets Boogie", "Seal+the+Deal+Lets+Boogie")]
[TestCase("Section.80", "Section+80")] [TestCase("Section.80", "Section+80")]
public void should_replace_some_special_characters(string album, string expected) public void should_replace_some_special_characters(string book, string expected)
{ {
Subject.BookTitle = album; Subject.BookTitle = book;
Subject.BookQuery.Should().Be(expected); Subject.BookQuery.Should().Be(expected);
} }
[TestCase("+", "+")] [TestCase("+", "+")]
public void should_not_replace_some_special_characters_if_result_empty_string(string album, string expected) public void should_not_replace_some_special_characters_if_result_empty_string(string book, string expected)
{ {
Subject.BookTitle = album; Subject.BookTitle = book;
Subject.BookQuery.Should().Be(expected); Subject.BookQuery.Should().Be(expected);
} }
} }

@ -14,14 +14,14 @@ namespace NzbDrone.Core.Test.IndexerTests.IntegrationTests
[IntegrationTest] [IntegrationTest]
public class IndexerIntegrationTests : CoreTest public class IndexerIntegrationTests : CoreTest
{ {
private BookSearchCriteria _albumSearchCriteria; private BookSearchCriteria _bookSearchCriteria;
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
UseRealHttp(); UseRealHttp();
_albumSearchCriteria = new BookSearchCriteria() _bookSearchCriteria = new BookSearchCriteria()
{ {
}; };
} }

@ -10,7 +10,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
{ {
public class NewznabRequestGeneratorFixture : CoreTest<NewznabRequestGenerator> public class NewznabRequestGeneratorFixture : CoreTest<NewznabRequestGenerator>
{ {
private BookSearchCriteria _singleAlbumSearchCriteria; private BookSearchCriteria _singleBookSearchCriteria;
private NewznabCapabilities _capabilities; private NewznabCapabilities _capabilities;
[SetUp] [SetUp]
@ -23,7 +23,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
ApiKey = "abcd", ApiKey = "abcd",
}; };
_singleAlbumSearchCriteria = new BookSearchCriteria _singleBookSearchCriteria = new BookSearchCriteria
{ {
Author = new Books.Author { Name = "Alien Ant Farm" }, Author = new Books.Author { Name = "Alien Ant Farm" },
BookTitle = "TruANT" BookTitle = "TruANT"
@ -50,11 +50,11 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
[Test] [Test]
[Ignore("Disabled since no usenet indexers seem to support it")] [Ignore("Disabled since no usenet indexers seem to support it")]
public void should_search_by_artist_and_album_if_supported() public void should_search_by_author_and_book_if_supported()
{ {
_capabilities.SupportedBookSearchParameters = new[] { "q", "author", "title" }; _capabilities.SupportedBookSearchParameters = new[] { "q", "author", "title" };
var results = Subject.GetSearchRequests(_singleAlbumSearchCriteria); var results = Subject.GetSearchRequests(_singleBookSearchCriteria);
results.GetTier(0).Should().HaveCount(1); results.GetTier(0).Should().HaveCount(1);
var page = results.GetAllTiers().First().First(); var page = results.GetAllTiers().First().First();

@ -98,7 +98,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests
[TestCase(".png")] [TestCase(".png")]
[TestCase(".jpg")] [TestCase(".jpg")]
public void should_convert_album_cover_urls_to_local(string extension) public void should_convert_book_cover_urls_to_local(string extension)
{ {
var covers = new List<MediaCover.MediaCover> var covers = new List<MediaCover.MediaCover>
{ {

@ -78,7 +78,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
.With(x => x.OriginalReleaseDate = new DateTime(2009, 4, 1)) .With(x => x.OriginalReleaseDate = new DateTime(2009, 4, 1))
.With(x => x.OriginalYear = 2009) .With(x => x.OriginalYear = 2009)
.With(x => x.Performers = new[] { "Performer1" }) .With(x => x.Performers = new[] { "Performer1" })
.With(x => x.AlbumArtists = new[] { "방탄소년단" }) .With(x => x.BookAuthors = new[] { "방탄소년단" })
.With(x => x.Genres = new[] { "Genre1", "Genre2" }) .With(x => x.Genres = new[] { "Genre1", "Genre2" })
.With(x => x.ImageFile = imageFile) .With(x => x.ImageFile = imageFile)
.With(x => x.ImageSize = imageSize) .With(x => x.ImageSize = imageSize)
@ -209,7 +209,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
var expected = new AudioTag() var expected = new AudioTag()
{ {
Performers = new string[0], Performers = new string[0],
AlbumArtists = new string[0], BookAuthors = new string[0],
Genres = new string[0] Genres = new string[0]
}; };
@ -307,21 +307,21 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
private BookFile GivenPopulatedTrackfile(int mediumOffset) private BookFile GivenPopulatedTrackfile(int mediumOffset)
{ {
var meta = Builder<AuthorMetadata>.CreateNew().Build(); var meta = Builder<AuthorMetadata>.CreateNew().Build();
var artist = Builder<Author>.CreateNew() var author = Builder<Author>.CreateNew()
.With(x => x.Metadata = meta) .With(x => x.Metadata = meta)
.Build(); .Build();
var album = Builder<Book>.CreateNew() var book = Builder<Book>.CreateNew()
.With(x => x.Author = artist) .With(x => x.Author = author)
.Build(); .Build();
var edition = Builder<Edition>.CreateNew() var edition = Builder<Edition>.CreateNew()
.With(x => x.Book = album) .With(x => x.Book = book)
.Build(); .Build();
var file = Builder<BookFile>.CreateNew() var file = Builder<BookFile>.CreateNew()
.With(x => x.Edition = edition) .With(x => x.Edition = edition)
.With(x => x.Author = artist) .With(x => x.Author = author)
.Build(); .Build();
return file; return file;

@ -9,6 +9,7 @@ using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Core.Books;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.BookImport; using NzbDrone.Core.MediaFiles.BookImport;
@ -31,11 +32,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
public void Setup() public void Setup()
{ {
_rootFolder = @"C:\Test\Music".AsOsAgnostic(); _rootFolder = @"C:\Test\Music".AsOsAgnostic();
_otherAuthorFolder = @"C:\Test\Music\OtherArtist".AsOsAgnostic(); _otherAuthorFolder = @"C:\Test\Music\OtherAuthor".AsOsAgnostic();
var artistFolder = @"C:\Test\Music\Artist".AsOsAgnostic(); var authorFolder = @"C:\Test\Music\Author".AsOsAgnostic();
_author = Builder<Author>.CreateNew() _author = Builder<Author>.CreateNew()
.With(s => s.Path = artistFolder) .With(s => s.Path = authorFolder)
.Build(); .Build();
Mocker.GetMock<IRootFolderService>() Mocker.GetMock<IRootFolderService>()
@ -73,7 +74,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
} }
} }
private void GivenArtistFolder() private void GivenAuthorFolder()
{ {
GivenRootFolder(_author.Path); GivenRootFolder(_author.Path);
} }
@ -161,9 +162,9 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
} }
[Test] [Test]
public void should_find_files_at_root_of_artist_folder() public void should_find_files_at_root_of_author_folder()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -180,7 +181,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_extras_subfolder() public void should_not_scan_extras_subfolder()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -200,7 +201,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_AppleDouble_subfolder() public void should_not_scan_AppleDouble_subfolder()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -216,11 +217,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
} }
[Test] [Test]
public void should_scan_extras_artist_and_subfolders() public void should_scan_extras_author_and_subfolders()
{ {
_author.Path = @"C:\Test\Music\Extras".AsOsAgnostic(); _author.Path = @"C:\Test\Music\Extras".AsOsAgnostic();
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -241,11 +242,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_scan_files_that_start_with_period() public void should_scan_files_that_start_with_period()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
Path.Combine(_author.Path, "Album 1", ".t01.mobi") Path.Combine(_author.Path, "Book 1", ".t01.mobi")
}); });
Subject.Scan(new List<string> { _author.Path }); Subject.Scan(new List<string> { _author.Path });
@ -257,7 +258,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_subfolders_that_start_with_period() public void should_not_scan_subfolders_that_start_with_period()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -276,7 +277,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_subfolder_of_season_folder_that_starts_with_a_period() public void should_not_scan_subfolder_of_season_folder_that_starts_with_a_period()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -296,7 +297,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_Synology_eaDir() public void should_not_scan_Synology_eaDir()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -313,7 +314,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_not_scan_thumb_folder() public void should_not_scan_thumb_folder()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -332,7 +333,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{ {
_author.Path = @"C:\Test\Music\.hack".AsOsAgnostic(); _author.Path = @"C:\Test\Music\.hack".AsOsAgnostic();
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {
@ -349,7 +350,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[Test] [Test]
public void should_exclude_osx_metadata_files() public void should_exclude_osx_metadata_files()
{ {
GivenArtistFolder(); GivenAuthorFolder();
GivenFiles(new List<string> GivenFiles(new List<string>
{ {

@ -18,7 +18,7 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MediaFiles namespace NzbDrone.Core.Test.MediaFiles
{ {
[TestFixture] [TestFixture]
public class DownloadedAlbumsCommandServiceFixture : FileSystemTest<DownloadedBooksCommandService> public class DownloadedBooksCommandServiceFixture : FileSystemTest<DownloadedBooksCommandService>
{ {
private string _downloadFolder = "c:\\drop_other\\Show.S01E01\\".AsOsAgnostic(); private string _downloadFolder = "c:\\drop_other\\Show.S01E01\\".AsOsAgnostic();
private string _downloadFile = "c:\\drop_other\\Show.S01E01.mkv".AsOsAgnostic(); private string _downloadFile = "c:\\drop_other\\Show.S01E01.mkv".AsOsAgnostic();

@ -69,10 +69,10 @@ namespace NzbDrone.Core.Test.MediaFiles
} }
} }
private void GivenValidArtist() private void GivenValidAuthor()
{ {
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>())) .Setup(s => s.GetAuthor(It.IsAny<string>()))
.Returns(Builder<Author>.CreateNew().Build()); .Returns(Builder<Author>.CreateNew().Build());
} }
@ -100,17 +100,17 @@ namespace NzbDrone.Core.Test.MediaFiles
} }
[Test] [Test]
public void should_search_for_artist_using_folder_name() public void should_search_for_author_using_folder_name()
{ {
Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory)); Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory));
Mocker.GetMock<IParsingService>().Verify(c => c.GetArtist("foldername"), Times.Once()); Mocker.GetMock<IParsingService>().Verify(c => c.GetAuthor("foldername"), Times.Once());
} }
[Test] [Test]
public void should_skip_if_file_is_in_use_by_another_process() public void should_skip_if_file_is_in_use_by_another_process()
{ {
GivenValidArtist(); GivenValidAuthor();
foreach (var file in _audioFiles) foreach (var file in _audioFiles)
{ {
@ -123,9 +123,9 @@ namespace NzbDrone.Core.Test.MediaFiles
} }
[Test] [Test]
public void should_skip_if_no_artist_found() public void should_skip_if_no_author_found()
{ {
Mocker.GetMock<IParsingService>().Setup(c => c.GetArtist("foldername")).Returns((Author)null); Mocker.GetMock<IParsingService>().Setup(c => c.GetAuthor("foldername")).Returns((Author)null);
Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory)); Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory));
@ -137,9 +137,9 @@ namespace NzbDrone.Core.Test.MediaFiles
} }
[Test] [Test]
public void should_not_import_if_folder_is_a_artist_path() public void should_not_import_if_folder_is_a_author_path()
{ {
GivenValidArtist(); GivenValidAuthor();
Mocker.GetMock<IAuthorService>() Mocker.GetMock<IAuthorService>()
.Setup(s => s.AuthorPathExists(It.IsAny<string>())) .Setup(s => s.AuthorPathExists(It.IsAny<string>()))
@ -173,7 +173,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_not_delete_folder_if_files_were_imported_and_audio_files_remain() public void should_not_delete_folder_if_files_were_imported_and_audio_files_remain()
{ {
GivenValidArtist(); GivenValidAuthor();
var localTrack = new LocalBook(); var localTrack = new LocalBook();
@ -206,14 +206,14 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory)); Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory));
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Verify(v => v.GetArtist(folderName), Times.Once()); .Verify(v => v.GetAuthor(folderName), Times.Once());
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Verify(v => v.GetArtist(It.Is<string>(s => s.StartsWith(prefix))), Times.Never()); .Verify(v => v.GetAuthor(It.Is<string>(s => s.StartsWith(prefix))), Times.Never());
} }
[Test] [Test]
public void should_return_importresult_on_unknown_artist() public void should_return_importresult_on_unknown_author()
{ {
var fileName = @"C:\folder\file.mkv".AsOsAgnostic(); var fileName = @"C:\folder\file.mkv".AsOsAgnostic();
FileSystem.AddFile(fileName, new MockFileData(string.Empty)); FileSystem.AddFile(fileName, new MockFileData(string.Empty));
@ -230,7 +230,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_not_delete_if_there_is_large_rar_file() public void should_not_delete_if_there_is_large_rar_file()
{ {
GivenValidArtist(); GivenValidAuthor();
var localTrack = new LocalBook(); var localTrack = new LocalBook();
@ -262,7 +262,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.ProcessPath(folderName).Should().BeEmpty(); Subject.ProcessPath(folderName).Should().BeEmpty();
Mocker.GetMock<IParsingService>() Mocker.GetMock<IParsingService>()
.Verify(v => v.GetArtist(It.IsAny<string>()), Times.Never()); .Verify(v => v.GetAuthor(It.IsAny<string>()), Times.Never());
ExceptionVerification.ExpectedErrors(1); ExceptionVerification.ExpectedErrors(1);
} }
@ -270,7 +270,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_not_delete_if_no_files_were_imported() public void should_not_delete_if_no_files_were_imported()
{ {
GivenValidArtist(); GivenValidAuthor();
var localTrack = new LocalBook(); var localTrack = new LocalBook();
@ -296,7 +296,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_not_delete_folder_after_import() public void should_not_delete_folder_after_import()
{ {
GivenValidArtist(); GivenValidAuthor();
GivenSuccessfulImport(); GivenSuccessfulImport();
@ -310,7 +310,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_delete_folder_if_importmode_move() public void should_delete_folder_if_importmode_move()
{ {
GivenValidArtist(); GivenValidAuthor();
GivenSuccessfulImport(); GivenSuccessfulImport();
@ -324,7 +324,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test] [Test]
public void should_not_delete_folder_if_importmode_copy() public void should_not_delete_folder_if_importmode_copy()
{ {
GivenValidArtist(); GivenValidAuthor();
GivenSuccessfulImport(); GivenSuccessfulImport();

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save