diff --git a/frontend/src/Settings/Notifications/Notifications/Notification.js b/frontend/src/Settings/Notifications/Notifications/Notification.js
index 6e9b01f57..21f0e5ca8 100644
--- a/frontend/src/Settings/Notifications/Notifications/Notification.js
+++ b/frontend/src/Settings/Notifications/Notifications/Notification.js
@@ -60,8 +60,9 @@ class Notification extends Component {
onReleaseImport,
onUpgrade,
onRename,
- onAlbumDelete,
+ onArtistAdd,
onArtistDelete,
+ onAlbumDelete,
onHealthIssue,
onHealthRestored,
onDownloadFailure,
@@ -72,8 +73,9 @@ class Notification extends Component {
supportsOnReleaseImport,
supportsOnUpgrade,
supportsOnRename,
- supportsOnAlbumDelete,
+ supportsOnArtistAdd,
supportsOnArtistDelete,
+ supportsOnAlbumDelete,
supportsOnHealthIssue,
supportsOnHealthRestored,
supportsOnDownloadFailure,
@@ -95,59 +97,75 @@ class Notification extends Component {
{
- supportsOnGrab && onGrab &&
+ supportsOnGrab && onGrab ?
+ :
+ null
}
{
- supportsOnReleaseImport && onReleaseImport &&
+ supportsOnReleaseImport && onReleaseImport ?
+ :
+ null
}
{
- supportsOnUpgrade && onReleaseImport && onUpgrade &&
+ supportsOnUpgrade && onReleaseImport && onUpgrade ?
+ :
+ null
}
{
- supportsOnRename && onRename &&
+ supportsOnRename && onRename ?
+ :
+ null
}
{
- supportsOnTrackRetag && onTrackRetag &&
+ supportsOnTrackRetag && onTrackRetag ?
+ :
+ null
}
{
- supportsOnAlbumDelete && onAlbumDelete &&
+ supportsOnArtistAdd && onArtistAdd ?
+ {translate('OnArtistAdd')}
+ :
+ null
}
{
- supportsOnArtistDelete && onArtistDelete &&
+ supportsOnArtistDelete && onArtistDelete ?
+ :
+ null
}
{
- supportsOnHealthIssue && onHealthIssue &&
+ supportsOnAlbumDelete && onAlbumDelete ?
+ :
+ null
+ }
+
+ {
+ supportsOnHealthIssue && onHealthIssue ?
+ :
+ null
}
{
@@ -159,35 +177,38 @@ class Notification extends Component {
}
{
- supportsOnDownloadFailure && onDownloadFailure &&
+ supportsOnDownloadFailure && onDownloadFailure ?
+ :
+ null
}
{
- supportsOnImportFailure && onImportFailure &&
+ supportsOnImportFailure && onImportFailure ?
+ :
+ null
}
{
- supportsOnApplicationUpdate && onApplicationUpdate &&
+ supportsOnApplicationUpdate && onApplicationUpdate ?
+ :
+ null
}
{
- !onGrab && !onReleaseImport && !onRename && !onTrackRetag && !onAlbumDelete && !onArtistDelete &&
- !onHealthIssue && !onHealthRestored && !onDownloadFailure && !onImportFailure && !onApplicationUpdate &&
-
+ !onGrab && !onReleaseImport && !onRename && !onTrackRetag && !onArtistAdd && !onArtistDelete && !onAlbumDelete && !onHealthIssue && !onHealthRestored && !onDownloadFailure && !onImportFailure && !onApplicationUpdate ?
+ :
+ null
}
@@ -148,18 +150,29 @@ function NotificationEventItems(props) {
+
+
+
+
public bool OnReleaseImport { get; set; }
public bool OnUpgrade { get; set; }
public bool OnRename { get; set; }
- public bool OnAlbumDelete { get; set; }
+ public bool OnArtistAdd { get; set; }
public bool OnArtistDelete { get; set; }
+ public bool OnAlbumDelete { get; set; }
public bool OnHealthIssue { get; set; }
public bool OnHealthRestored { get; set; }
public bool OnDownloadFailure { get; set; }
@@ -21,8 +22,9 @@ public class NotificationResource : ProviderResource
public bool SupportsOnReleaseImport { get; set; }
public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; }
- public bool SupportsOnAlbumDelete { get; set; }
+ public bool SupportsOnArtistAdd { get; set; }
public bool SupportsOnArtistDelete { get; set; }
+ public bool SupportsOnAlbumDelete { get; set; }
public bool SupportsOnHealthIssue { get; set; }
public bool SupportsOnHealthRestored { get; set; }
public bool IncludeHealthWarnings { get; set; }
@@ -48,8 +50,9 @@ public override NotificationResource ToResource(NotificationDefinition definitio
resource.OnReleaseImport = definition.OnReleaseImport;
resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename;
- resource.OnAlbumDelete = definition.OnAlbumDelete;
+ resource.OnArtistAdd = definition.OnArtistAdd;
resource.OnArtistDelete = definition.OnArtistDelete;
+ resource.OnAlbumDelete = definition.OnAlbumDelete;
resource.OnHealthIssue = definition.OnHealthIssue;
resource.OnHealthRestored = definition.OnHealthRestored;
resource.OnDownloadFailure = definition.OnDownloadFailure;
@@ -60,8 +63,9 @@ public override NotificationResource ToResource(NotificationDefinition definitio
resource.SupportsOnReleaseImport = definition.SupportsOnReleaseImport;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename;
- resource.SupportsOnAlbumDelete = definition.SupportsOnAlbumDelete;
+ resource.SupportsOnArtistAdd = definition.SupportsOnArtistAdd;
resource.SupportsOnArtistDelete = definition.SupportsOnArtistDelete;
+ resource.SupportsOnAlbumDelete = definition.SupportsOnAlbumDelete;
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
resource.SupportsOnHealthRestored = definition.SupportsOnHealthRestored;
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
@@ -86,8 +90,9 @@ public override NotificationDefinition ToModel(NotificationResource resource, No
definition.OnReleaseImport = resource.OnReleaseImport;
definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename;
- definition.OnAlbumDelete = resource.OnAlbumDelete;
+ definition.OnArtistAdd = resource.OnArtistAdd;
definition.OnArtistDelete = resource.OnArtistDelete;
+ definition.OnAlbumDelete = resource.OnAlbumDelete;
definition.OnHealthIssue = resource.OnHealthIssue;
definition.OnHealthRestored = resource.OnHealthRestored;
definition.OnDownloadFailure = resource.OnDownloadFailure;
@@ -98,8 +103,9 @@ public override NotificationDefinition ToModel(NotificationResource resource, No
definition.SupportsOnReleaseImport = resource.SupportsOnReleaseImport;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename;
- definition.SupportsOnAlbumDelete = resource.SupportsOnAlbumDelete;
+ definition.SupportsOnArtistAdd = resource.SupportsOnArtistAdd;
definition.SupportsOnArtistDelete = resource.SupportsOnArtistDelete;
+ definition.SupportsOnAlbumDelete = resource.SupportsOnAlbumDelete;
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
definition.SupportsOnHealthRestored = resource.SupportsOnHealthRestored;
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;
diff --git a/src/NzbDrone.Core/Datastore/Migration/076_add_on_artist_add_to_notifications.cs b/src/NzbDrone.Core/Datastore/Migration/076_add_on_artist_add_to_notifications.cs
new file mode 100644
index 000000000..79c86ec5a
--- /dev/null
+++ b/src/NzbDrone.Core/Datastore/Migration/076_add_on_artist_add_to_notifications.cs
@@ -0,0 +1,14 @@
+using FluentMigrator;
+using NzbDrone.Core.Datastore.Migration.Framework;
+
+namespace NzbDrone.Core.Datastore.Migration
+{
+ [Migration(076)]
+ public class add_on_artist_add_to_notifications : NzbDroneMigrationBase
+ {
+ protected override void MainDbUpgrade()
+ {
+ Alter.Table("Notifications").AddColumn("OnArtistAdd").AsBoolean().WithDefaultValue(false);
+ }
+ }
+}
diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs
index 0ea48c00b..df2296951 100644
--- a/src/NzbDrone.Core/Datastore/TableMapping.cs
+++ b/src/NzbDrone.Core/Datastore/TableMapping.cs
@@ -86,8 +86,9 @@ public static void Map()
.Ignore(i => i.SupportsOnReleaseImport)
.Ignore(i => i.SupportsOnUpgrade)
.Ignore(i => i.SupportsOnRename)
- .Ignore(i => i.SupportsOnAlbumDelete)
+ .Ignore(i => i.SupportsOnArtistAdd)
.Ignore(i => i.SupportsOnArtistDelete)
+ .Ignore(i => i.SupportsOnAlbumDelete)
.Ignore(i => i.SupportsOnHealthIssue)
.Ignore(i => i.SupportsOnHealthRestored)
.Ignore(i => i.SupportsOnDownloadFailure)
diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json
index 74babb223..8b2eecae4 100644
--- a/src/NzbDrone.Core/Localization/Core/en.json
+++ b/src/NzbDrone.Core/Localization/Core/en.json
@@ -532,7 +532,7 @@
"Importing": "Importing",
"Inactive": "Inactive",
"IncludeCustomFormatWhenRenamingHelpText": "'Include in {Custom Formats} renaming format'",
- "IncludeHealthWarningsHelpText": "Include Health Warnings",
+ "IncludeHealthWarnings": "Include Health Warnings",
"IncludeUnknownArtistItemsHelpText": "Show items without a artist in the queue, this could include removed artists, movies or anything else in {appName}'s category",
"IncludeUnmonitored": "Include Unmonitored",
"Indexer": "Indexer",
@@ -722,29 +722,18 @@
"NotificationTriggers": "Notification Triggers",
"Ok": "Ok",
"OnAlbumDelete": "On Album Delete",
- "OnAlbumDeleteHelpText": "On Album Delete",
"OnApplicationUpdate": "On Application Update",
- "OnApplicationUpdateHelpText": "On Application Update",
+ "OnArtistAdd": "On Artist Add",
"OnArtistDelete": "On Artist Delete",
- "OnArtistDeleteHelpText": "On Artist Delete",
"OnDownloadFailure": "On Download Failure",
- "OnDownloadFailureHelpText": "On Download Failure",
"OnGrab": "On Grab",
- "OnGrabHelpText": "On Grab",
"OnHealthIssue": "On Health Issue",
- "OnHealthIssueHelpText": "On Health Issue",
"OnHealthRestored": "On Health Restored",
- "OnHealthRestoredHelpText": "On Health Restored",
"OnImportFailure": "On Import Failure",
- "OnImportFailureHelpText": "On Import Failure",
"OnReleaseImport": "On Release Import",
- "OnReleaseImportHelpText": "On Release Import",
"OnRename": "On Rename",
- "OnRenameHelpText": "On Rename",
"OnTrackRetag": "On Track Retag",
- "OnTrackRetagHelpText": "On Track Retag",
"OnUpgrade": "On Upgrade",
- "OnUpgradeHelpText": "On Upgrade",
"OneAlbum": "1 album",
"OnlyTorrent": "Only Torrent",
"OnlyUsenet": "Only Usenet",
diff --git a/src/NzbDrone.Core/Music/Events/ArtistAddCompletedEvent.cs b/src/NzbDrone.Core/Music/Events/ArtistAddCompletedEvent.cs
new file mode 100644
index 000000000..861936676
--- /dev/null
+++ b/src/NzbDrone.Core/Music/Events/ArtistAddCompletedEvent.cs
@@ -0,0 +1,14 @@
+using NzbDrone.Common.Messaging;
+
+namespace NzbDrone.Core.Music.Events
+{
+ public class ArtistAddCompletedEvent : IEvent
+ {
+ public Artist Artist { get; private set; }
+
+ public ArtistAddCompletedEvent(Artist artist)
+ {
+ Artist = artist;
+ }
+ }
+}
diff --git a/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs b/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs
index 7a415e72b..97221d909 100644
--- a/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs
+++ b/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs
@@ -3,6 +3,7 @@
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
+using NzbDrone.Core.Music.Events;
namespace NzbDrone.Core.Music
{
@@ -13,38 +14,46 @@ public class ArtistScannedHandler : IHandle,
private readonly IArtistService _artistService;
private readonly IManageCommandQueue _commandQueueManager;
private readonly IAlbumAddedService _albumAddedService;
+ private readonly IEventAggregator _eventAggregator;
private readonly Logger _logger;
public ArtistScannedHandler(IAlbumMonitoredService albumMonitoredService,
IArtistService artistService,
IManageCommandQueue commandQueueManager,
IAlbumAddedService albumAddedService,
+ IEventAggregator eventAggregator,
Logger logger)
{
_albumMonitoredService = albumMonitoredService;
_artistService = artistService;
_commandQueueManager = commandQueueManager;
_albumAddedService = albumAddedService;
+ _eventAggregator = eventAggregator;
_logger = logger;
}
private void HandleScanEvents(Artist artist)
{
- if (artist.AddOptions != null)
+ var addOptions = artist.AddOptions;
+
+ if (addOptions == null)
{
- _logger.Info("[{0}] was recently added, performing post-add actions", artist.Name);
- _albumMonitoredService.SetAlbumMonitoredStatus(artist, artist.AddOptions);
-
- if (artist.AddOptions.SearchForMissingAlbums)
- {
- _commandQueueManager.Push(new MissingAlbumSearchCommand(artist.Id));
- }
-
- artist.AddOptions = null;
- _artistService.RemoveAddOptions(artist);
+ _albumAddedService.SearchForRecentlyAdded(artist.Id);
+ return;
}
- _albumAddedService.SearchForRecentlyAdded(artist.Id);
+ _logger.Info("[{0}] was recently added, performing post-add actions", artist.Name);
+ _albumMonitoredService.SetAlbumMonitoredStatus(artist, addOptions);
+
+ _eventAggregator.PublishEvent(new ArtistAddCompletedEvent(artist));
+
+ if (artist.AddOptions.SearchForMissingAlbums)
+ {
+ _commandQueueManager.Push(new MissingAlbumSearchCommand(artist.Id));
+ }
+
+ artist.AddOptions = null;
+ _artistService.RemoveAddOptions(artist);
}
public void Handle(ArtistScannedEvent message)
diff --git a/src/NzbDrone.Core/Notifications/Apprise/Apprise.cs b/src/NzbDrone.Core/Notifications/Apprise/Apprise.cs
index 59dc96f4f..893686840 100644
--- a/src/NzbDrone.Core/Notifications/Apprise/Apprise.cs
+++ b/src/NzbDrone.Core/Notifications/Apprise/Apprise.cs
@@ -27,9 +27,9 @@ public override void OnReleaseImport(AlbumDownloadMessage message)
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
}
- public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
+ public override void OnArtistAdd(ArtistAddMessage message)
{
- _proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
+ _proxy.SendNotification(ARTIST_ADDED_TITLE, message.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
@@ -37,6 +37,11 @@ public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
+ public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
+ {
+ _proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
+ }
+
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
diff --git a/src/NzbDrone.Core/Notifications/ArtistAddMessage.cs b/src/NzbDrone.Core/Notifications/ArtistAddMessage.cs
new file mode 100644
index 000000000..db03c2fac
--- /dev/null
+++ b/src/NzbDrone.Core/Notifications/ArtistAddMessage.cs
@@ -0,0 +1,15 @@
+using NzbDrone.Core.Music;
+
+namespace NzbDrone.Core.Notifications
+{
+ public class ArtistAddMessage
+ {
+ public string Message { get; set; }
+ public Artist Artist { get; set; }
+
+ public override string ToString()
+ {
+ return Message;
+ }
+ }
+}
diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
index a3225bf6a..4749a30f6 100644
--- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
+++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs
@@ -186,6 +186,45 @@ public override void OnTrackRetag(TrackRetagMessage message)
ExecuteScript(environmentVariables);
}
+ public override void OnArtistAdd(ArtistAddMessage message)
+ {
+ var artist = message.Artist;
+ var environmentVariables = new StringDictionary();
+
+ environmentVariables.Add("Lidarr_EventType", "ArtistAdd");
+ environmentVariables.Add("Lidarr_InstanceName", _configFileProvider.InstanceName);
+ environmentVariables.Add("Lidarr_ApplicationUrl", _configService.ApplicationUrl);
+ environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
+ environmentVariables.Add("Lidarr_Artist_Title", artist.Metadata.Value.Name);
+ environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
+ environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId.ToString());
+ environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type);
+ environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres));
+ environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label)));
+
+ ExecuteScript(environmentVariables);
+ }
+
+ public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
+ {
+ var artist = deleteMessage.Artist;
+ var environmentVariables = new StringDictionary();
+
+ environmentVariables.Add("Lidarr_EventType", "ArtistDeleted");
+ environmentVariables.Add("Lidarr_InstanceName", _configFileProvider.InstanceName);
+ environmentVariables.Add("Lidarr_ApplicationUrl", _configService.ApplicationUrl);
+ environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
+ environmentVariables.Add("Lidarr_Artist_Title", artist.Metadata.Value.Name);
+ environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
+ environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId.ToString());
+ environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type);
+ environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres));
+ environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label)));
+ environmentVariables.Add("Lidarr_Artist_DeletedFiles", deleteMessage.DeletedFiles.ToString());
+
+ ExecuteScript(environmentVariables);
+ }
+
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var artist = deleteMessage.Album.Artist.Value;
@@ -212,26 +251,6 @@ public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
ExecuteScript(environmentVariables);
}
- public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
- {
- var artist = deleteMessage.Artist;
- var environmentVariables = new StringDictionary();
-
- environmentVariables.Add("Lidarr_EventType", "ArtistDeleted");
- environmentVariables.Add("Lidarr_InstanceName", _configFileProvider.InstanceName);
- environmentVariables.Add("Lidarr_ApplicationUrl", _configService.ApplicationUrl);
- environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
- environmentVariables.Add("Lidarr_Artist_Title", artist.Metadata.Value.Name);
- environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
- environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId.ToString());
- environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type);
- environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres));
- environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label)));
- environmentVariables.Add("Lidarr_Artist_DeletedFiles", deleteMessage.DeletedFiles.ToString());
-
- ExecuteScript(environmentVariables);
- }
-
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
var environmentVariables = new StringDictionary();
diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs
index adf1f29a9..41c0ae0d7 100644
--- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs
+++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs
@@ -234,20 +234,20 @@ public override void OnRename(Artist artist, List renamedFiles
_proxy.SendPayload(payload, Settings);
}
- public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
+ public override void OnArtistAdd(ArtistAddMessage message)
{
- var album = deleteMessage.Album;
+ var artist = message.Artist;
var attachments = new List