diff --git a/src/NzbDrone.Core.Test/MusicTests/RefreshAlbumServiceFixture.cs b/src/NzbDrone.Core.Test/MusicTests/RefreshAlbumServiceFixture.cs index 4629987fc..b0213a4ef 100644 --- a/src/NzbDrone.Core.Test/MusicTests/RefreshAlbumServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MusicTests/RefreshAlbumServiceFixture.cs @@ -43,6 +43,10 @@ namespace NzbDrone.Core.Test.MusicTests Mocker.GetMock() .Setup(s => s.GetAlbumInfo(It.IsAny(), It.IsAny())) .Callback(() => { throw new AlbumNotFoundException(album1.ForeignAlbumId); }); + + Mocker.GetMock() + .Setup(s => s.ShouldRefresh(It.IsAny())) + .Returns(true); } private void GivenNewAlbumInfo(Album album) diff --git a/src/NzbDrone.Core.Test/MusicTests/ShouldRefreshAlbumFixture.cs b/src/NzbDrone.Core.Test/MusicTests/ShouldRefreshAlbumFixture.cs new file mode 100644 index 000000000..ec8499040 --- /dev/null +++ b/src/NzbDrone.Core.Test/MusicTests/ShouldRefreshAlbumFixture.cs @@ -0,0 +1,103 @@ +using System; +using System.Linq; +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.Music; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.MusicTests +{ + [TestFixture] + public class ShouldRefreshAlbumFixture : TestBase + { + private Album _album; + + [SetUp] + public void Setup() + { + _album = Builder.CreateNew() + .With(e=>e.ReleaseDate = DateTime.Today.AddDays(-100)) + .Build(); + } + + private void GivenAlbumLastRefreshedMonthsAgo() + { + _album.LastInfoSync = DateTime.UtcNow.AddDays(-90); + } + + private void GivenAlbumLastRefreshedYesterday() + { + _album.LastInfoSync = DateTime.UtcNow.AddDays(-1); + } + + private void GivenAlbumLastRefreshedRecently() + { + _album.LastInfoSync = DateTime.UtcNow.AddHours(-1); + } + + private void GivenRecentlyReleased() + { + _album.ReleaseDate = DateTime.Today.AddDays(-7); + } + + private void GivenFutureRelease() + { + _album.ReleaseDate = DateTime.Today.AddDays(7); + } + + [Test] + public void should_return_false_if_album_last_refreshed_less_than_6_hours_ago() + { + GivenAlbumLastRefreshedRecently(); + + Subject.ShouldRefresh(_album).Should().BeFalse(); + } + + [Test] + public void should_return_true_if_album_last_refreshed_more_than_30_days_ago() + { + GivenAlbumLastRefreshedMonthsAgo(); + + Subject.ShouldRefresh(_album).Should().BeTrue(); + } + + [Test] + public void should_return_true_if_album_released_in_last_30_days() + { + GivenAlbumLastRefreshedYesterday(); + + GivenRecentlyReleased(); + + Subject.ShouldRefresh(_album).Should().BeTrue(); + } + + [Test] + public void should_return_true_if_album_releases_in_future() + { + GivenAlbumLastRefreshedYesterday(); + + GivenFutureRelease(); + + Subject.ShouldRefresh(_album).Should().BeTrue(); + } + + [Test] + public void should_return_false_when_recently_refreshed_album_released_over_30_days_ago() + { + GivenAlbumLastRefreshedYesterday(); + + Subject.ShouldRefresh(_album).Should().BeFalse(); + } + + [Test] + public void should_return_false_when_recently_refreshed_album_released_in_last_30_days() + { + GivenAlbumLastRefreshedRecently(); + + GivenRecentlyReleased(); + + Subject.ShouldRefresh(_album).Should().BeFalse(); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 1503491b2..98d37f65f 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -298,6 +298,7 @@ + diff --git a/src/NzbDrone.Core/Music/RefreshAlbumService.cs b/src/NzbDrone.Core/Music/RefreshAlbumService.cs index 25a95eeac..1bc805891 100644 --- a/src/NzbDrone.Core/Music/RefreshAlbumService.cs +++ b/src/NzbDrone.Core/Music/RefreshAlbumService.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Core.Music private readonly IProvideAlbumInfo _albumInfo; private readonly IRefreshTrackService _refreshTrackService; private readonly IEventAggregator _eventAggregator; + private readonly ICheckIfAlbumShouldBeRefreshed _checkIfAlbumShouldBeRefreshed; private readonly Logger _logger; public RefreshAlbumService(IAlbumService albumService, @@ -37,6 +38,7 @@ namespace NzbDrone.Core.Music IProvideAlbumInfo albumInfo, IRefreshTrackService refreshTrackService, IEventAggregator eventAggregator, + ICheckIfAlbumShouldBeRefreshed checkIfAlbumShouldBeRefreshed, Logger logger) { _albumService = albumService; @@ -44,6 +46,7 @@ namespace NzbDrone.Core.Music _albumInfo = albumInfo; _refreshTrackService = refreshTrackService; _eventAggregator = eventAggregator; + _checkIfAlbumShouldBeRefreshed = checkIfAlbumShouldBeRefreshed; _logger = logger; } @@ -51,7 +54,10 @@ namespace NzbDrone.Core.Music { foreach (var album in albums) { - RefreshAlbumInfo(album); + if (_checkIfAlbumShouldBeRefreshed.ShouldRefresh(album)) + { + RefreshAlbumInfo(album); + } } } diff --git a/src/NzbDrone.Core/Music/ShouldRefreshAlbum.cs b/src/NzbDrone.Core/Music/ShouldRefreshAlbum.cs new file mode 100644 index 000000000..2030602e9 --- /dev/null +++ b/src/NzbDrone.Core/Music/ShouldRefreshAlbum.cs @@ -0,0 +1,44 @@ +using NLog; +using System; + +namespace NzbDrone.Core.Music +{ + public interface ICheckIfAlbumShouldBeRefreshed + { + bool ShouldRefresh(Album album); + } + + public class ShouldRefreshAlbum : ICheckIfAlbumShouldBeRefreshed + { + private readonly Logger _logger; + + public ShouldRefreshAlbum(Logger logger) + { + _logger = logger; + } + + public bool ShouldRefresh(Album album) + { + if (album.LastInfoSync < DateTime.UtcNow.AddDays(-30)) + { + _logger.Trace("Album {0} last updated more than 30 days ago, should refresh.", album.Title); + return true; + } + + if (album.LastInfoSync >= DateTime.UtcNow.AddHours(-6)) + { + _logger.Trace("Album {0} last updated less than 6 hours ago, should not be refreshed.", album.Title); + return false; + } + + if (album.ReleaseDate > DateTime.UtcNow.AddDays(-30)) + { + _logger.Trace("album {0} released less than 30 days ago, should refresh.", album.Title); + return true; + } + + _logger.Trace("Album {0} released long ago and recently refreshed, should not be refreshed.", album.Title); + return false; + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 9afb45949..b3a527c2f 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -822,6 +822,7 @@ +