New: OnDelete Notifications

Closes #1933
Closes #1936
Closes #1937
Closes #1938
Closes #1939
Closes #2189
Closes #2444
Closes #2604

Co-Authored-By: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com>
This commit is contained in:
Qstick 2022-12-24 20:42:14 -06:00
parent e67f0becad
commit cb34495e0a
41 changed files with 614 additions and 8 deletions

View file

@ -59,6 +59,8 @@ class Notification extends Component {
onReleaseImport, onReleaseImport,
onUpgrade, onUpgrade,
onRename, onRename,
onAlbumDelete,
onArtistDelete,
onHealthIssue, onHealthIssue,
onDownloadFailure, onDownloadFailure,
onImportFailure, onImportFailure,
@ -68,6 +70,8 @@ class Notification extends Component {
supportsOnReleaseImport, supportsOnReleaseImport,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnAlbumDelete,
supportsOnArtistDelete,
supportsOnHealthIssue, supportsOnHealthIssue,
supportsOnDownloadFailure, supportsOnDownloadFailure,
supportsOnImportFailure, supportsOnImportFailure,
@ -120,6 +124,20 @@ class Notification extends Component {
</Label> </Label>
} }
{
supportsOnAlbumDelete && onAlbumDelete &&
<Label kind={kinds.SUCCESS}>
{translate('OnAlbumDelete')}
</Label>
}
{
supportsOnArtistDelete && onArtistDelete &&
<Label kind={kinds.SUCCESS}>
{translate('OnArtistDelete')}
</Label>
}
{ {
supportsOnHealthIssue && onHealthIssue && supportsOnHealthIssue && onHealthIssue &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
@ -149,7 +167,7 @@ class Notification extends Component {
} }
{ {
!onGrab && !onReleaseImport && !onRename && !onTrackRetag && !onGrab && !onReleaseImport && !onRename && !onTrackRetag && !onAlbumDelete && !onArtistDelete &&
!onHealthIssue && !onDownloadFailure && !onImportFailure && !onApplicationUpdate && !onHealthIssue && !onDownloadFailure && !onImportFailure && !onApplicationUpdate &&
<Label <Label
kind={kinds.DISABLED} kind={kinds.DISABLED}
@ -187,6 +205,8 @@ Notification.propTypes = {
onReleaseImport: PropTypes.bool.isRequired, onReleaseImport: PropTypes.bool.isRequired,
onUpgrade: PropTypes.bool.isRequired, onUpgrade: PropTypes.bool.isRequired,
onRename: PropTypes.bool.isRequired, onRename: PropTypes.bool.isRequired,
onAlbumDelete: PropTypes.bool.isRequired,
onArtistDelete: PropTypes.bool.isRequired,
onHealthIssue: PropTypes.bool.isRequired, onHealthIssue: PropTypes.bool.isRequired,
onDownloadFailure: PropTypes.bool.isRequired, onDownloadFailure: PropTypes.bool.isRequired,
onImportFailure: PropTypes.bool.isRequired, onImportFailure: PropTypes.bool.isRequired,
@ -196,6 +216,8 @@ Notification.propTypes = {
supportsOnReleaseImport: PropTypes.bool.isRequired, supportsOnReleaseImport: PropTypes.bool.isRequired,
supportsOnUpgrade: PropTypes.bool.isRequired, supportsOnUpgrade: PropTypes.bool.isRequired,
supportsOnRename: PropTypes.bool.isRequired, supportsOnRename: PropTypes.bool.isRequired,
supportsOnAlbumDelete: PropTypes.bool.isRequired,
supportsOnArtistDelete: PropTypes.bool.isRequired,
supportsOnHealthIssue: PropTypes.bool.isRequired, supportsOnHealthIssue: PropTypes.bool.isRequired,
supportsOnDownloadFailure: PropTypes.bool.isRequired, supportsOnDownloadFailure: PropTypes.bool.isRequired,
supportsOnImportFailure: PropTypes.bool.isRequired, supportsOnImportFailure: PropTypes.bool.isRequired,

View file

@ -19,6 +19,8 @@ function NotificationEventItems(props) {
onReleaseImport, onReleaseImport,
onUpgrade, onUpgrade,
onRename, onRename,
onAlbumDelete,
onArtistDelete,
onHealthIssue, onHealthIssue,
onDownloadFailure, onDownloadFailure,
onImportFailure, onImportFailure,
@ -28,6 +30,8 @@ function NotificationEventItems(props) {
supportsOnReleaseImport, supportsOnReleaseImport,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnAlbumDelete,
supportsOnArtistDelete,
supportsOnHealthIssue, supportsOnHealthIssue,
includeHealthWarnings, includeHealthWarnings,
supportsOnDownloadFailure, supportsOnDownloadFailure,
@ -127,6 +131,28 @@ function NotificationEventItems(props) {
/> />
</div> </div>
<div>
<FormInputGroup
type={inputTypes.CHECK}
name="onAlbumDelete"
helpText={translate('OnAlbumDeleteHelpText')}
isDisabled={!supportsOnAlbumDelete.value}
{...onAlbumDelete}
onChange={onInputChange}
/>
</div>
<div>
<FormInputGroup
type={inputTypes.CHECK}
name="onArtistDelete"
helpText={translate('OnArtistDeleteHelpText')}
isDisabled={!supportsOnArtistDelete.value}
{...onArtistDelete}
onChange={onInputChange}
/>
</div>
<div> <div>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -162,7 +188,6 @@ function NotificationEventItems(props) {
/> />
</div> </div>
} }
</div> </div>
</div> </div>
</FormGroup> </FormGroup>

View file

@ -9,6 +9,8 @@ namespace Lidarr.Api.V1.Notifications
public bool OnReleaseImport { get; set; } public bool OnReleaseImport { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnAlbumDelete { get; set; }
public bool OnArtistDelete { get; set; }
public bool OnHealthIssue { get; set; } public bool OnHealthIssue { get; set; }
public bool OnDownloadFailure { get; set; } public bool OnDownloadFailure { get; set; }
public bool OnImportFailure { get; set; } public bool OnImportFailure { get; set; }
@ -18,6 +20,8 @@ namespace Lidarr.Api.V1.Notifications
public bool SupportsOnReleaseImport { get; set; } public bool SupportsOnReleaseImport { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnAlbumDelete { get; set; }
public bool SupportsOnArtistDelete { get; set; }
public bool SupportsOnHealthIssue { get; set; } public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; } public bool IncludeHealthWarnings { get; set; }
public bool SupportsOnDownloadFailure { get; set; } public bool SupportsOnDownloadFailure { get; set; }
@ -42,6 +46,8 @@ namespace Lidarr.Api.V1.Notifications
resource.OnReleaseImport = definition.OnReleaseImport; resource.OnReleaseImport = definition.OnReleaseImport;
resource.OnUpgrade = definition.OnUpgrade; resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnAlbumDelete = definition.OnAlbumDelete;
resource.OnArtistDelete = definition.OnArtistDelete;
resource.OnHealthIssue = definition.OnHealthIssue; resource.OnHealthIssue = definition.OnHealthIssue;
resource.OnDownloadFailure = definition.OnDownloadFailure; resource.OnDownloadFailure = definition.OnDownloadFailure;
resource.OnImportFailure = definition.OnImportFailure; resource.OnImportFailure = definition.OnImportFailure;
@ -51,6 +57,8 @@ namespace Lidarr.Api.V1.Notifications
resource.SupportsOnReleaseImport = definition.SupportsOnReleaseImport; resource.SupportsOnReleaseImport = definition.SupportsOnReleaseImport;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade; resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnAlbumDelete = definition.SupportsOnAlbumDelete;
resource.SupportsOnArtistDelete = definition.SupportsOnArtistDelete;
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue; resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings; resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
resource.SupportsOnDownloadFailure = definition.SupportsOnDownloadFailure; resource.SupportsOnDownloadFailure = definition.SupportsOnDownloadFailure;
@ -74,6 +82,8 @@ namespace Lidarr.Api.V1.Notifications
definition.OnReleaseImport = resource.OnReleaseImport; definition.OnReleaseImport = resource.OnReleaseImport;
definition.OnUpgrade = resource.OnUpgrade; definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnAlbumDelete = resource.OnAlbumDelete;
definition.OnArtistDelete = resource.OnArtistDelete;
definition.OnHealthIssue = resource.OnHealthIssue; definition.OnHealthIssue = resource.OnHealthIssue;
definition.OnDownloadFailure = resource.OnDownloadFailure; definition.OnDownloadFailure = resource.OnDownloadFailure;
definition.OnImportFailure = resource.OnImportFailure; definition.OnImportFailure = resource.OnImportFailure;
@ -83,6 +93,8 @@ namespace Lidarr.Api.V1.Notifications
definition.SupportsOnReleaseImport = resource.SupportsOnReleaseImport; definition.SupportsOnReleaseImport = resource.SupportsOnReleaseImport;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade; definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnAlbumDelete = resource.SupportsOnAlbumDelete;
definition.SupportsOnArtistDelete = resource.SupportsOnArtistDelete;
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings; definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;
definition.SupportsOnDownloadFailure = resource.SupportsOnDownloadFailure; definition.SupportsOnDownloadFailure = resource.SupportsOnDownloadFailure;

View file

@ -62,6 +62,16 @@ namespace NzbDrone.Core.Test.NotificationTests
TestLogger.Info("OnRename was called"); TestLogger.Info("OnRename was called");
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
TestLogger.Info("Album OnDelete was called");
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
TestLogger.Info("Artist OnDelete was called");
}
public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist) public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist)
{ {
TestLogger.Info("OnHealthIssue was called"); TestLogger.Info("OnHealthIssue was called");
@ -125,6 +135,8 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnImportFailure.Should().BeTrue(); notification.SupportsOnImportFailure.Should().BeTrue();
notification.SupportsOnTrackRetag.Should().BeTrue(); notification.SupportsOnTrackRetag.Should().BeTrue();
notification.SupportsOnApplicationUpdate.Should().BeTrue(); notification.SupportsOnApplicationUpdate.Should().BeTrue();
notification.SupportsOnAlbumDelete.Should().BeTrue();
notification.SupportsOnArtistDelete.Should().BeTrue();
} }
[Test] [Test]
@ -141,6 +153,8 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnImportFailure.Should().BeFalse(); notification.SupportsOnImportFailure.Should().BeFalse();
notification.SupportsOnTrackRetag.Should().BeFalse(); notification.SupportsOnTrackRetag.Should().BeFalse();
notification.SupportsOnApplicationUpdate.Should().BeFalse(); notification.SupportsOnApplicationUpdate.Should().BeFalse();
notification.SupportsOnAlbumDelete.Should().BeFalse();
notification.SupportsOnArtistDelete.Should().BeFalse();
} }
} }
} }

