mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-19 04:59:35 -07:00
Fixed: Extra tests and fixes for new track parser (#632)
* Extra tests and fixes for new track parser * Address review comments, add extra test, fix logging
This commit is contained in:
parent
af65e251d8
commit
6cfc591364
17 changed files with 3641 additions and 763 deletions
|
@ -107,26 +107,23 @@ namespace NzbDrone.Common.Test.CacheTests
|
||||||
public void should_clear_expired_when_they_expire()
|
public void should_clear_expired_when_they_expire()
|
||||||
{
|
{
|
||||||
int hitCount = 0;
|
int hitCount = 0;
|
||||||
|
_cachedString = new Cached<string>();
|
||||||
|
|
||||||
Func<string> testfunc = () => {
|
for (int i = 0; i < 10; i++)
|
||||||
hitCount++;
|
{
|
||||||
return null;
|
_cachedString.Get("key", () =>
|
||||||
};
|
{
|
||||||
|
hitCount++;
|
||||||
|
return null;
|
||||||
|
}, TimeSpan.FromMilliseconds(300));
|
||||||
|
|
||||||
_cachedString.Values.Should().HaveCount(0);
|
Thread.Sleep(100);
|
||||||
|
}
|
||||||
_cachedString.Get("key", testfunc, TimeSpan.FromMilliseconds(300));
|
|
||||||
|
|
||||||
Thread.Sleep(100);
|
|
||||||
|
|
||||||
_cachedString.Values.Should().HaveCount(1);
|
|
||||||
|
|
||||||
_cachedString.Get("key", testfunc, TimeSpan.FromMilliseconds(300));
|
|
||||||
|
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
|
hitCount.Should().BeInRange(3, 6);
|
||||||
_cachedString.Values.Should().HaveCount(0);
|
_cachedString.Values.Should().HaveCount(0);
|
||||||
hitCount.Should().Be(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1400
src/NzbDrone.Core.Test/Files/Identification/CorruptFile.json
Normal file
1400
src/NzbDrone.Core.Test/Files/Identification/CorruptFile.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -4,150 +4,154 @@
|
||||||
"97189482-89ee-4d31-90c7-ba07b412d7f9",
|
"97189482-89ee-4d31-90c7-ba07b412d7f9",
|
||||||
"9105a5b3-eb68-3a03-9aa8-f3495e602a4f"
|
"9105a5b3-eb68-3a03-9aa8-f3495e602a4f"
|
||||||
],
|
],
|
||||||
"metadataProfile": {
|
"libraryArtists": [
|
||||||
"name": "Standard",
|
{
|
||||||
"primaryAlbumTypes": [
|
"artist": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
|
||||||
{
|
"metadataProfile": {
|
||||||
"primaryAlbumType": {
|
"name": "Standard",
|
||||||
"id": 2,
|
"primaryAlbumTypes": [
|
||||||
"name": "Single"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 2,
|
||||||
},
|
"name": "Single"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 4,
|
},
|
||||||
"name": "Other"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 4,
|
||||||
},
|
"name": "Other"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 1,
|
},
|
||||||
"name": "EP"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 1,
|
||||||
},
|
"name": "EP"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 3,
|
},
|
||||||
"name": "Broadcast"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 3,
|
||||||
},
|
"name": "Broadcast"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 0,
|
},
|
||||||
"name": "Album"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 0,
|
||||||
|
"name": "Album"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secondaryAlbumTypes": [
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Studio"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Spokenword"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Soundtrack"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 7,
|
||||||
|
"name": "Remix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 9,
|
||||||
|
"name": "Mixtape/Street"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 6,
|
||||||
|
"name": "Live"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 4,
|
||||||
|
"name": "Interview"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 8,
|
||||||
|
"name": "DJ-mix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 10,
|
||||||
|
"name": "Demo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Compilation"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"releaseStatuses": [
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Pseudo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Promotion"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Official"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Bootleg"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": 1
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
"secondaryAlbumTypes": [
|
],
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Studio"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Spokenword"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Soundtrack"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 7,
|
|
||||||
"name": "Remix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 9,
|
|
||||||
"name": "Mixtape/Street"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 6,
|
|
||||||
"name": "Live"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 4,
|
|
||||||
"name": "Interview"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 8,
|
|
||||||
"name": "DJ-mix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 10,
|
|
||||||
"name": "Demo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Compilation"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"releaseStatuses": [
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Pseudo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Promotion"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Official"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Bootleg"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"artist": "cc2c9c3c-b7bc-4b8b-84d8-4fbd8779e493",
|
|
||||||
"newDownload": false,
|
"newDownload": false,
|
||||||
"singleRelease": false,
|
"singleRelease": false,
|
||||||
"tracks": [
|
"tracks": [
|
||||||
|
|
1226
src/NzbDrone.Core.Test/Files/Identification/FilesWithoutTags.json
Normal file
1226
src/NzbDrone.Core.Test/Files/Identification/FilesWithoutTags.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -2,150 +2,154 @@
|
||||||
"expectedMusicBrainzReleaseIds": [
|
"expectedMusicBrainzReleaseIds": [
|
||||||
"134f5f3e-8b5f-46ab-809d-8c0dbc794f3e"
|
"134f5f3e-8b5f-46ab-809d-8c0dbc794f3e"
|
||||||
],
|
],
|
||||||
"metadataProfile": {
|
"libraryArtists": [
|
||||||
"name": "Standard",
|
{
|
||||||
"primaryAlbumTypes": [
|
"artist": "c296e10c-110a-4103-9e77-47bfebb7fb2e",
|
||||||
{
|
"metadataProfile": {
|
||||||
"primaryAlbumType": {
|
"name": "Standard",
|
||||||
"id": 2,
|
"primaryAlbumTypes": [
|
||||||
"name": "Single"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 2,
|
||||||
},
|
"name": "Single"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 4,
|
},
|
||||||
"name": "Other"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 4,
|
||||||
},
|
"name": "Other"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 1,
|
},
|
||||||
"name": "EP"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 1,
|
||||||
},
|
"name": "EP"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 3,
|
},
|
||||||
"name": "Broadcast"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 3,
|
||||||
},
|
"name": "Broadcast"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 0,
|
},
|
||||||
"name": "Album"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 0,
|
||||||
|
"name": "Album"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secondaryAlbumTypes": [
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Studio"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Spokenword"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Soundtrack"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 7,
|
||||||
|
"name": "Remix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 9,
|
||||||
|
"name": "Mixtape/Street"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 6,
|
||||||
|
"name": "Live"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 4,
|
||||||
|
"name": "Interview"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 8,
|
||||||
|
"name": "DJ-mix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 10,
|
||||||
|
"name": "Demo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Compilation"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"releaseStatuses": [
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Pseudo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Promotion"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Official"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Bootleg"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": 1
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
"secondaryAlbumTypes": [
|
],
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Studio"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Spokenword"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Soundtrack"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 7,
|
|
||||||
"name": "Remix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 9,
|
|
||||||
"name": "Mixtape/Street"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 6,
|
|
||||||
"name": "Live"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 4,
|
|
||||||
"name": "Interview"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 8,
|
|
||||||
"name": "DJ-mix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 10,
|
|
||||||
"name": "Demo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Compilation"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"releaseStatuses": [
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Pseudo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Promotion"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Official"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Bootleg"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"artist": "c296e10c-110a-4103-9e77-47bfebb7fb2e",
|
|
||||||
"newDownload": false,
|
"newDownload": false,
|
||||||
"singleRelease": false,
|
"singleRelease": false,
|
||||||
"tracks": [
|
"tracks": [
|
||||||
|
|
|
@ -2,150 +2,154 @@
|
||||||
"expectedMusicBrainzReleaseIds": [
|
"expectedMusicBrainzReleaseIds": [
|
||||||
"0ce2d66f-e871-415a-9a85-e564f99d4021"
|
"0ce2d66f-e871-415a-9a85-e564f99d4021"
|
||||||
],
|
],
|
||||||
"metadataProfile": {
|
"libraryArtists": [
|
||||||
"name": "Standard",
|
{
|
||||||
"primaryAlbumTypes": [
|
"artist": "7ac055fa-e357-4890-9098-010b8094a900",
|
||||||
{
|
"metadataProfile": {
|
||||||
"primaryAlbumType": {
|
"name": "Standard",
|
||||||
"id": 2,
|
"primaryAlbumTypes": [
|
||||||
"name": "Single"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 2,
|
||||||
},
|
"name": "Single"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": true
|
||||||
"id": 4,
|
},
|
||||||
"name": "Other"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 4,
|
||||||
},
|
"name": "Other"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 1,
|
},
|
||||||
"name": "EP"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 1,
|
||||||
},
|
"name": "EP"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 3,
|
},
|
||||||
"name": "Broadcast"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 3,
|
||||||
},
|
"name": "Broadcast"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 0,
|
},
|
||||||
"name": "Album"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 0,
|
||||||
|
"name": "Album"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secondaryAlbumTypes": [
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Studio"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Spokenword"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Soundtrack"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 7,
|
||||||
|
"name": "Remix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 9,
|
||||||
|
"name": "Mixtape/Street"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 6,
|
||||||
|
"name": "Live"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 4,
|
||||||
|
"name": "Interview"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 8,
|
||||||
|
"name": "DJ-mix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 10,
|
||||||
|
"name": "Demo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Compilation"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"releaseStatuses": [
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Pseudo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Promotion"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Official"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Bootleg"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": 1
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
"secondaryAlbumTypes": [
|
],
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Studio"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Spokenword"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Soundtrack"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 7,
|
|
||||||
"name": "Remix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 9,
|
|
||||||
"name": "Mixtape/Street"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 6,
|
|
||||||
"name": "Live"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 4,
|
|
||||||
"name": "Interview"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 8,
|
|
||||||
"name": "DJ-mix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 10,
|
|
||||||
"name": "Demo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Compilation"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"releaseStatuses": [
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Pseudo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Promotion"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Official"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Bootleg"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"artist": "7ac055fa-e357-4890-9098-010b8094a900",
|
|
||||||
"newDownload": false,
|
"newDownload": false,
|
||||||
"singleRelease": false,
|
"singleRelease": false,
|
||||||
"tracks": [
|
"tracks": [
|
||||||
|
|
|
@ -2,150 +2,154 @@
|
||||||
"expectedMusicBrainzReleaseIds": [
|
"expectedMusicBrainzReleaseIds": [
|
||||||
"25f0fa1b-ae04-479a-a182-18a655ff6040"
|
"25f0fa1b-ae04-479a-a182-18a655ff6040"
|
||||||
],
|
],
|
||||||
"metadataProfile": {
|
"libraryArtists": [
|
||||||
"name": "Album+Single",
|
{
|
||||||
"primaryAlbumTypes": [
|
"artist": "70248960-cb53-4ea4-943a-edb18f7d336f",
|
||||||
{
|
"metadataProfile": {
|
||||||
"primaryAlbumType": {
|
"name": "Album+Single",
|
||||||
"id": 4,
|
"primaryAlbumTypes": [
|
||||||
"name": "Other"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 4,
|
||||||
},
|
"name": "Other"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 3,
|
},
|
||||||
"name": "Broadcast"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 3,
|
||||||
},
|
"name": "Broadcast"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 2,
|
},
|
||||||
"name": "Single"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 2,
|
||||||
},
|
"name": "Single"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": true
|
||||||
"id": 1,
|
},
|
||||||
"name": "EP"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 1,
|
||||||
},
|
"name": "EP"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 0,
|
},
|
||||||
"name": "Album"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 0,
|
||||||
|
"name": "Album"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secondaryAlbumTypes": [
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 10,
|
||||||
|
"name": "Demo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 9,
|
||||||
|
"name": "Mixtape/Street"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 8,
|
||||||
|
"name": "DJ-mix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 7,
|
||||||
|
"name": "Remix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 6,
|
||||||
|
"name": "Live"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 4,
|
||||||
|
"name": "Interview"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Spokenword"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Soundtrack"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Compilation"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Studio"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"releaseStatuses": [
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Pseudo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Bootleg"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Promotion"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Official"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": 2
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
"secondaryAlbumTypes": [
|
],
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 10,
|
|
||||||
"name": "Demo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 9,
|
|
||||||
"name": "Mixtape/Street"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 8,
|
|
||||||
"name": "DJ-mix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 7,
|
|
||||||
"name": "Remix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 6,
|
|
||||||
"name": "Live"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 4,
|
|
||||||
"name": "Interview"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Spokenword"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Soundtrack"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Compilation"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Studio"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"releaseStatuses": [
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Pseudo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Bootleg"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Promotion"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Official"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": 2
|
|
||||||
},
|
|
||||||
"artist": "70248960-cb53-4ea4-943a-edb18f7d336f",
|
|
||||||
"newDownload": true,
|
"newDownload": true,
|
||||||
"singleRelease": false,
|
"singleRelease": false,
|
||||||
"tracks": [
|
"tracks": [
|
||||||
|
|
|
@ -2,150 +2,154 @@
|
||||||
"expectedMusicBrainzReleaseIds": [
|
"expectedMusicBrainzReleaseIds": [
|
||||||
"4e2dd34f-53fe-4d54-b564-b14a2871505e"
|
"4e2dd34f-53fe-4d54-b564-b14a2871505e"
|
||||||
],
|
],
|
||||||
"metadataProfile": {
|
"libraryArtists": [
|
||||||
"name": "Standard",
|
{
|
||||||
"primaryAlbumTypes": [
|
"artist": "6fe07aa5-fec0-4eca-a456-f29bff451b04",
|
||||||
{
|
"metadataProfile": {
|
||||||
"primaryAlbumType": {
|
"name": "Standard",
|
||||||
"id": 2,
|
"primaryAlbumTypes": [
|
||||||
"name": "Single"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 2,
|
||||||
},
|
"name": "Single"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 4,
|
},
|
||||||
"name": "Other"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 4,
|
||||||
},
|
"name": "Other"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 1,
|
},
|
||||||
"name": "EP"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 1,
|
||||||
},
|
"name": "EP"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 3,
|
},
|
||||||
"name": "Broadcast"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": false
|
"id": 3,
|
||||||
},
|
"name": "Broadcast"
|
||||||
{
|
},
|
||||||
"primaryAlbumType": {
|
"allowed": false
|
||||||
"id": 0,
|
},
|
||||||
"name": "Album"
|
{
|
||||||
},
|
"primaryAlbumType": {
|
||||||
"allowed": true
|
"id": 0,
|
||||||
|
"name": "Album"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secondaryAlbumTypes": [
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Studio"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Spokenword"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Soundtrack"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 7,
|
||||||
|
"name": "Remix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 9,
|
||||||
|
"name": "Mixtape/Street"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 6,
|
||||||
|
"name": "Live"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 4,
|
||||||
|
"name": "Interview"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 8,
|
||||||
|
"name": "DJ-mix"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 10,
|
||||||
|
"name": "Demo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"secondaryAlbumType": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Compilation"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"releaseStatuses": [
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 3,
|
||||||
|
"name": "Pseudo"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 1,
|
||||||
|
"name": "Promotion"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 0,
|
||||||
|
"name": "Official"
|
||||||
|
},
|
||||||
|
"allowed": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"releaseStatus": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Bootleg"
|
||||||
|
},
|
||||||
|
"allowed": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": 1
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
"secondaryAlbumTypes": [
|
],
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Studio"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Spokenword"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Soundtrack"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 7,
|
|
||||||
"name": "Remix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 9,
|
|
||||||
"name": "Mixtape/Street"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 6,
|
|
||||||
"name": "Live"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 4,
|
|
||||||
"name": "Interview"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 8,
|
|
||||||
"name": "DJ-mix"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 10,
|
|
||||||
"name": "Demo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"secondaryAlbumType": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Compilation"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"releaseStatuses": [
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 3,
|
|
||||||
"name": "Pseudo"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 1,
|
|
||||||
"name": "Promotion"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "Official"
|
|
||||||
},
|
|
||||||
"allowed": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"releaseStatus": {
|
|
||||||
"id": 2,
|
|
||||||
"name": "Bootleg"
|
|
||||||
},
|
|
||||||
"allowed": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"artist": "6fe07aa5-fec0-4eca-a456-f29bff451b04",
|
|
||||||
"newDownload": false,
|
"newDownload": false,
|
||||||
"singleRelease": false,
|
"singleRelease": false,
|
||||||
"tracks": [
|
"tracks": [
|
||||||
|
|
|
@ -53,13 +53,13 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||||
|
|
||||||
var track = Builder<Track>.CreateListOfSize(10)
|
var track = Builder<Track>.CreateListOfSize(10)
|
||||||
.TheFirst(1)
|
.TheFirst(1)
|
||||||
|
.With(a => a.TrackFileId = files[0].Id)
|
||||||
|
.TheNext(1)
|
||||||
.With(a => a.TrackFileId = files[1].Id)
|
.With(a => a.TrackFileId = files[1].Id)
|
||||||
.TheNext(1)
|
.TheNext(1)
|
||||||
.With(a => a.TrackFileId = files[2].Id)
|
.With(a => a.TrackFileId = files[2].Id)
|
||||||
.TheNext(1)
|
.TheNext(1)
|
||||||
.With(a => a.TrackFileId = files[3].Id)
|
.With(a => a.TrackFileId = files[3].Id)
|
||||||
.TheNext(1)
|
|
||||||
.With(a => a.TrackFileId = files[4].Id)
|
|
||||||
.TheNext(6)
|
.TheNext(6)
|
||||||
.With(a => a.TrackFileId = 0)
|
.With(a => a.TrackFileId = 0)
|
||||||
.All()
|
.All()
|
||||||
|
@ -115,9 +115,15 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||||
{
|
{
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
{
|
{
|
||||||
|
file.Tracks.IsLoaded.Should().BeTrue();
|
||||||
|
file.Tracks.Value.Should().NotBeNull();
|
||||||
|
file.Tracks.Value.Should().NotBeEmpty();
|
||||||
file.Album.IsLoaded.Should().BeTrue();
|
file.Album.IsLoaded.Should().BeTrue();
|
||||||
|
file.Album.Value.Should().NotBeNull();
|
||||||
file.Artist.IsLoaded.Should().BeTrue();
|
file.Artist.IsLoaded.Should().BeTrue();
|
||||||
|
file.Artist.Value.Should().NotBeNull();
|
||||||
file.Artist.Value.Metadata.IsLoaded.Should().BeTrue();
|
file.Artist.Value.Metadata.IsLoaded.Should().BeTrue();
|
||||||
|
file.Artist.Value.Metadata.Value.Should().NotBeNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
.With(x => x.RecordingMBId = track.ForeignRecordingId)
|
.With(x => x.RecordingMBId = track.ForeignRecordingId)
|
||||||
.With(x => x.Country = IsoCountries.Find("US"))
|
.With(x => x.Country = IsoCountries.Find("US"))
|
||||||
.With(x => x.Label = release.Label.First())
|
.With(x => x.Label = release.Label.First())
|
||||||
.With(x => x.Year = (uint)release.Album.Value.ReleaseDate.Value.Year)
|
.With(x => x.Year = (uint)(release.Album.Value.ReleaseDate?.Year ?? 0))
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
var localTrack = Builder<LocalTrack>
|
var localTrack = Builder<LocalTrack>
|
||||||
|
@ -212,5 +212,53 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
|
|
||||||
Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
|
Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DateTime?[] dates = new DateTime?[] { null, new DateTime(2007, 1, 1), DateTime.Now };
|
||||||
|
|
||||||
|
[TestCaseSource("dates")]
|
||||||
|
public void test_null_album_year(DateTime? releaseDate)
|
||||||
|
{
|
||||||
|
var tracks = GivenTracks(3);
|
||||||
|
var release = GivenAlbumRelease("album", tracks);
|
||||||
|
var localTracks = GivenLocalTracks(tracks, release);
|
||||||
|
var mapping = GivenMapping(localTracks, tracks);
|
||||||
|
|
||||||
|
release.Album.Value.ReleaseDate = null;
|
||||||
|
release.ReleaseDate = releaseDate;
|
||||||
|
|
||||||
|
var result = Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance();
|
||||||
|
|
||||||
|
if (!releaseDate.HasValue || (localTracks[0].FileTrackInfo.Year == (releaseDate?.Year ?? 0)))
|
||||||
|
{
|
||||||
|
result.Should().Be(0.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.Should().NotBe(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCaseSource("dates")]
|
||||||
|
public void test_null_release_year(DateTime? albumDate)
|
||||||
|
{
|
||||||
|
var tracks = GivenTracks(3);
|
||||||
|
var release = GivenAlbumRelease("album", tracks);
|
||||||
|
var localTracks = GivenLocalTracks(tracks, release);
|
||||||
|
var mapping = GivenMapping(localTracks, tracks);
|
||||||
|
|
||||||
|
release.Album.Value.ReleaseDate = albumDate;
|
||||||
|
release.ReleaseDate = null;
|
||||||
|
|
||||||
|
var result = Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance();
|
||||||
|
|
||||||
|
if (!albumDate.HasValue || (localTracks[0].FileTrackInfo.Year == (albumDate?.Year ?? 0)))
|
||||||
|
{
|
||||||
|
result.Should().Be(0.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.Should().NotBe(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,11 @@ using NzbDrone.Core.Parser.Model;
|
||||||
using NzbDrone.Core.Profiles.Metadata;
|
using NzbDrone.Core.Profiles.Metadata;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using NzbDrone.Common.Serializer;
|
||||||
|
using NzbDrone.Core.Parser;
|
||||||
|
using NzbDrone.Core.MediaFiles.TrackImport.Aggregation.Aggregators;
|
||||||
|
using NzbDrone.Core.MediaFiles.TrackImport.Aggregation;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
{
|
{
|
||||||
|
@ -62,23 +67,45 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
Mocker.GetMock<IAddArtistValidator>().Setup(x => x.Validate(It.IsAny<Artist>())).Returns(new ValidationResult());
|
Mocker.GetMock<IAddArtistValidator>().Setup(x => x.Validate(It.IsAny<Artist>())).Returns(new ValidationResult());
|
||||||
|
|
||||||
Mocker.SetConstant<ITrackGroupingService>(Mocker.Resolve<TrackGroupingService>());
|
Mocker.SetConstant<ITrackGroupingService>(Mocker.Resolve<TrackGroupingService>());
|
||||||
|
|
||||||
|
// set up the augmenters
|
||||||
|
List<IAggregate<LocalAlbumRelease>> aggregators = new List<IAggregate<LocalAlbumRelease>> {
|
||||||
|
Mocker.Resolve<AggregateFilenameInfo>()
|
||||||
|
};
|
||||||
|
Mocker.SetConstant<IEnumerable<IAggregate<LocalAlbumRelease>>>(aggregators);
|
||||||
|
Mocker.SetConstant<IAugmentingService>(Mocker.Resolve<AugmentingService>());
|
||||||
|
|
||||||
Subject = Mocker.Resolve<IdentificationService>();
|
Subject = Mocker.Resolve<IdentificationService>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GivenMetadataProfile(MetadataProfile profile)
|
private void GivenMetadataProfile(MetadataProfile profile)
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IMetadataProfileService>().Setup(x => x.Get(It.IsAny<int>())).Returns(profile);
|
Mocker.GetMock<IMetadataProfileService>().Setup(x => x.Get(profile.Id)).Returns(profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Artist GivenArtist(string foreignArtistId)
|
private List<Artist> GivenArtists(List<ArtistTestCase> artists)
|
||||||
|
{
|
||||||
|
var outp = new List<Artist>();
|
||||||
|
for (int i = 0; i < artists.Count; i++)
|
||||||
|
{
|
||||||
|
var meta = artists[i].MetadataProfile;
|
||||||
|
meta.Id = i + 1;
|
||||||
|
GivenMetadataProfile(meta);
|
||||||
|
outp.Add(GivenArtist(artists[i].Artist, meta.Id));
|
||||||
|
}
|
||||||
|
|
||||||
|
return outp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artist GivenArtist(string foreignArtistId, int metadataProfileId)
|
||||||
{
|
{
|
||||||
var artist = _addArtistService.AddArtist(new Artist {
|
var artist = _addArtistService.AddArtist(new Artist {
|
||||||
Metadata = new ArtistMetadata {
|
Metadata = new ArtistMetadata {
|
||||||
ForeignArtistId = foreignArtistId
|
ForeignArtistId = foreignArtistId
|
||||||
},
|
},
|
||||||
Path = @"c:\test".AsOsAgnostic(),
|
Path = @"c:\test".AsOsAgnostic(),
|
||||||
MetadataProfileId = 1
|
MetadataProfileId = metadataProfileId
|
||||||
});
|
});
|
||||||
|
|
||||||
var command = new RefreshArtistCommand{
|
var command = new RefreshArtistCommand{
|
||||||
|
@ -91,6 +118,18 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
return _artistService.FindById(foreignArtistId);
|
return _artistService.FindById(foreignArtistId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GivenFingerprints(List<AcoustIdTestCase> fingerprints)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<IConfigService>().Setup(x => x.AllowFingerprinting).Returns(AllowFingerprinting.AllFiles);
|
||||||
|
Mocker.GetMock<IFingerprintingService>().Setup(x => x.IsSetup()).Returns(true);
|
||||||
|
|
||||||
|
Mocker.GetMock<IFingerprintingService>()
|
||||||
|
.Setup(x => x.Lookup(It.IsAny<List<LocalTrack>>(), It.IsAny<double>()))
|
||||||
|
.Callback((List<LocalTrack> track, double thres) => {
|
||||||
|
track.ForEach(x => x.AcoustIdResults = fingerprints.SingleOrDefault(f => f.Path == x.Path).AcoustIdResults);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static class IdTestCaseFactory
|
public static class IdTestCaseFactory
|
||||||
{
|
{
|
||||||
// for some reason using Directory.GetFiles causes nUnit to error
|
// for some reason using Directory.GetFiles causes nUnit to error
|
||||||
|
@ -99,7 +138,9 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
"PreferMissingToBadMatch.json",
|
"PreferMissingToBadMatch.json",
|
||||||
"InconsistentTyposInAlbum.json",
|
"InconsistentTyposInAlbum.json",
|
||||||
"SucceedWhenManyAlbumsHaveSameTitle.json",
|
"SucceedWhenManyAlbumsHaveSameTitle.json",
|
||||||
"PenalizeUnknownMedia.json"
|
"PenalizeUnknownMedia.json",
|
||||||
|
"CorruptFile.json",
|
||||||
|
"FilesWithoutTags.json"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static IEnumerable TestCases
|
public static IEnumerable TestCases
|
||||||
|
@ -122,19 +163,25 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Identification", file);
|
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Identification", file);
|
||||||
var testcase = JsonConvert.DeserializeObject<IdTestCase>(File.ReadAllText(path));
|
var testcase = JsonConvert.DeserializeObject<IdTestCase>(File.ReadAllText(path));
|
||||||
|
|
||||||
GivenMetadataProfile(testcase.MetadataProfile);
|
var artists = GivenArtists(testcase.LibraryArtists);
|
||||||
|
var specifiedArtist = artists.SingleOrDefault(x => x.Metadata.Value.ForeignArtistId == testcase.Artist);
|
||||||
var artist = GivenArtist(testcase.Artist);
|
|
||||||
|
|
||||||
var tracks = testcase.Tracks.Select(x => new LocalTrack {
|
var tracks = testcase.Tracks.Select(x => new LocalTrack {
|
||||||
Path = x.Path.AsOsAgnostic(),
|
Path = x.Path.AsOsAgnostic(),
|
||||||
FileTrackInfo = x.FileTrackInfo
|
FileTrackInfo = x.FileTrackInfo
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var result = Subject.Identify(tracks, artist, null, null, testcase.NewDownload, testcase.SingleRelease);
|
if (testcase.Fingerprints != null)
|
||||||
|
{
|
||||||
|
GivenFingerprints(testcase.Fingerprints);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = Subject.Identify(tracks, specifiedArtist, null, null, testcase.NewDownload, testcase.SingleRelease);
|
||||||
|
|
||||||
|
TestLogger.Debug($"Found releases:\n{result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease?.ForeignReleaseId).ToJson()}");
|
||||||
|
|
||||||
result.Should().HaveCount(testcase.ExpectedMusicBrainzReleaseIds.Count);
|
result.Should().HaveCount(testcase.ExpectedMusicBrainzReleaseIds.Count);
|
||||||
result.Select(x => x.AlbumRelease.ForeignReleaseId).ShouldBeEquivalentTo(testcase.ExpectedMusicBrainzReleaseIds);
|
result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease.ForeignReleaseId).ShouldBeEquivalentTo(testcase.ExpectedMusicBrainzReleaseIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
|
|
||||||
protected override string GetString(MemberInfo memberInfo)
|
protected override string GetString(MemberInfo memberInfo)
|
||||||
{
|
{
|
||||||
int length = generator.Next(0, 100);
|
int length = generator.Next(1, 100);
|
||||||
|
|
||||||
char[] chars = new char[length];
|
char[] chars = new char[length];
|
||||||
|
|
||||||
|
@ -102,6 +102,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
return outp;
|
return outp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Repeat(100)]
|
||||||
private List<LocalTrack> GivenVaTracks(string root, string album, int count)
|
private List<LocalTrack> GivenVaTracks(string root, string album, int count)
|
||||||
{
|
{
|
||||||
var settings = new BuilderSettings();
|
var settings = new BuilderSettings();
|
||||||
|
@ -135,7 +136,9 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GivenVaTracks uses random names so repeat multiple times to try to prompt any intermittent failures
|
||||||
[Test]
|
[Test]
|
||||||
|
[Repeat(100)]
|
||||||
public void all_different_artists_is_various_artists()
|
public void all_different_artists_is_various_artists()
|
||||||
{
|
{
|
||||||
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
||||||
|
@ -153,6 +156,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Repeat(100)]
|
||||||
public void mostly_different_artists_is_various_artists()
|
public void mostly_different_artists_is_various_artists()
|
||||||
{
|
{
|
||||||
var dir = @"C:\music\incoming".AsOsAgnostic();
|
var dir = @"C:\music\incoming".AsOsAgnostic();
|
||||||
|
@ -172,6 +176,16 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(true);
|
TrackGroupingService.IsVariousArtists(tracks).Should().Be(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase("Va?!")]
|
||||||
|
[TestCase("Va Va Voom")]
|
||||||
|
[TestCase("V.A. Jr.")]
|
||||||
|
[TestCase("Ca Va")]
|
||||||
|
public void va_in_artist_name_is_not_various_artists(string artist)
|
||||||
|
{
|
||||||
|
var tracks = GivenTracks(@"C:\music\incoming".AsOsAgnostic(), artist, "album", 10);
|
||||||
|
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||||
|
}
|
||||||
|
|
||||||
[TestCase(1)]
|
[TestCase(1)]
|
||||||
[TestCase(2)]
|
[TestCase(2)]
|
||||||
[TestCase(10)]
|
[TestCase(10)]
|
||||||
|
@ -308,6 +322,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Repeat(100)]
|
||||||
public void should_group_va_release()
|
public void should_group_va_release()
|
||||||
{
|
{
|
||||||
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
||||||
|
@ -365,5 +380,29 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||||
output.Count.Should().Be(1);
|
output.Count.Should().Be(1);
|
||||||
output[0].LocalTracks.Count.Should().Be(12);
|
output[0].LocalTracks.Count.Should().Be(12);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_cope_with_one_album_in_subfolder_of_another()
|
||||||
|
{
|
||||||
|
var tracks = GivenTracks($"C:\\music\\incoming\\album".AsOsAgnostic(),
|
||||||
|
"artist1", "album", 10);
|
||||||
|
tracks.AddRange(GivenTracks($"C:\\music\\incoming\\album\\anotheralbum".AsOsAgnostic(),
|
||||||
|
"artist2", "album2", 10));
|
||||||
|
|
||||||
|
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||||
|
TrackGroupingService.LooksLikeSingleRelease(tracks).Should().Be(false);
|
||||||
|
|
||||||
|
var output = Subject.GroupTracks(tracks);
|
||||||
|
|
||||||
|
foreach(var group in output)
|
||||||
|
{
|
||||||
|
TestLogger.Debug($"*** group {group} ***");
|
||||||
|
TestLogger.Debug(string.Join("\n", group.LocalTracks.Select(x => x.Path)));
|
||||||
|
}
|
||||||
|
|
||||||
|
output.Count.Should().Be(2);
|
||||||
|
output[0].LocalTracks.Count.Should().Be(10);
|
||||||
|
output[1].LocalTracks.Count.Should().Be(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,5 +128,58 @@ FINGERPRINT=AQAHJlMURlEURcgP6cwRD43Y4Ptw9FowncWPWkf6GB9-JYdP9OgJHw8u4Apw4SsOHMdx
|
||||||
files[0].AcoustIdResults.Should().BeNull();
|
files[0].AcoustIdResults.Should().BeNull();
|
||||||
files[1].AcoustIdResults.Should().BeNull();
|
files[1].AcoustIdResults.Should().BeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_fail_if_duration_reported_as_zero()
|
||||||
|
{
|
||||||
|
UseRealHttp();
|
||||||
|
|
||||||
|
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Media", "missing.mp3");
|
||||||
|
var localTrack = new LocalTrack { Path = path };
|
||||||
|
var acoustId = new AcoustId {
|
||||||
|
Duration = 0,
|
||||||
|
Fingerprint = "fingerprint"
|
||||||
|
};
|
||||||
|
|
||||||
|
Subject.Lookup(new List<Tuple<LocalTrack, AcoustId>> { Tuple.Create(localTrack, acoustId)}, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_throw_if_fingerprint_invalid()
|
||||||
|
{
|
||||||
|
UseRealHttp();
|
||||||
|
|
||||||
|
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Media", "missing.mp3");
|
||||||
|
var localTrack = new LocalTrack { Path = path };
|
||||||
|
var acoustId = new AcoustId {
|
||||||
|
Duration = 1,
|
||||||
|
Fingerprint = "fingerprint"
|
||||||
|
};
|
||||||
|
|
||||||
|
var files = new List<Tuple<LocalTrack, AcoustId>> { Tuple.Create(localTrack, acoustId)};
|
||||||
|
Subject.Lookup(files, 0.5);
|
||||||
|
files[0].Item1.AcoustIdResults.Should().BeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_fail_for_some_invalid_fingerprints()
|
||||||
|
{
|
||||||
|
UseRealHttp();
|
||||||
|
|
||||||
|
var files = new [] {
|
||||||
|
"nin.mp3",
|
||||||
|
"nin.flac"
|
||||||
|
}.Select(x => new LocalTrack { Path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Media", x) }).ToList();
|
||||||
|
|
||||||
|
var idpairs = files.Select(x => Tuple.Create(x, Subject.GetFingerprint(x.Path))).ToList();
|
||||||
|
|
||||||
|
idpairs.Add(Tuple.Create(new LocalTrack(), new AcoustId { Duration = 1, Fingerprint = "fingerprint" }));
|
||||||
|
|
||||||
|
Subject.Lookup(idpairs, 0.5);
|
||||||
|
|
||||||
|
idpairs[0].Item1.AcoustIdResults.Should().Contain("30f3f33e-8d0c-4e69-8539-cbd701d18f28");
|
||||||
|
idpairs[1].Item1.AcoustIdResults.Should().Contain("30f3f33e-8d0c-4e69-8539-cbd701d18f28");
|
||||||
|
idpairs[2].Item1.AcoustIdResults.Should().BeNull();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,12 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
});
|
});
|
||||||
var options = new IdTestCase {
|
var options = new IdTestCase {
|
||||||
ExpectedMusicBrainzReleaseIds = new List<string> {"expected-id-1", "expected-id-2", "..."},
|
ExpectedMusicBrainzReleaseIds = new List<string> {"expected-id-1", "expected-id-2", "..."},
|
||||||
MetadataProfile = artist?.MetadataProfile.Value,
|
LibraryArtists = new List<ArtistTestCase> {
|
||||||
|
new ArtistTestCase {
|
||||||
|
Artist = artist?.Metadata.Value.ForeignArtistId ?? "expected-artist-id (dev: don't forget to add metadata profile)",
|
||||||
|
MetadataProfile = artist?.MetadataProfile.Value
|
||||||
|
}
|
||||||
|
},
|
||||||
Artist = artist?.Metadata.Value.ForeignArtistId,
|
Artist = artist?.Metadata.Value.ForeignArtistId,
|
||||||
Album = album?.ForeignAlbumId,
|
Album = album?.ForeignAlbumId,
|
||||||
Release = release?.ForeignReleaseId,
|
Release = release?.ForeignReleaseId,
|
||||||
|
@ -400,8 +405,12 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
result.Mapping.Add(localTracks[pair.Item1], Tuple.Create(mbTracks[pair.Item2], distances[pair.Item1, pair.Item2]));
|
result.Mapping.Add(localTracks[pair.Item1], Tuple.Create(mbTracks[pair.Item2], distances[pair.Item1, pair.Item2]));
|
||||||
_logger.Trace("Mapped {0} to {1}, dist: {2}", localTracks[pair.Item1], mbTracks[pair.Item2], costs[pair.Item1, pair.Item2]);
|
_logger.Trace("Mapped {0} to {1}, dist: {2}", localTracks[pair.Item1], mbTracks[pair.Item2], costs[pair.Item1, pair.Item2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.LocalExtra = localTracks.Except(result.Mapping.Keys).ToList();
|
result.LocalExtra = localTracks.Except(result.Mapping.Keys).ToList();
|
||||||
|
_logger.Trace($"Unmapped files:\n{string.Join("\n", result.LocalExtra)}");
|
||||||
|
|
||||||
result.MBExtra = mbTracks.Except(result.Mapping.Values.Select(x => x.Item1)).ToList();
|
result.MBExtra = mbTracks.Except(result.Mapping.Values.Select(x => x.Item1)).ToList();
|
||||||
|
_logger.Trace($"Missing tracks:\n{string.Join("\n", result.MBExtra)}");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -435,7 +444,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
dist.AddString("track_artist", localTrack.FileTrackInfo.ArtistTitle, mbTrack.ArtistMetadata.Value.Name);
|
dist.AddString("track_artist", localTrack.FileTrackInfo.ArtistTitle, mbTrack.ArtistMetadata.Value.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (localTrack.FileTrackInfo.TrackNumbers[0] > 0 && mbTrack.AbsoluteTrackNumber > 0)
|
if (localTrack.FileTrackInfo.TrackNumbers.FirstOrDefault() > 0 && mbTrack.AbsoluteTrackNumber > 0)
|
||||||
{
|
{
|
||||||
dist.AddBool("track_index", TrackIndexIncorrect(localTrack, mbTrack, totalTrackNumber));
|
dist.AddBool("track_index", TrackIndexIncorrect(localTrack, mbTrack, totalTrackNumber));
|
||||||
}
|
}
|
||||||
|
@ -489,21 +498,22 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
|
|
||||||
// Year
|
// Year
|
||||||
var localYear = MostCommon(localTracks.Select(x => x.FileTrackInfo.Year));
|
var localYear = MostCommon(localTracks.Select(x => x.FileTrackInfo.Year));
|
||||||
if (localYear > 0 && release.Album.Value.ReleaseDate.HasValue)
|
if (localYear > 0 && (release.Album.Value.ReleaseDate.HasValue || release.ReleaseDate.HasValue))
|
||||||
{
|
{
|
||||||
var albumYear = release.Album.Value.ReleaseDate.Value.Year;
|
var albumYear = release.Album.Value.ReleaseDate?.Year ?? 0;
|
||||||
var releaseYear = release.ReleaseDate.Value.Year;
|
var releaseYear = release.ReleaseDate?.Year ?? 0;
|
||||||
if (localYear == albumYear || localYear == releaseYear)
|
if (localYear == albumYear || localYear == releaseYear)
|
||||||
{
|
{
|
||||||
dist.Add("year", 0.0);
|
dist.Add("year", 0.0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var diff = Math.Abs(localYear - albumYear);
|
var remoteYear = albumYear > 0 ? albumYear : releaseYear;
|
||||||
var diff_max = Math.Abs(DateTime.Now.Year - albumYear);
|
var diff = Math.Abs(localYear - remoteYear);
|
||||||
|
var diff_max = Math.Abs(DateTime.Now.Year - remoteYear);
|
||||||
dist.AddRatio("year", diff, diff_max);
|
dist.AddRatio("year", diff, diff_max);
|
||||||
}
|
}
|
||||||
_logger.Trace("year: {0} vs {1}; {2}", localYear, release.Album.Value.ReleaseDate?.Year, dist.NormalizedDistance());
|
_logger.Trace($"year: {localYear} vs {release.Album.Value.ReleaseDate?.Year} or {release.ReleaseDate?.Year}; {dist.NormalizedDistance()}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we parsed a country from the files use that, otherwise use our preference
|
// If we parsed a country from the files use that, otherwise use our preference
|
||||||
|
@ -513,7 +523,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
if (country != null)
|
if (country != null)
|
||||||
{
|
{
|
||||||
dist.AddEquality("country", country.Name, release.Country);
|
dist.AddEquality("country", country.Name, release.Country);
|
||||||
_logger.Trace("country: {0} vs {1}; {2}", country, string.Join(", ", release.Country), dist.NormalizedDistance());
|
_logger.Trace("country: {0} vs {1}; {2}", country.Name, string.Join(", ", release.Country), dist.NormalizedDistance());
|
||||||
}
|
}
|
||||||
else if (preferredCountries.Count > 0)
|
else if (preferredCountries.Count > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,17 +9,30 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public ParsedTrackInfo FileTrackInfo { get; set; }
|
public ParsedTrackInfo FileTrackInfo { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ArtistTestCase
|
||||||
|
{
|
||||||
|
public string Artist { get; set; }
|
||||||
|
public MetadataProfile MetadataProfile { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AcoustIdTestCase
|
||||||
|
{
|
||||||
|
public string Path { get; set; }
|
||||||
|
public List<string> AcoustIdResults { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class IdTestCase
|
public class IdTestCase
|
||||||
{
|
{
|
||||||
public List<string> ExpectedMusicBrainzReleaseIds { get; set; }
|
public List<string> ExpectedMusicBrainzReleaseIds { get; set; }
|
||||||
public MetadataProfile MetadataProfile { get; set; }
|
public List<ArtistTestCase> LibraryArtists { get; set; }
|
||||||
public string Artist { get; set; }
|
public string Artist { get; set; }
|
||||||
public string Album { get; set; }
|
public string Album { get; set; }
|
||||||
public string Release { get; set; }
|
public string Release { get; set; }
|
||||||
public bool NewDownload { get; set; }
|
public bool NewDownload { get; set; }
|
||||||
public bool SingleRelease { get; set; }
|
public bool SingleRelease { get; set; }
|
||||||
public List<BasicLocalTrack> Tracks { get; set; }
|
public List<BasicLocalTrack> Tracks { get; set; }
|
||||||
|
public List<AcoustIdTestCase> Fingerprints { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Instrumentation;
|
using NzbDrone.Common.Instrumentation;
|
||||||
using NzbDrone.Core.Parser.Model;
|
using NzbDrone.Core.Parser.Model;
|
||||||
|
@ -207,7 +208,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Identification
|
||||||
|
|
||||||
// reset and put current folder into output
|
// reset and put current folder into output
|
||||||
subdirRegex = null;
|
subdirRegex = null;
|
||||||
output.AddRange(tracks.Where(x => x.Path.StartsWith(folder)));
|
output.AddRange(tracks.Where(x => PathEqualityComparer.Instance.Equals(Path.GetDirectoryName(x.Path), folder)));
|
||||||
|
|
||||||
// check if the start of another multi disc match
|
// check if the start of another multi disc match
|
||||||
foreach (var marker in multiDiscMarkers)
|
foreach (var marker in multiDiscMarkers)
|
||||||
|
|
|
@ -13,6 +13,7 @@ using System;
|
||||||
using NzbDrone.Common.EnvironmentInfo;
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Parser
|
namespace NzbDrone.Core.Parser
|
||||||
{
|
{
|
||||||
|
@ -337,19 +338,25 @@ namespace NzbDrone.Core.Parser
|
||||||
httpRequest.SetContent(Compress(Encoding.UTF8.GetBytes(sb.ToString())));
|
httpRequest.SetContent(Compress(Encoding.UTF8.GetBytes(sb.ToString())));
|
||||||
httpRequest.Headers.Add("Content-Encoding", "gzip");
|
httpRequest.Headers.Add("Content-Encoding", "gzip");
|
||||||
httpRequest.Headers.ContentType = "application/x-www-form-urlencoded";
|
httpRequest.Headers.ContentType = "application/x-www-form-urlencoded";
|
||||||
|
httpRequest.SuppressHttpError = true;
|
||||||
|
|
||||||
var httpResponse = _httpClient.Post<LookupResponse>(httpRequest);
|
var httpResponse = _httpClient.Post<LookupResponse>(httpRequest);
|
||||||
|
|
||||||
if (httpResponse.HasHttpError)
|
|
||||||
{
|
|
||||||
throw new HttpException(httpRequest, httpResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
var response = httpResponse.Resource;
|
var response = httpResponse.Resource;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(response.ErrorMessage))
|
// The API will give errors if fingerprint isn't found or is invalid.
|
||||||
|
// We don't want to stop the entire import because the fingerprinting failed
|
||||||
|
// so just log and return.
|
||||||
|
if (httpResponse.HasHttpError || (response != null && response.Status != "ok"))
|
||||||
{
|
{
|
||||||
_logger.Debug("Webservice error: {0}", response.ErrorMessage);
|
if (response != null && response.Error != null)
|
||||||
|
{
|
||||||
|
_logger.Debug($"Webservice error {response.Error.Code}: {response.Error.Message}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.Warn("HTTP Error - {0}", httpResponse);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,15 +380,26 @@ namespace NzbDrone.Core.Parser
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Debug("Fingerprinting complete.");
|
_logger.Debug("Fingerprinting complete.");
|
||||||
|
|
||||||
|
var SerializerSettings = Json.GetSerializerSettings();
|
||||||
|
SerializerSettings.Formatting = Formatting.None;
|
||||||
|
var output = new { Fingerprints = toLookup.Select(x => new { Path = x.Item1.Path, AcoustIdResults = x.Item1.AcoustIdResults }) };
|
||||||
|
_logger.Debug($"*** FingerprintingService TestCaseGenerator ***\n{JsonConvert.SerializeObject(output, SerializerSettings)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private class LookupResponse
|
private class LookupResponse
|
||||||
{
|
{
|
||||||
public string StatusCode { get; set; }
|
public string Status { get; set; }
|
||||||
public string ErrorMessage { get; set; }
|
public LookupError Error { get; set; }
|
||||||
public List<LookupResultListItem> Fingerprints { get; set; }
|
public List<LookupResultListItem> Fingerprints { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class LookupError
|
||||||
|
{
|
||||||
|
public string Message { get; set; }
|
||||||
|
public int Code { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
private class LookupResultListItem
|
private class LookupResultListItem
|
||||||
{
|
{
|
||||||
public int index { get; set; }
|
public int index { get; set; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue