From 221c670bf9d36dc8e6fa88dbbd4d91984870f4c6 Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 19 Mar 2018 21:56:05 -0400 Subject: [PATCH] New: Search for newly added past albums after artist is refreshed Fixes #195 --- src/NzbDrone.Core/Music/AlbumAddedService.cs | 88 +++++++++++++++++++ .../Music/Events/TrackInfoRefreshedEvent.cs | 23 ----- .../Music/RefreshArtistService.cs | 2 + .../Music/RefreshTrackService.cs | 6 -- src/NzbDrone.Core/NzbDrone.Core.csproj | 2 +- 5 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 src/NzbDrone.Core/Music/AlbumAddedService.cs delete mode 100644 src/NzbDrone.Core/Music/Events/TrackInfoRefreshedEvent.cs diff --git a/src/NzbDrone.Core/Music/AlbumAddedService.cs b/src/NzbDrone.Core/Music/AlbumAddedService.cs new file mode 100644 index 000000000..ea1557a51 --- /dev/null +++ b/src/NzbDrone.Core/Music/AlbumAddedService.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NLog; +using NzbDrone.Common.Cache; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.IndexerSearch; +using NzbDrone.Core.Messaging.Commands; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Music.Events; + +namespace NzbDrone.Core.Music +{ + public interface IAlbumAddedService + { + void SearchForRecentlyAdded(int artistId); + } + + public class AlbumAddedService : IHandle, IAlbumAddedService + { + private readonly IManageCommandQueue _commandQueueManager; + private readonly IAlbumService _albumService; + private readonly Logger _logger; + private readonly ICached> _addedAlbumsCache; + + public AlbumAddedService(ICacheManager cacheManager, + IManageCommandQueue commandQueueManager, + IAlbumService albumService, + Logger logger) + { + _commandQueueManager = commandQueueManager; + _albumService = albumService; + _logger = logger; + _addedAlbumsCache = cacheManager.GetCache>(GetType()); + } + + public void SearchForRecentlyAdded(int artistId) + { + var previouslyReleased = _addedAlbumsCache.Find(artistId.ToString()); + + if (previouslyReleased != null && previouslyReleased.Any()) + { + var missing = previouslyReleased.Select(e => _albumService.GetAlbum(e)).ToList(); + + if (missing.Any()) + { + _commandQueueManager.Push(new AlbumSearchCommand(missing.Select(e => e.Id).ToList())); + } + } + + _addedAlbumsCache.Remove(artistId.ToString()); + } + + public void Handle(AlbumInfoRefreshedEvent message) + { + if (message.Artist.AddOptions == null) + { + if (!message.Artist.Monitored) + { + _logger.Debug("Artist is not monitored"); + return; + } + + if (message.Added.Empty()) + { + _logger.Debug("No new albums, skipping search"); + return; + } + + if (message.Added.None(a => a.ReleaseDate.HasValue)) + { + _logger.Debug("No new albums have an release date"); + return; + } + + var previouslyReleased = message.Added.Where(a => a.ReleaseDate.HasValue && a.ReleaseDate.Value.Before(DateTime.UtcNow.AddDays(1)) && a.Monitored).ToList(); + + if (previouslyReleased.Empty()) + { + _logger.Debug("Newly added albums all release in the future"); + return; + } + + _addedAlbumsCache.Set(message.Artist.Id.ToString(), previouslyReleased.Select(e => e.Id).ToList()); + } + } + } +} diff --git a/src/NzbDrone.Core/Music/Events/TrackInfoRefreshedEvent.cs b/src/NzbDrone.Core/Music/Events/TrackInfoRefreshedEvent.cs deleted file mode 100644 index 02bf1148d..000000000 --- a/src/NzbDrone.Core/Music/Events/TrackInfoRefreshedEvent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using NzbDrone.Common.Messaging; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; - -namespace NzbDrone.Core.Music.Events -{ - public class TrackInfoRefreshedEvent : IEvent - { - public Album Album { get; set; } - public ReadOnlyCollection Added { get; private set; } - public ReadOnlyCollection Updated { get; private set; } - - public TrackInfoRefreshedEvent(Album album, IList added, IList updated) - { - Album = album; - Added = new ReadOnlyCollection(added); - Updated = new ReadOnlyCollection(updated); - } - } -} diff --git a/src/NzbDrone.Core/Music/RefreshArtistService.cs b/src/NzbDrone.Core/Music/RefreshArtistService.cs index 04664a4a3..fa06709ce 100644 --- a/src/NzbDrone.Core/Music/RefreshArtistService.cs +++ b/src/NzbDrone.Core/Music/RefreshArtistService.cs @@ -134,6 +134,8 @@ namespace NzbDrone.Core.Music _albumService.DeleteMany(existingAlbums); + _eventAggregator.PublishEvent(new AlbumInfoRefreshedEvent(artist, newAlbumsList, updateAlbumsList)); + _logger.Debug("Finished artist refresh for {0}", artist.Name); _eventAggregator.PublishEvent(new ArtistUpdatedEvent(artist)); } diff --git a/src/NzbDrone.Core/Music/RefreshTrackService.cs b/src/NzbDrone.Core/Music/RefreshTrackService.cs index 7c52cf907..6111d21f6 100644 --- a/src/NzbDrone.Core/Music/RefreshTrackService.cs +++ b/src/NzbDrone.Core/Music/RefreshTrackService.cs @@ -86,16 +86,10 @@ namespace NzbDrone.Core.Music } } - var allTracks = new List(); - allTracks.AddRange(newList); - allTracks.AddRange(updateList); - _trackService.DeleteMany(existingTracks); _trackService.UpdateMany(updateList); _trackService.InsertMany(newList); - _eventAggregator.PublishEvent(new TrackInfoRefreshedEvent(album, newList, updateList)); - if (failCount != 0) { _logger.Info("Finished track refresh for album: {0}. Successful: {1} - Failed: {2} ", diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 137712f62..2ec7c2ca5 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -803,6 +803,7 @@ + @@ -845,7 +846,6 @@ -