View file

@ -0,0 +1,15 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(062)]
public class add_on_delete_to_notifications : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Notifications").AddColumn("OnArtistDelete").AsBoolean().WithDefaultValue(false);
Alter.Table("Notifications").AddColumn("OnAlbumDelete").AsBoolean().WithDefaultValue(false);
}
}
}

View file

@ -81,6 +81,8 @@ namespace NzbDrone.Core.Datastore
.Ignore(i => i.SupportsOnReleaseImport) .Ignore(i => i.SupportsOnReleaseImport)
.Ignore(i => i.SupportsOnUpgrade) .Ignore(i => i.SupportsOnUpgrade)
.Ignore(i => i.SupportsOnRename) .Ignore(i => i.SupportsOnRename)
.Ignore(i => i.SupportsOnAlbumDelete)
.Ignore(i => i.SupportsOnArtistDelete)
.Ignore(i => i.SupportsOnHealthIssue) .Ignore(i => i.SupportsOnHealthIssue)
.Ignore(i => i.SupportsOnDownloadFailure) .Ignore(i => i.SupportsOnDownloadFailure)
.Ignore(i => i.SupportsOnImportFailure) .Ignore(i => i.SupportsOnImportFailure)

View file

@ -497,8 +497,12 @@
"NotificationTriggers": "Notification Triggers", "NotificationTriggers": "Notification Triggers",
"NoUpdatesAreAvailable": "No updates are available", "NoUpdatesAreAvailable": "No updates are available",
"Ok": "Ok", "Ok": "Ok",
"OnAlbumDeleteHelpText": "On Album Delete",
"OnAlbumDelete": "On Album Delete",
"OnArtistDelete": "On Artist Delete",
"OnApplicationUpdate": "On Application Update", "OnApplicationUpdate": "On Application Update",
"OnApplicationUpdateHelpText": "On Application Update", "OnApplicationUpdateHelpText": "On Application Update",
"OnArtistDeleteHelpText": "On Artist Delete",
"OnDownloadFailure": "On Download Failure", "OnDownloadFailure": "On Download Failure",
"OnDownloadFailureHelpText": "On Download Failure", "OnDownloadFailureHelpText": "On Download Failure",
"OnGrab": "On Grab", "OnGrab": "On Grab",

