diff --git a/src/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs b/src/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs index 1cba3766c..c03aa8624 100644 --- a/src/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/MediaCoverTests/CoverExistsSpecificationFixture.cs @@ -11,41 +11,46 @@ namespace NzbDrone.Core.Test.MediaCoverTests [TestFixture] public class CoverAlreadyExistsSpecificationFixture : CoreTest { - private void GivenFileExistsOnDisk() + private void GivenFileExistsOnDisk(DateTime? givenDate) { Mocker.GetMock().Setup(c => c.FileExists(It.IsAny())).Returns(true); + Mocker.GetMock().Setup(c => c.FileGetLastWrite(It.IsAny())).Returns(givenDate ?? DateTime.Now); + Mocker.GetMock().Setup(c => c.GetFileSize(It.IsAny())).Returns(1000); } - - private void GivenExistingFileDate(DateTime lastModifiedDate) + [Test] + public void should_return_false_if_file_not_exists() { - GivenFileExistsOnDisk(); - Mocker.GetMock().Setup(c => c.FileGetLastWrite(It.IsAny())).Returns(lastModifiedDate); + Mocker.GetMock().Setup(c => c.FileExists(It.IsAny())).Returns(false); + Subject.AlreadyExists(DateTime.Now, 0, "c:\\file.exe").Should().BeFalse(); } [Test] - public void should_return_false_if_file_not_exists() + public void should_return_false_if_file_exists_but_diffrent_date() { - Subject.AlreadyExists(DateTime.Now, "c:\\file.exe").Should().BeFalse(); + GivenFileExistsOnDisk(DateTime.Now); + + Subject.AlreadyExists(DateTime.Now.AddHours(-5), 0, "c:\\file.exe").Should().BeFalse(); } [Test] - public void should_return_false_if_file_exists_but_diffrent_date() + public void should_return_ture_if_file_exists_and_same_date_but_no_length_header() { - GivenExistingFileDate(DateTime.Now); + var givenDate = DateTime.Now; - Subject.AlreadyExists(DateTime.Now.AddHours(-5), "c:\\file.exe").Should().BeFalse(); + GivenFileExistsOnDisk(givenDate); + + Subject.AlreadyExists(givenDate, null, "c:\\file.exe").Should().BeTrue(); } [Test] - public void should_return_ture_if_file_exists_and_same_date() + public void should_return_ture_if_file_exists_and_date_header_is_null_but_has_length_header() { - var givenDate = DateTime.Now; - GivenExistingFileDate(givenDate); + GivenFileExistsOnDisk(DateTime.Now); - Subject.AlreadyExists(givenDate, "c:\\file.exe").Should().BeTrue(); + Subject.AlreadyExists(null, 1000, "c:\\file.exe").Should().BeTrue(); } } } diff --git a/src/NzbDrone.Core.Test/MediaCoverTests/MediaCoverServiceFixture.cs b/src/NzbDrone.Core.Test/MediaCoverTests/MediaCoverServiceFixture.cs index 3a9ccab3a..814226af0 100644 --- a/src/NzbDrone.Core.Test/MediaCoverTests/MediaCoverServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaCoverTests/MediaCoverServiceFixture.cs @@ -100,7 +100,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_resize_covers_if_main_downloaded() { Mocker.GetMock() - .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny())) + .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(false); Mocker.GetMock() @@ -121,7 +121,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_resize_covers_if_missing() { Mocker.GetMock() - .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny())) + .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(true); Mocker.GetMock() @@ -142,7 +142,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_not_resize_covers_if_exists() { Mocker.GetMock() - .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny())) + .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(true); Mocker.GetMock() @@ -167,7 +167,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_resize_covers_if_existing_is_empty() { Mocker.GetMock() - .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny())) + .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(true); Mocker.GetMock() @@ -192,7 +192,7 @@ namespace NzbDrone.Core.Test.MediaCoverTests public void should_log_error_if_resize_failed() { Mocker.GetMock() - .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny())) + .Setup(v => v.AlreadyExists(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(true); Mocker.GetMock() diff --git a/src/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs b/src/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs index fa97604f9..e5c4bd127 100644 --- a/src/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs +++ b/src/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs @@ -1,11 +1,12 @@ -using System; +using System; using NzbDrone.Common.Disk; +using NzbDrone.Common.Http; namespace NzbDrone.Core.MediaCover { public interface ICoverExistsSpecification { - bool AlreadyExists(DateTime serverModifiedDate, string localPath); + bool AlreadyExists(DateTime? serverModifiedDate, long? serverContentLength, string localPath); } public class CoverAlreadyExistsSpecification : ICoverExistsSpecification @@ -17,16 +18,28 @@ namespace NzbDrone.Core.MediaCover _diskProvider = diskProvider; } - public bool AlreadyExists(DateTime lastModifiedDateServer, string localPath) + public bool AlreadyExists(DateTime? serverModifiedDate, long? serverContentLength, string localPath) { if (!_diskProvider.FileExists(localPath)) { return false; } - DateTime? lastModifiedLocal = _diskProvider.FileGetLastWrite(localPath); + if (serverModifiedDate.HasValue) + { + DateTime? lastModifiedLocal = _diskProvider.FileGetLastWrite(localPath); + + return lastModifiedLocal.Value.ToUniversalTime() == serverModifiedDate.Value.ToUniversalTime(); + } + + if (serverContentLength.HasValue && serverContentLength.Value > 0) + { + var fileSize = _diskProvider.GetFileSize(localPath); + + return fileSize == serverContentLength; + } - return lastModifiedLocal.Value.ToUniversalTime() == lastModifiedDateServer.ToUniversalTime(); + return false; } } } diff --git a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs index 5ed16207d..467f42606 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs @@ -115,13 +115,13 @@ namespace NzbDrone.Core.MediaCover try { - var lastModifiedServer = GetCoverModifiedDate(cover.Url); + var serverFileHeaders = _httpClient.Head(new HttpRequest(cover.Url) { AllowAutoRedirect = true }).Headers; - alreadyExists = _coverExistsSpecification.AlreadyExists(lastModifiedServer, fileName); + alreadyExists = _coverExistsSpecification.AlreadyExists(serverFileHeaders.LastModified, serverFileHeaders.ContentLength, fileName); if (!alreadyExists) { - DownloadCover(artist, cover, lastModifiedServer); + DownloadCover(artist, cover, serverFileHeaders.LastModified ?? DateTime.Now); } } catch (WebException e) @@ -145,11 +145,13 @@ namespace NzbDrone.Core.MediaCover var alreadyExists = false; try { - var lastModifiedServer = GetCoverModifiedDate(cover.Url); - alreadyExists = _coverExistsSpecification.AlreadyExists(lastModifiedServer, fileName); + var serverFileHeaders = _httpClient.Head(new HttpRequest(cover.Url) { AllowAutoRedirect = true }).Headers; + + alreadyExists = _coverExistsSpecification.AlreadyExists(serverFileHeaders.LastModified, serverFileHeaders.ContentLength, fileName); + if (!alreadyExists) { - DownloadAlbumCover(album, cover, lastModifiedServer); + DownloadAlbumCover(album, cover, serverFileHeaders.LastModified ?? DateTime.Now); } } catch (WebException e) @@ -249,20 +251,6 @@ namespace NzbDrone.Core.MediaCover } } - private DateTime GetCoverModifiedDate(string url) - { - var lastModifiedServer = DateTime.Now; - - var headers = _httpClient.Head(new HttpRequest(url)).Headers; - - if (headers.LastModified.HasValue) - { - lastModifiedServer = headers.LastModified.Value; - } - - return lastModifiedServer; - } - private int[] GetDefaultHeights(MediaCoverTypes coverType) { switch (coverType)