From 78a0b5f8b713f873532304b0c5d5b947bee0aa96 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 10 Nov 2018 23:50:21 -0500 Subject: [PATCH] New: Setting to disable disk scan after artist refresh Co-Authored-By: Mark McDowall --- .../MediaManagement/MediaManagement.js | 33 +++++++++++--- .../Config/MediaManagementConfigResource.cs | 2 + .../Configuration/ConfigService.cs | 7 +++ .../Configuration/IConfigService.cs | 1 + .../Configuration/RescanAfterRefreshType.cs | 9 ++++ .../MediaFiles/DiskScanService.cs | 6 --- src/NzbDrone.Core/Music/ArtistAddedHandler.cs | 4 +- .../Music/ArtistEditedService.cs | 2 +- .../Music/Commands/RefreshArtistCommand.cs | 4 +- .../Music/RefreshArtistService.cs | 45 ++++++++++++++++--- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 11 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 src/NzbDrone.Core/Configuration/RescanAfterRefreshType.cs diff --git a/frontend/src/Settings/MediaManagement/MediaManagement.js b/frontend/src/Settings/MediaManagement/MediaManagement.js index cc05a5495..9ff43b951 100644 --- a/frontend/src/Settings/MediaManagement/MediaManagement.js +++ b/frontend/src/Settings/MediaManagement/MediaManagement.js @@ -12,6 +12,17 @@ import FormLabel from 'Components/Form/FormLabel'; import FormInputGroup from 'Components/Form/FormInputGroup'; import NamingConnector from './Naming/NamingConnector'; +const rescanAfterRefreshOptions = [ + { key: 'always', value: 'Always' }, + { key: 'afterManual', value: 'After Manual Refresh' }, + { key: 'never', value: 'Never' } +]; + +const fileDateOptions = [ + { key: 'none', value: 'None' }, + { key: 'albumReleaseDate', value: 'Album Release Date' } +]; + class MediaManagement extends Component { // @@ -30,11 +41,6 @@ class MediaManagement extends Component { ...otherProps } = this.props; - const fileDateOptions = [ - { key: 'none', value: 'None' }, - { key: 'albumReleaseDate', value: 'Album Release Date' } - ]; - return ( + + Rescan Artist Folder after Refresh + + + + , IExecute { private readonly IDiskProvider _diskProvider; @@ -209,11 +208,6 @@ namespace NzbDrone.Core.MediaFiles } } - public void Handle(ArtistUpdatedEvent message) - { - Scan(message.Artist); - } - public void Execute(RescanArtistCommand message) { if (message.ArtistId.HasValue) diff --git a/src/NzbDrone.Core/Music/ArtistAddedHandler.cs b/src/NzbDrone.Core/Music/ArtistAddedHandler.cs index 9fba14fcd..5e98d6cc0 100644 --- a/src/NzbDrone.Core/Music/ArtistAddedHandler.cs +++ b/src/NzbDrone.Core/Music/ArtistAddedHandler.cs @@ -18,12 +18,12 @@ namespace NzbDrone.Core.Music public void Handle(ArtistAddedEvent message) { - _commandQueueManager.Push(new RefreshArtistCommand(message.Artist.Id)); + _commandQueueManager.Push(new RefreshArtistCommand(message.Artist.Id, true)); } public void Handle(ArtistsImportedEvent message) { - _commandQueueManager.PushMany(message.ArtistIds.Select(s => new RefreshArtistCommand(s)).ToList()); + _commandQueueManager.PushMany(message.ArtistIds.Select(s => new RefreshArtistCommand(s, true)).ToList()); } } } diff --git a/src/NzbDrone.Core/Music/ArtistEditedService.cs b/src/NzbDrone.Core/Music/ArtistEditedService.cs index c0560582a..bf76b0bfa 100644 --- a/src/NzbDrone.Core/Music/ArtistEditedService.cs +++ b/src/NzbDrone.Core/Music/ArtistEditedService.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Music // Refresh Artist is we change AlbumType Preferences if (message.Artist.LanguageProfileId != message.OldArtist.LanguageProfileId) { - _commandQueueManager.Push(new RefreshArtistCommand(message.Artist.Id)); + _commandQueueManager.Push(new RefreshArtistCommand(message.Artist.Id, false)); } } } diff --git a/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs b/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs index be4556ffa..abd1dacd9 100644 --- a/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs +++ b/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs @@ -5,14 +5,16 @@ namespace NzbDrone.Core.Music.Commands public class RefreshArtistCommand : Command { public int? ArtistId { get; set; } + public bool IsNewArtist { get; set; } public RefreshArtistCommand() { } - public RefreshArtistCommand(int? artistId) + public RefreshArtistCommand(int? artistId, bool isNewArtist = false) { ArtistId = artistId; + IsNewArtist = isNewArtist; } public override bool SendUpdatesToClient => true; diff --git a/src/NzbDrone.Core/Music/RefreshArtistService.cs b/src/NzbDrone.Core/Music/RefreshArtistService.cs index d18d31825..c79f25eac 100644 --- a/src/NzbDrone.Core/Music/RefreshArtistService.cs +++ b/src/NzbDrone.Core/Music/RefreshArtistService.cs @@ -1,5 +1,6 @@ using NLog; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.Exceptions; using NzbDrone.Core.MediaFiles; @@ -27,6 +28,7 @@ namespace NzbDrone.Core.Music private readonly IEventAggregator _eventAggregator; private readonly IDiskScanService _diskScanService; private readonly ICheckIfArtistShouldBeRefreshed _checkIfArtistShouldBeRefreshed; + private readonly IConfigService _configService; private readonly Logger _logger; public RefreshArtistService(IProvideArtistInfo artistInfo, @@ -38,6 +40,7 @@ namespace NzbDrone.Core.Music IEventAggregator eventAggregator, IDiskScanService diskScanService, ICheckIfArtistShouldBeRefreshed checkIfArtistShouldBeRefreshed, + IConfigService configService, Logger logger) { _artistInfo = artistInfo; @@ -49,6 +52,7 @@ namespace NzbDrone.Core.Music _eventAggregator = eventAggregator; _diskScanService = diskScanService; _checkIfArtistShouldBeRefreshed = checkIfArtistShouldBeRefreshed; + _configService = configService; _logger = logger; } @@ -153,8 +157,34 @@ namespace NzbDrone.Core.Music return albumsToUpdate; } - private void RescanArtist(Artist artist) + private void RescanArtist(Artist artist, bool isNew, CommandTrigger trigger) { + var rescanAfterRefresh = _configService.RescanAfterRefresh; + var shouldRescan = true; + + if (isNew) + { + _logger.Trace("Forcing refresh of {0}. Reason: New artist", artist); + shouldRescan = true; + } + + else if (rescanAfterRefresh == RescanAfterRefreshType.Never) + { + _logger.Trace("Skipping refresh of {0}. Reason: never recan after refresh", artist); + shouldRescan = false; + } + + else if (rescanAfterRefresh == RescanAfterRefreshType.AfterManual && trigger != CommandTrigger.Manual) + { + _logger.Trace("Skipping refresh of {0}. Reason: not after automatic scans", artist); + shouldRescan = false; + } + + if (!shouldRescan) + { + return; + } + try { _diskScanService.Scan(artist); @@ -167,7 +197,9 @@ namespace NzbDrone.Core.Music public void Execute(RefreshArtistCommand message) { - _eventAggregator.PublishEvent(new ArtistRefreshStartingEvent(message.Trigger == CommandTrigger.Manual)); + var trigger = message.Trigger; + var isNew = message.IsNewArtist; + _eventAggregator.PublishEvent(new ArtistRefreshStartingEvent(trigger == CommandTrigger.Manual)); if (message.ArtistId.HasValue) { @@ -176,11 +208,12 @@ namespace NzbDrone.Core.Music try { RefreshArtistInfo(artist, true); + RescanArtist(artist, isNew, trigger); } catch (Exception e) { _logger.Error(e, "Couldn't refresh info for {0}", artist); - RescanArtist(artist); + RescanArtist(artist, isNew, trigger); throw; } } @@ -191,6 +224,7 @@ namespace NzbDrone.Core.Music foreach (var artist in allArtists) { var manualTrigger = message.Trigger == CommandTrigger.Manual; + if (manualTrigger || _checkIfArtistShouldBeRefreshed.ShouldRefresh(artist)) { try @@ -200,14 +234,15 @@ namespace NzbDrone.Core.Music catch (Exception e) { _logger.Error(e, "Couldn't refresh info for {0}", artist); - RescanArtist(artist); } + + RescanArtist(artist, false, trigger); } else { _logger.Info("Skipping refresh of artist: {0}", artist.Name); - RescanArtist(artist); + RescanArtist(artist, false, trigger); } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index a88368760..362e30a6c 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -142,6 +142,7 @@ +