View file

@ -0,0 +1,8 @@
using NzbDrone.Common.Messaging;
namespace NzbDrone.Core.MediaFiles.Events
{
public class DeleteCompletedEvent : IEvent
{
}
}

View file

@ -30,6 +30,7 @@ namespace NzbDrone.Core.MediaFiles
private readonly IMediaFileService _mediaFileService; private readonly IMediaFileService _mediaFileService;
private readonly IArtistService _artistService; private readonly IArtistService _artistService;
private readonly IConfigService _configService; private readonly IConfigService _configService;
private readonly IEventAggregator _eventAggregator;
private readonly Logger _logger; private readonly Logger _logger;
public MediaFileDeletionService(IDiskProvider diskProvider, public MediaFileDeletionService(IDiskProvider diskProvider,
@ -37,6 +38,7 @@ namespace NzbDrone.Core.MediaFiles
IMediaFileService mediaFileService, IMediaFileService mediaFileService,
IArtistService artistService, IArtistService artistService,
IConfigService configService, IConfigService configService,
IEventAggregator eventAggregator,
Logger logger) Logger logger)
{ {
_diskProvider = diskProvider; _diskProvider = diskProvider;
@ -44,6 +46,7 @@ namespace NzbDrone.Core.MediaFiles
_mediaFileService = mediaFileService; _mediaFileService = mediaFileService;
_artistService = artistService; _artistService = artistService;
_configService = configService; _configService = configService;
_eventAggregator = eventAggregator;
_logger = logger; _logger = logger;
} }
@ -97,6 +100,8 @@ namespace NzbDrone.Core.MediaFiles
// Delete the track file from the database to clean it up even if the file was already deleted // Delete the track file from the database to clean it up even if the file was already deleted
_mediaFileService.Delete(trackFile, DeleteMediaFileReason.Manual); _mediaFileService.Delete(trackFile, DeleteMediaFileReason.Manual);
_eventAggregator.PublishEvent(new DeleteCompletedEvent());
} }
public void HandleAsync(ArtistsDeletedEvent message) public void HandleAsync(ArtistsDeletedEvent message)
@ -133,6 +138,8 @@ namespace NzbDrone.Core.MediaFiles
_recycleBinProvider.DeleteFolder(artist.Path); _recycleBinProvider.DeleteFolder(artist.Path);
} }
} }
_eventAggregator.PublishEvent(new DeleteCompletedEvent());
} }
} }
@ -141,10 +148,13 @@ namespace NzbDrone.Core.MediaFiles
if (message.DeleteFiles) if (message.DeleteFiles)
{ {
var files = _mediaFileService.GetFilesByAlbum(message.Album.Id); var files = _mediaFileService.GetFilesByAlbum(message.Album.Id);
foreach (var file in files) foreach (var file in files)
{ {
_recycleBinProvider.DeleteFile(file.Path); _recycleBinProvider.DeleteFile(file.Path);
} }
_eventAggregator.PublishEvent(new DeleteCompletedEvent());
} }
} }

