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:
ta264 2019-02-20 01:16:09 +00:00 committed by Qstick
commit 6cfc591364
17 changed files with 3641 additions and 763 deletions

View file

@ -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);
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -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": [

File diff suppressed because it is too large Load diff

View file

@ -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": [

View file

@ -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": [

View file

@ -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": [

View file

@ -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": [

View file

@ -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();
} }
} }
} }

View file

@ -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);
}
}
} }
} }

View file

@ -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);
} }
} }
} }

View file

@ -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);
}
} }
} }

View file

@ -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();
}
} }
} }

View file

@ -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)
{ {

View file

@ -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; }
} }
} }

View file

@ -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)

View file

@ -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; }