diff --git a/src/NzbDrone.Core.Test/ParserTests/FingerprintingServiceFixture.cs b/src/NzbDrone.Core.Test/ParserTests/FingerprintingServiceFixture.cs index cda3b4a8f..e004d6a1a 100644 --- a/src/NzbDrone.Core.Test/ParserTests/FingerprintingServiceFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/FingerprintingServiceFixture.cs @@ -7,6 +7,11 @@ using System.IO; using System.Linq; using NzbDrone.Core.Parser.Model; using System; +using NzbDrone.Common.Http; +using Moq; +using static NzbDrone.Core.Parser.FingerprintingService; +using NzbDrone.Test.Common; +using System.Net; namespace NzbDrone.Core.Test.ParserTests { @@ -181,5 +186,19 @@ FINGERPRINT=AQAHJlMURlEURcgP6cwRD43Y4Ptw9FowncWPWkf6GB9-JYdP9OgJHw8u4Apw4SsOHMdx idpairs[1].Item1.AcoustIdResults.Should().Contain("30f3f33e-8d0c-4e69-8539-cbd701d18f28"); idpairs[2].Item1.AcoustIdResults.Should().BeNull(); } + + [Test] + public void should_not_throw_if_api_returns_html() + { + Mocker.GetMock().Setup(x => x.Post(It.IsAny())) + .Callback(req => throw new UnexpectedHtmlContentException(new HttpResponse(req, req.Headers, "html content", HttpStatusCode.Accepted))); + + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Media", "nin.mp3"); + var localTrack = new LocalTrack { Path = path }; + Subject.Lookup(new List { localTrack }, 0.5); + localTrack.AcoustIdResults.Should().BeNull(); + + ExceptionVerification.ExpectedWarns(1); + } } } diff --git a/src/NzbDrone.Core/Parser/FingerprintingService.cs b/src/NzbDrone.Core/Parser/FingerprintingService.cs index ee8a041aa..150051336 100644 --- a/src/NzbDrone.Core/Parser/FingerprintingService.cs +++ b/src/NzbDrone.Core/Parser/FingerprintingService.cs @@ -360,7 +360,18 @@ namespace NzbDrone.Core.Parser httpRequest.Headers.ContentType = "application/x-www-form-urlencoded"; httpRequest.SuppressHttpError = true; - var httpResponse = _httpClient.Post(httpRequest); + HttpResponse httpResponse; + + try + { + httpResponse = _httpClient.Post(httpRequest); + } + catch (UnexpectedHtmlContentException e) + { + _logger.Warn(e, "AcoustId API gave invalid response"); + return; + } + var response = httpResponse.Resource; // The API will give errors if fingerprint isn't found or is invalid. @@ -407,33 +418,33 @@ namespace NzbDrone.Core.Parser _logger.Debug($"*** FingerprintingService TestCaseGenerator ***\n{JsonConvert.SerializeObject(output, SerializerSettings)}"); } - private class LookupResponse + public class LookupResponse { public string Status { get; set; } public LookupError Error { get; set; } public List Fingerprints { get; set; } } - private class LookupError + public class LookupError { public string Message { get; set; } public int Code { get; set; } } - private class LookupResultListItem + public class LookupResultListItem { public int index { get; set; } public List Results { get; set; } } - private class LookupResult + public class LookupResult { public string Id { get; set; } public double Score { get; set; } public List Recordings { get; set; } } - private class RecordingResult + public class RecordingResult { public string Id { get; set; } }