View file

@ -0,0 +1,27 @@
using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications
{
public class AlbumDeleteMessage
{
public string Message { get; set; }
public Album Album { get; set; }
public bool DeletedFiles { get; set; }
public string DeletedFilesMessage { get; set; }
public override string ToString()
{
return Message;
}
public AlbumDeleteMessage(Album album, bool deleteFiles)
{
Album = album;
DeletedFiles = deleteFiles;
DeletedFilesMessage = DeletedFiles ?
"Album removed and all files were deleted" :
"Album removed, files were not deleted";
Message = album.Title + " - " + DeletedFilesMessage;
}
}
}

View file

@ -0,0 +1,28 @@
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Music;
namespace NzbDrone.Core.Notifications
{
public class ArtistDeleteMessage
{
public string Message { get; set; }
public Artist Artist { get; set; }
public bool DeletedFiles { get; set; }
public string DeletedFilesMessage { get; set; }
public override string ToString()
{
return Message;
}
public ArtistDeleteMessage(Artist artist, bool deleteFiles)
{
Artist = artist;
DeletedFiles = deleteFiles;
DeletedFilesMessage = DeletedFiles ?
"Artist removed and all files were deleted" :
"Artist removed, files were not deleted";
Message = artist.Metadata.Value.Name + " - " + DeletedFilesMessage;
}
}
}

View file

@ -26,6 +26,16 @@ namespace NzbDrone.Core.Notifications.Boxcar
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings);

View file

@ -145,6 +145,43 @@ namespace NzbDrone.Core.Notifications.CustomScript
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var artist = deleteMessage.Album.Artist.Value;
var album = deleteMessage.Album;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Lidarr_EventType", "AlbumDeleted");
environmentVariables.Add("Lidarr_Artist_Id", artist.Id.ToString());
environmentVariables.Add("Lidarr_Artist_Name", artist.Metadata.Value.Name);
environmentVariables.Add("Lidarr_Artist_Path", artist.Path);
environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId);
environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type);
environmentVariables.Add("Lidarr_Album_Id", album.Id.ToString());
environmentVariables.Add("Lidarr_Album_Title", album.Title);
environmentVariables.Add("Lidarr_Album_MBId", album.ForeignAlbumId);
environmentVariables.Add("Lidarr_Album_ReleaseDate", album.ReleaseDate.ToString());
environmentVariables.Add("Lidarr_Artist_DeletedFiles", deleteMessage.DeletedFiles.ToString());
ExecuteScript(environmentVariables);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
var artist = deleteMessage.Artist;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Lidarr_EventType", "ArtistDeleted");
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_DeletedFiles", deleteMessage.DeletedFiles.ToString());
ExecuteScript(environmentVariables);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
var environmentVariables = new StringDictionary(); var environmentVariables = new StringDictionary();

View file

