From 12d6b5ee9ad2fd370cef5fdc56bbe9e2c9727664 Mon Sep 17 00:00:00 2001 From: ta264 Date: Tue, 25 Aug 2020 21:16:44 +0100 Subject: [PATCH] Fixed: Don't refresh and rescan artist when new album added Speeds up adding a single album to an existing artist. Should help reduce the number of full rescans being triggered also - an added album was triggering one. --- .../ImportListSyncServiceFixture.cs | 12 ++++++------ .../ImportLists/ImportListSyncService.cs | 2 +- .../MediaCover/MediaCoverService.cs | 9 +++++++++ .../Music/Commands/RefreshAlbumCommand.cs | 4 +++- .../Music/Events/AlbumAddedEvent.cs | 4 +++- .../Music/Handlers/AlbumAddedHandler.cs | 19 +++++++++++++++++-- .../Music/Services/AddAlbumService.cs | 13 +++++++------ .../Music/Services/AlbumService.cs | 6 +++--- .../Music/Services/RefreshAlbumService.cs | 11 +++++++++++ 9 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs index ab8760a30..2f4030901 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs @@ -54,8 +54,8 @@ namespace NzbDrone.Core.Test.ImportListTests .Returns((List artists, bool doRefresh) => artists); Mocker.GetMock() - .Setup(v => v.AddAlbums(It.IsAny>())) - .Returns((List albums) => albums); + .Setup(v => v.AddAlbums(It.IsAny>(), false)) + .Returns((List albums, bool doRefresh) => albums); } private void WithAlbum() @@ -208,7 +208,7 @@ namespace NzbDrone.Core.Test.ImportListTests Subject.Execute(new ImportListSyncCommand()); Mocker.GetMock() - .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 1))); + .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 1), false)); } [TestCase(ImportListMonitorType.None, false)] @@ -236,7 +236,7 @@ namespace NzbDrone.Core.Test.ImportListTests Subject.Execute(new ImportListSyncCommand()); Mocker.GetMock() - .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 1 && t.First().Monitored == expectedAlbumMonitored))); + .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 1 && t.First().Monitored == expectedAlbumMonitored), false)); } [Test] @@ -260,7 +260,7 @@ namespace NzbDrone.Core.Test.ImportListTests Subject.Execute(new ImportListSyncCommand()); Mocker.GetMock() - .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 0))); + .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 0), false)); } [Test] @@ -273,7 +273,7 @@ namespace NzbDrone.Core.Test.ImportListTests Subject.Execute(new ImportListSyncCommand()); Mocker.GetMock() - .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 0))); + .Verify(v => v.AddAlbums(It.Is>(t => t.Count == 0), false)); } } } diff --git a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs index 02fc1281b..df6cc847f 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs @@ -118,7 +118,7 @@ namespace NzbDrone.Core.ImportLists } var addedArtists = _addArtistService.AddArtists(artistsToAdd, false); - var addedAlbums = _addAlbumService.AddAlbums(albumsToAdd); + var addedAlbums = _addAlbumService.AddAlbums(albumsToAdd, false); var message = string.Format($"Import List Sync Completed. Items found: {reports.Count}, Artists added: {addedArtists.Count}, Albums added: {addedAlbums.Count}"); diff --git a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs index e1a89c126..9c61b4368 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs @@ -26,6 +26,7 @@ namespace NzbDrone.Core.MediaCover public class MediaCoverService : IHandleAsync, IHandleAsync, + IHandleAsync, IHandleAsync, IMapCoversToLocal { @@ -292,6 +293,14 @@ namespace NzbDrone.Core.MediaCover } } + public void HandleAsync(AlbumAddedEvent message) + { + if (message.DoRefresh) + { + EnsureAlbumCovers(message.Album); + } + } + public void HandleAsync(AlbumDeletedEvent message) { var path = GetAlbumCoverPath(message.Album.Id); diff --git a/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs b/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs index 40652db6e..58004c3b6 100644 --- a/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs +++ b/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs @@ -5,14 +5,16 @@ namespace NzbDrone.Core.Music.Commands public class RefreshAlbumCommand : Command { public int? AlbumId { get; set; } + public bool IsNewAlbum { get; set; } public RefreshAlbumCommand() { } - public RefreshAlbumCommand(int? albumId) + public RefreshAlbumCommand(int? albumId, bool isNewAlbum = false) { AlbumId = albumId; + IsNewAlbum = isNewAlbum; } public override bool SendUpdatesToClient => true; diff --git a/src/NzbDrone.Core/Music/Events/AlbumAddedEvent.cs b/src/NzbDrone.Core/Music/Events/AlbumAddedEvent.cs index bbd98811e..78cd2cf9f 100644 --- a/src/NzbDrone.Core/Music/Events/AlbumAddedEvent.cs +++ b/src/NzbDrone.Core/Music/Events/AlbumAddedEvent.cs @@ -5,10 +5,12 @@ namespace NzbDrone.Core.Music.Events public class AlbumAddedEvent : IEvent { public Album Album { get; private set; } + public bool DoRefresh { get; private set; } - public AlbumAddedEvent(Album album) + public AlbumAddedEvent(Album album, bool doRefresh = true) { Album = album; + DoRefresh = doRefresh; } } } diff --git a/src/NzbDrone.Core/Music/Handlers/AlbumAddedHandler.cs b/src/NzbDrone.Core/Music/Handlers/AlbumAddedHandler.cs index e0c4da146..4b95ffa5a 100644 --- a/src/NzbDrone.Core/Music/Handlers/AlbumAddedHandler.cs +++ b/src/NzbDrone.Core/Music/Handlers/AlbumAddedHandler.cs @@ -7,16 +7,31 @@ namespace NzbDrone.Core.Music { public class AlbumAddedHandler : IHandle { + private readonly ICheckIfArtistShouldBeRefreshed _checkIfArtistShouldBeRefreshed; private readonly IManageCommandQueue _commandQueueManager; - public AlbumAddedHandler(IManageCommandQueue commandQueueManager) + public AlbumAddedHandler(ICheckIfArtistShouldBeRefreshed checkIfArtistShouldBeRefreshed, + IManageCommandQueue commandQueueManager) { + _checkIfArtistShouldBeRefreshed = checkIfArtistShouldBeRefreshed; _commandQueueManager = commandQueueManager; } public void Handle(AlbumAddedEvent message) { - _commandQueueManager.Push(new RefreshArtistCommand(message.Album.Artist.Value.Id)); + if (message.DoRefresh) + { + var artist = message.Album.Artist.Value; + + if (_checkIfArtistShouldBeRefreshed.ShouldRefresh(artist)) + { + _commandQueueManager.Push(new RefreshArtistCommand(artist.Id)); + } + else + { + _commandQueueManager.Push(new RefreshAlbumCommand(message.Album.Id, true)); + } + } } } } diff --git a/src/NzbDrone.Core/Music/Services/AddAlbumService.cs b/src/NzbDrone.Core/Music/Services/AddAlbumService.cs index 8bee983cd..735f85b60 100644 --- a/src/NzbDrone.Core/Music/Services/AddAlbumService.cs +++ b/src/NzbDrone.Core/Music/Services/AddAlbumService.cs @@ -12,8 +12,8 @@ namespace NzbDrone.Core.Music { public interface IAddAlbumService { - Album AddAlbum(Album album); - List AddAlbums(List albums); + Album AddAlbum(Album album, bool doRefresh = true); + List AddAlbums(List albums, bool doRefresh = true); } public class AddAlbumService : IAddAlbumService @@ -40,7 +40,7 @@ namespace NzbDrone.Core.Music _logger = logger; } - public Album AddAlbum(Album album) + public Album AddAlbum(Album album, bool doRefresh = true) { _logger.Debug($"Adding album {album}"); @@ -65,12 +65,13 @@ namespace NzbDrone.Core.Music } album.ArtistMetadataId = dbArtist.ArtistMetadataId; - _albumService.AddAlbum(album); + album.Artist = dbArtist; + _albumService.AddAlbum(album, doRefresh); return album; } - public List AddAlbums(List albums) + public List AddAlbums(List albums, bool doRefresh = true) { var added = DateTime.UtcNow; var addedAlbums = new List(); @@ -78,7 +79,7 @@ namespace NzbDrone.Core.Music foreach (var a in albums) { a.Added = added; - addedAlbums.Add(AddAlbum(a)); + addedAlbums.Add(AddAlbum(a, doRefresh)); } return addedAlbums; diff --git a/src/NzbDrone.Core/Music/Services/AlbumService.cs b/src/NzbDrone.Core/Music/Services/AlbumService.cs index f6bdad2bc..d1b952cba 100644 --- a/src/NzbDrone.Core/Music/Services/AlbumService.cs +++ b/src/NzbDrone.Core/Music/Services/AlbumService.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Music List GetLastAlbumsByArtistMetadataId(IEnumerable artistMetadataIds); List GetAlbumsByArtistMetadataId(int artistMetadataId); List GetAlbumsForRefresh(int artistMetadataId, IEnumerable foreignIds); - Album AddAlbum(Album newAlbum); + Album AddAlbum(Album newAlbum, bool doRefresh); Album FindById(string foreignId); Album FindByTitle(int artistMetadataId, string title); Album FindByTitleInexact(int artistMetadataId, string title); @@ -57,11 +57,11 @@ namespace NzbDrone.Core.Music _logger = logger; } - public Album AddAlbum(Album newAlbum) + public Album AddAlbum(Album newAlbum, bool doRefresh) { _albumRepository.Insert(newAlbum); - _eventAggregator.PublishEvent(new AlbumAddedEvent(GetAlbum(newAlbum.Id))); + _eventAggregator.PublishEvent(new AlbumAddedEvent(GetAlbum(newAlbum.Id), doRefresh)); return newAlbum; } diff --git a/src/NzbDrone.Core/Music/Services/RefreshAlbumService.cs b/src/NzbDrone.Core/Music/Services/RefreshAlbumService.cs index 2c536ffa9..816c593f6 100644 --- a/src/NzbDrone.Core/Music/Services/RefreshAlbumService.cs +++ b/src/NzbDrone.Core/Music/Services/RefreshAlbumService.cs @@ -8,6 +8,7 @@ using NzbDrone.Core.Exceptions; using NzbDrone.Core.History; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.MetadataSource; @@ -33,6 +34,7 @@ namespace NzbDrone.Core.Music private readonly IMediaFileService _mediaFileService; private readonly IHistoryService _historyService; private readonly IEventAggregator _eventAggregator; + private readonly IManageCommandQueue _commandQueueManager; private readonly ICheckIfAlbumShouldBeRefreshed _checkIfAlbumShouldBeRefreshed; private readonly IMapCoversToLocal _mediaCoverService; private readonly Logger _logger; @@ -47,6 +49,7 @@ namespace NzbDrone.Core.Music IMediaFileService mediaFileService, IHistoryService historyService, IEventAggregator eventAggregator, + IManageCommandQueue commandQueueManager, ICheckIfAlbumShouldBeRefreshed checkIfAlbumShouldBeRefreshed, IMapCoversToLocal mediaCoverService, Logger logger) @@ -61,6 +64,7 @@ namespace NzbDrone.Core.Music _mediaFileService = mediaFileService; _historyService = historyService; _eventAggregator = eventAggregator; + _commandQueueManager = commandQueueManager; _checkIfAlbumShouldBeRefreshed = checkIfAlbumShouldBeRefreshed; _mediaCoverService = mediaCoverService; _logger = logger; @@ -359,6 +363,13 @@ namespace NzbDrone.Core.Music _eventAggregator.PublishEvent(new ArtistUpdatedEvent(artist)); _eventAggregator.PublishEvent(new AlbumUpdatedEvent(album)); } + + if (message.IsNewAlbum) + { + // Just scan the artist path - triggering a full rescan is too painful + var folders = new List { artist.Path }; + _commandQueueManager.Push(new RescanFoldersCommand(folders, FilterFilesType.Matched, false, null)); + } } } }