@ -221,6 +221,42 @@ namespace NzbDrone.Core.Notifications.Discord
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var album = deleteMessage.Album;
var attachments = new List<Embed>
{
new Embed
{
Title = album.Title,
Description = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Album Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
var artist = deleteMessage.Artist;
var attachments = new List<Embed>
{
new Embed
{
Title = artist.Metadata.Value.Name,
Description = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Artist Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
var attachments = new List<Embed> var attachments = new List<Embed>

View file

@ -41,6 +41,20 @@ namespace NzbDrone.Core.Notifications.Email
SendEmail(Settings, ALBUM_DOWNLOADED_TITLE_BRANDED, body); SendEmail(Settings, ALBUM_DOWNLOADED_TITLE_BRANDED, body);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var body = $"{deleteMessage.Message}";
SendEmail(Settings, ALBUM_DELETED_TITLE_BRANDED, body);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
var body = $"{deleteMessage.Message}";
SendEmail(Settings, ARTIST_DELETED_TITLE_BRANDED, body);
}
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)
{ {
SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message); SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);
@ -155,7 +169,7 @@ namespace NzbDrone.Core.Notifications.Email
try try
{ {
SendEmail(settings, "Sonarr - Test Notification", body); SendEmail(settings, "Lidarr - Test Notification", body);
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -29,6 +29,16 @@ namespace NzbDrone.Core.Notifications.Gotify
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);

View file

@ -10,6 +10,8 @@ namespace NzbDrone.Core.Notifications
void OnGrab(GrabMessage grabMessage); void OnGrab(GrabMessage grabMessage);
void OnReleaseImport(AlbumDownloadMessage message); void OnReleaseImport(AlbumDownloadMessage message);
void OnRename(Artist artist); void OnRename(Artist artist);
void OnAlbumDelete(AlbumDeleteMessage deleteMessage);
void OnArtistDelete(ArtistDeleteMessage deleteMessage);
void OnHealthIssue(HealthCheck.HealthCheck healthCheck); void OnHealthIssue(HealthCheck.HealthCheck healthCheck);
void OnApplicationUpdate(ApplicationUpdateMessage updateMessage); void OnApplicationUpdate(ApplicationUpdateMessage updateMessage);
void OnDownloadFailure(DownloadFailedMessage message); void OnDownloadFailure(DownloadFailedMessage message);
@ -20,6 +22,8 @@ namespace NzbDrone.Core.Notifications
bool SupportsOnReleaseImport { get; } bool SupportsOnReleaseImport { get; }
bool SupportsOnUpgrade { get; } bool SupportsOnUpgrade { get; }
bool SupportsOnRename { get; } bool SupportsOnRename { get; }
bool SupportsOnAlbumDelete { get; }
bool SupportsOnArtistDelete { get; }
bool SupportsOnHealthIssue { get; } bool SupportsOnHealthIssue { get; }
bool SupportsOnApplicationUpdate { get; } bool SupportsOnApplicationUpdate { get; }
bool SupportsOnDownloadFailure { get; } bool SupportsOnDownloadFailure { get; }

View file

@ -27,6 +27,16 @@ namespace NzbDrone.Core.Notifications.Join
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE_BRANDED, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE_BRANDED, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, message.Message, Settings);

View file

@ -29,6 +29,16 @@ namespace NzbDrone.Core.Notifications.Mailgun
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, downloadMessage.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, downloadMessage.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheckMessage) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheckMessage)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheckMessage.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheckMessage.Message, Settings);

View file

@ -46,6 +46,32 @@ namespace NzbDrone.Core.Notifications.Emby
} }
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
if (Settings.Notify)
{
_mediaBrowserService.Notify(Settings, ALBUM_DELETED_TITLE_BRANDED, deleteMessage.Message);
}
if (Settings.UpdateLibrary)
{
_mediaBrowserService.Update(Settings, deleteMessage.Album.Artist);
}
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
if (Settings.Notify)
{
_mediaBrowserService.Notify(Settings, ARTIST_DELETED_TITLE_BRANDED, deleteMessage.Message);
}
if (Settings.UpdateLibrary)
{
_mediaBrowserService.Update(Settings, deleteMessage.Artist);
}
}
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)
{ {
if (Settings.Notify) if (Settings.Notify)

View file

@ -40,7 +40,7 @@ namespace NzbDrone.Core.Notifications.Emby
[FieldDefinition(4, Label = "Send Notifications", HelpText = "Have MediaBrowser send notifications to configured providers", Type = FieldType.Checkbox)] [FieldDefinition(4, Label = "Send Notifications", HelpText = "Have MediaBrowser send notifications to configured providers", Type = FieldType.Checkbox)]
public bool Notify { get; set; } public bool Notify { get; set; }
[FieldDefinition(5, Label = "Update Library", HelpText = "Update Library on Import & Rename?", Type = FieldType.Checkbox)] [FieldDefinition(5, Label = "Update Library", HelpText = "Update Library on Import, Rename, & Delete?", Type = FieldType.Checkbox)]
public bool UpdateLibrary { get; set; } public bool UpdateLibrary { get; set; }
[JsonIgnore] [JsonIgnore]

View file

@ -11,6 +11,8 @@ namespace NzbDrone.Core.Notifications
{ {
protected const string ALBUM_GRABBED_TITLE = "Album Grabbed"; protected const string ALBUM_GRABBED_TITLE = "Album Grabbed";
protected const string ALBUM_DOWNLOADED_TITLE = "Album Downloaded"; protected const string ALBUM_DOWNLOADED_TITLE = "Album Downloaded";
protected const string ALBUM_DELETED_TITLE = "Album Deleted";
protected const string ARTIST_DELETED_TITLE = "Artist Deleted";
protected const string HEALTH_ISSUE_TITLE = "Health Check Failure"; protected const string HEALTH_ISSUE_TITLE = "Health Check Failure";
protected const string DOWNLOAD_FAILURE_TITLE = "Download Failed"; protected const string DOWNLOAD_FAILURE_TITLE = "Download Failed";
protected const string IMPORT_FAILURE_TITLE = "Import Failed"; protected const string IMPORT_FAILURE_TITLE = "Import Failed";
@ -19,6 +21,8 @@ namespace NzbDrone.Core.Notifications
protected const string ALBUM_GRABBED_TITLE_BRANDED = "Lidarr - " + ALBUM_GRABBED_TITLE; protected const string ALBUM_GRABBED_TITLE_BRANDED = "Lidarr - " + ALBUM_GRABBED_TITLE;
protected const string ALBUM_DOWNLOADED_TITLE_BRANDED = "Lidarr - " + ALBUM_DOWNLOADED_TITLE; protected const string ALBUM_DOWNLOADED_TITLE_BRANDED = "Lidarr - " + ALBUM_DOWNLOADED_TITLE;
protected const string ALBUM_DELETED_TITLE_BRANDED = "Lidarr - " + ALBUM_DELETED_TITLE;
protected const string ARTIST_DELETED_TITLE_BRANDED = "Lidarr - " + ARTIST_DELETED_TITLE;
protected const string HEALTH_ISSUE_TITLE_BRANDED = "Lidarr - " + HEALTH_ISSUE_TITLE; protected const string HEALTH_ISSUE_TITLE_BRANDED = "Lidarr - " + HEALTH_ISSUE_TITLE;
protected const string DOWNLOAD_FAILURE_TITLE_BRANDED = "Lidarr - " + DOWNLOAD_FAILURE_TITLE; protected const string DOWNLOAD_FAILURE_TITLE_BRANDED = "Lidarr - " + DOWNLOAD_FAILURE_TITLE;
protected const string IMPORT_FAILURE_TITLE_BRANDED = "Lidarr - " + IMPORT_FAILURE_TITLE; protected const string IMPORT_FAILURE_TITLE_BRANDED = "Lidarr - " + IMPORT_FAILURE_TITLE;
@ -50,6 +54,14 @@ namespace NzbDrone.Core.Notifications
{ {
} }
public virtual void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
}
public virtual void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
}
public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
} }
@ -78,6 +90,8 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnRename => HasConcreteImplementation("OnRename"); public bool SupportsOnRename => HasConcreteImplementation("OnRename");
public bool SupportsOnReleaseImport => HasConcreteImplementation("OnReleaseImport"); public bool SupportsOnReleaseImport => HasConcreteImplementation("OnReleaseImport");
public bool SupportsOnUpgrade => SupportsOnReleaseImport; public bool SupportsOnUpgrade => SupportsOnReleaseImport;
public bool SupportsOnAlbumDelete => HasConcreteImplementation("OnAlbumDelete");
public bool SupportsOnArtistDelete => HasConcreteImplementation("OnArtistDelete");
public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue"); public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue");
public bool SupportsOnDownloadFailure => HasConcreteImplementation("OnDownloadFailure"); public bool SupportsOnDownloadFailure => HasConcreteImplementation("OnDownloadFailure");
public bool SupportsOnImportFailure => HasConcreteImplementation("OnImportFailure"); public bool SupportsOnImportFailure => HasConcreteImplementation("OnImportFailure");

View file

@ -8,6 +8,8 @@ namespace NzbDrone.Core.Notifications
public bool OnReleaseImport { get; set; } public bool OnReleaseImport { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnAlbumDelete { get; set; }
public bool OnArtistDelete { get; set; }
public bool OnHealthIssue { get; set; } public bool OnHealthIssue { get; set; }
public bool OnDownloadFailure { get; set; } public bool OnDownloadFailure { get; set; }
public bool OnImportFailure { get; set; } public bool OnImportFailure { get; set; }
@ -17,6 +19,8 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnReleaseImport { get; set; } public bool SupportsOnReleaseImport { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnAlbumDelete { get; set; }
public bool SupportsOnArtistDelete { get; set; }
public bool SupportsOnHealthIssue { get; set; } public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; } public bool IncludeHealthWarnings { get; set; }
public bool SupportsOnDownloadFailure { get; set; } public bool SupportsOnDownloadFailure { get; set; }
@ -24,6 +28,6 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnTrackRetag { get; set; } public bool SupportsOnTrackRetag { get; set; }
public bool SupportsOnApplicationUpdate { get; set; } public bool SupportsOnApplicationUpdate { get; set; }
public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnHealthIssue || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate; public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnAlbumDelete || OnArtistDelete || OnHealthIssue || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate;
} }
} }

View file

@ -14,6 +14,8 @@ namespace NzbDrone.Core.Notifications
List<INotification> OnReleaseImportEnabled(); List<INotification> OnReleaseImportEnabled();
List<INotification> OnUpgradeEnabled(); List<INotification> OnUpgradeEnabled();
List<INotification> OnRenameEnabled(); List<INotification> OnRenameEnabled();
List<INotification> OnAlbumDeleteEnabled();
List<INotification> OnArtistDeleteEnabled();
List<INotification> OnHealthIssueEnabled(); List<INotification> OnHealthIssueEnabled();
List<INotification> OnDownloadFailureEnabled(); List<INotification> OnDownloadFailureEnabled();
List<INotification> OnImportFailureEnabled(); List<INotification> OnImportFailureEnabled();
@ -48,6 +50,16 @@ namespace NzbDrone.Core.Notifications
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
} }
public List<INotification> OnAlbumDeleteEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnAlbumDelete).ToList();
}
public List<INotification> OnArtistDeleteEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnArtistDelete).ToList();
}
public List<INotification> OnHealthIssueEnabled() public List<INotification> OnHealthIssueEnabled()
{ {
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue).ToList();
@ -81,6 +93,8 @@ namespace NzbDrone.Core.Notifications
definition.SupportsOnReleaseImport = provider.SupportsOnReleaseImport; definition.SupportsOnReleaseImport = provider.SupportsOnReleaseImport;
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade; definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
definition.SupportsOnRename = provider.SupportsOnRename; definition.SupportsOnRename = provider.SupportsOnRename;
definition.SupportsOnAlbumDelete = provider.SupportsOnAlbumDelete;
definition.SupportsOnArtistDelete = provider.SupportsOnArtistDelete;
definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue;
definition.SupportsOnDownloadFailure = provider.SupportsOnDownloadFailure; definition.SupportsOnDownloadFailure = provider.SupportsOnDownloadFailure;
definition.SupportsOnImportFailure = provider.SupportsOnImportFailure; definition.SupportsOnImportFailure = provider.SupportsOnImportFailure;

View file

@ -6,6 +6,7 @@ namespace NzbDrone.Core.Notifications
{ {
public interface INotificationRepository : IProviderRepository<NotificationDefinition> public interface INotificationRepository : IProviderRepository<NotificationDefinition>
{ {
void UpdateSettings(NotificationDefinition model);
} }
public class NotificationRepository : ProviderRepository<NotificationDefinition>, INotificationRepository public class NotificationRepository : ProviderRepository<NotificationDefinition>, INotificationRepository
@ -14,5 +15,10 @@ namespace NzbDrone.Core.Notifications
: base(database, eventAggregator) : base(database, eventAggregator)
{ {
} }
public void UpdateSettings(NotificationDefinition model)
{
SetFields(model, m => m.Settings);
}
} }
} }

View file

@ -9,6 +9,7 @@ using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Music; using NzbDrone.Core.Music;
using NzbDrone.Core.Music.Events;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Update.History.Events; using NzbDrone.Core.Update.History.Events;
@ -19,13 +20,16 @@ namespace NzbDrone.Core.Notifications
: IHandle<AlbumGrabbedEvent>, : IHandle<AlbumGrabbedEvent>,
IHandle<AlbumImportedEvent>, IHandle<AlbumImportedEvent>,
IHandle<ArtistRenamedEvent>, IHandle<ArtistRenamedEvent>,
IHandle<AlbumDeletedEvent>,
IHandle<ArtistsDeletedEvent>,
IHandle<HealthCheckFailedEvent>, IHandle<HealthCheckFailedEvent>,
IHandle<DownloadFailedEvent>, IHandle<DownloadFailedEvent>,
IHandle<AlbumImportIncompleteEvent>, IHandle<AlbumImportIncompleteEvent>,
IHandle<TrackFileRetaggedEvent>, IHandle<TrackFileRetaggedEvent>,
IHandle<UpdateInstalledEvent>,
IHandleAsync<RenameCompletedEvent>, IHandleAsync<RenameCompletedEvent>,
IHandleAsync<HealthCheckCompleteEvent>, IHandleAsync<DeleteCompletedEvent>,
IHandle<UpdateInstalledEvent> IHandleAsync<HealthCheckCompleteEvent>
{ {
private readonly INotificationFactory _notificationFactory; private readonly INotificationFactory _notificationFactory;
private readonly Logger _logger; private readonly Logger _logger;
@ -200,6 +204,49 @@ namespace NzbDrone.Core.Notifications
} }
} }
public void Handle(AlbumDeletedEvent message)
{
var deleteMessage = new AlbumDeleteMessage(message.Album, message.DeleteFiles);
foreach (var notification in _notificationFactory.OnAlbumDeleteEnabled())
{
try
{
if (ShouldHandleArtist(notification.Definition, deleteMessage.Album.Artist))
{
notification.OnAlbumDelete(deleteMessage);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnDelete notification to: " + notification.Definition.Name);
}
}
}
public void Handle(ArtistsDeletedEvent message)
{
foreach (var artist in message.Artists)
{
var deleteMessage = new ArtistDeleteMessage(artist, message.DeleteFiles);
foreach (var notification in _notificationFactory.OnArtistDeleteEnabled())
{
try
{
if (ShouldHandleArtist(notification.Definition, deleteMessage.Artist))
{
notification.OnArtistDelete(deleteMessage);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnDelete notification to: " + notification.Definition.Name);
}
}
}
}
public void Handle(HealthCheckFailedEvent message) public void Handle(HealthCheckFailedEvent message)
{ {
// Don't send health check notifications during the start up grace period, // Don't send health check notifications during the start up grace period,
@ -314,6 +361,11 @@ namespace NzbDrone.Core.Notifications
ProcessQueue(); ProcessQueue();
} }
public void HandleAsync(DeleteCompletedEvent message)
{
ProcessQueue();
}
private void ProcessQueue() private void ProcessQueue()
{ {
foreach (var notification in _notificationFactory.GetAvailableProviders()) foreach (var notification in _notificationFactory.GetAvailableProviders())

View file

@ -28,6 +28,16 @@ namespace NzbDrone.Core.Notifications.Ntfy
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE_BRANDED, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE_BRANDED, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings);

View file

@ -53,6 +53,22 @@ namespace NzbDrone.Core.Notifications.Plex.Server
UpdateIfEnabled(message.Artist); UpdateIfEnabled(message.Artist);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
UpdateIfEnabled(deleteMessage.Album.Artist);
}
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
UpdateIfEnabled(deleteMessage.Artist);
}
}
private void UpdateIfEnabled(Artist artist) private void UpdateIfEnabled(Artist artist)
{ {
_plexTvService.Ping(Settings.AuthToken); _plexTvService.Ping(Settings.AuthToken);

View file

@ -26,6 +26,16 @@ namespace NzbDrone.Core.Notifications.Prowl
_prowlProxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _prowlProxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_prowlProxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_prowlProxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_prowlProxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); _prowlProxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);

View file

@ -29,6 +29,16 @@ namespace NzbDrone.Core.Notifications.PushBullet
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings);

View file

@ -26,6 +26,16 @@ namespace NzbDrone.Core.Notifications.Pushover
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);

View file

@ -29,6 +29,16 @@ namespace NzbDrone.Core.Notifications.SendGrid
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);

View file

@ -69,6 +69,38 @@ namespace NzbDrone.Core.Notifications.Slack
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = deleteMessage.Album.Title,
Text = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Album Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = deleteMessage.Artist.Metadata.Value.Name,
Text = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Artist Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
var attachments = new List<Attachment> var attachments = new List<Attachment>

View file

@ -40,6 +40,16 @@ namespace NzbDrone.Core.Notifications.Subsonic
Update(); Update();
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
Notify(Settings, ALBUM_DELETED_TITLE_BRANDED, deleteMessage.Message);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
Notify(Settings, ARTIST_DELETED_TITLE_BRANDED, deleteMessage.Message);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message); Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message);

View file

@ -54,6 +54,28 @@ namespace NzbDrone.Core.Notifications.Synology
} }
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
if (Settings.UpdateLibrary)
{
_indexerProxy.DeleteFolder(deleteMessage.Album.Artist.Value.Path);
}
}
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
if (Settings.UpdateLibrary)
{
_indexerProxy.DeleteFolder(deleteMessage.Artist.Path);
}
}
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View file

@ -26,6 +26,16 @@ namespace NzbDrone.Core.Notifications.Telegram
_proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);

View file

@ -28,6 +28,16 @@ namespace NzbDrone.Core.Notifications.Twitter
_twitterService.SendNotification($"Imported: {message.Message}", Settings); _twitterService.SendNotification($"Imported: {message.Message}", Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
_twitterService.SendNotification($"Album Deleted: {deleteMessage.Message}", Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
_twitterService.SendNotification($"Artist Deleted: {deleteMessage.Message}", Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
_twitterService.SendNotification($"Health Issue: {healthCheck.Message}", Settings); _twitterService.SendNotification($"Health Issue: {healthCheck.Message}", Settings);

View file

@ -94,6 +94,30 @@ namespace NzbDrone.Core.Notifications.Webhook
_proxy.SendWebhook(payload, Settings); _proxy.SendWebhook(payload, Settings);
} }
public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage)
{
var payload = new WebhookAlbumDeletePayload
{
EventType = WebhookEventType.AlbumDelete,
Album = new WebhookAlbum(deleteMessage.Album),
DeletedFiles = deleteMessage.DeletedFiles
};
_proxy.SendWebhook(payload, Settings);
}
public override void OnArtistDelete(ArtistDeleteMessage deleteMessage)
{
var payload = new WebhookArtistDeletePayload
{
EventType = WebhookEventType.ArtistDelete,
Artist = new WebhookArtist(deleteMessage.Artist),
DeletedFiles = deleteMessage.DeletedFiles
};
_proxy.SendWebhook(payload, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
var payload = new WebhookHealthPayload var payload = new WebhookHealthPayload

View file

@ -0,0 +1,8 @@
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookAlbumDeletePayload : WebhookPayload
{
public WebhookAlbum Album { get; set; }
public bool DeletedFiles { get; set; }
}
}

View file

@ -0,0 +1,8 @@
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookArtistDeletePayload : WebhookPayload
{
public WebhookArtist Artist { get; set; }
public bool DeletedFiles { get; set; }
}
}

View file

@ -12,8 +12,10 @@ namespace NzbDrone.Core.Notifications.Webhook
Grab, Grab,
Download, Download,
Rename, Rename,
AlbumDelete,
ArtistDelete,
Health, Health,
Retag, Retag,
ApplicationUpdate ApplicationUpdate,
} }
} }