1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-09-11 20:12:41 +02:00

New: On Movie Delete and On Movie File Delete Notifications

This commit is contained in:
Robin Dadswell 2021-03-05 23:30:08 +00:00 committed by GitHub
parent 24de3fdee6
commit 5926ca5d8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 721 additions and 96 deletions

View File

@ -59,13 +59,17 @@ class Notification extends Component {
onDownload, onDownload,
onUpgrade, onUpgrade,
onRename, onRename,
onDelete, onMovieDelete,
onMovieFileDelete,
onMovieFileDeleteForUpgrade,
onHealthIssue, onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnDelete, supportsOnMovieDelete,
supportsOnMovieFileDelete,
supportsOnMovieFileDeleteForUpgrade,
supportsOnHealthIssue supportsOnHealthIssue
} = this.props; } = this.props;
@ -80,55 +84,78 @@ class Notification extends Component {
</div> </div>
{ {
supportsOnGrab && onGrab && supportsOnGrab && onGrab ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{translate('OnGrab')} {translate('OnGrab')}
</Label> </Label> :
null
} }
{ {
supportsOnDelete && onDelete && supportsOnDownload && onDownload ?
<Label kind={kinds.SUCCESS}>
{translate('OnDelete')}
</Label>
}
{
supportsOnDownload && onDownload &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{translate('OnImport')} {translate('OnImport')}
</Label> </Label> :
null
} }
{ {
supportsOnUpgrade && onDownload && onUpgrade && supportsOnUpgrade && onDownload && onUpgrade ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{translate('OnUpgrade')} {translate('OnUpgrade')}
</Label> </Label> :
null
} }
{ {
supportsOnRename && onRename && supportsOnRename && onRename ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{translate('OnRename')} {translate('OnRename')}
</Label> </Label> :
null
} }
{ {
supportsOnHealthIssue && onHealthIssue && supportsOnHealthIssue && onHealthIssue ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{translate('OnHealthIssue')} {translate('OnHealthIssue')}
</Label> </Label> :
null
} }
{ {
!onGrab && !onDownload && !onRename && !onHealthIssue && !onDelete && supportsOnMovieDelete && onMovieDelete ?
<Label kind={kinds.SUCCESS}>
{translate('OnMovieDelete')}
</Label> :
null
}
{
supportsOnMovieFileDelete && onMovieFileDelete ?
<Label kind={kinds.SUCCESS}>
{translate('OnMovieFileDelete')}
</Label> :
null
}
{
supportsOnMovieFileDeleteForUpgrade && onMovieFileDelete && onMovieFileDeleteForUpgrade ?
<Label kind={kinds.SUCCESS}>
{translate('OnMovieFileDeleteForUpgrade')}
</Label> :
null
}
{
!onGrab && !onDownload && !onRename && !onHealthIssue && !onMovieDelete && !onMovieFileDelete ?
<Label <Label
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
{translate('Disabled')} {translate('Disabled')}
</Label> </Label> :
null
} }
<EditNotificationModalConnector <EditNotificationModalConnector
@ -159,11 +186,15 @@ Notification.propTypes = {
onDownload: PropTypes.bool.isRequired, onDownload: PropTypes.bool.isRequired,
onUpgrade: PropTypes.bool.isRequired, onUpgrade: PropTypes.bool.isRequired,
onRename: PropTypes.bool.isRequired, onRename: PropTypes.bool.isRequired,
onDelete: PropTypes.bool.isRequired, onMovieDelete: PropTypes.bool.isRequired,
onMovieFileDelete: PropTypes.bool.isRequired,
onMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
onHealthIssue: PropTypes.bool.isRequired, onHealthIssue: PropTypes.bool.isRequired,
supportsOnGrab: PropTypes.bool.isRequired, supportsOnGrab: PropTypes.bool.isRequired,
supportsOnDownload: PropTypes.bool.isRequired, supportsOnDownload: PropTypes.bool.isRequired,
supportsOnDelete: PropTypes.bool.isRequired, supportsOnMovieDelete: PropTypes.bool.isRequired,
supportsOnMovieFileDelete: PropTypes.bool.isRequired,
supportsOnMovieFileDeleteForUpgrade: PropTypes.bool.isRequired,
supportsOnUpgrade: PropTypes.bool.isRequired, supportsOnUpgrade: PropTypes.bool.isRequired,
supportsOnRename: PropTypes.bool.isRequired, supportsOnRename: PropTypes.bool.isRequired,
supportsOnHealthIssue: PropTypes.bool.isRequired, supportsOnHealthIssue: PropTypes.bool.isRequired,

View File

@ -19,13 +19,17 @@ function NotificationEventItems(props) {
onDownload, onDownload,
onUpgrade, onUpgrade,
onRename, onRename,
onDelete, onMovieDelete,
onMovieFileDelete,
onMovieFileDeleteForUpgrade,
onHealthIssue, onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnDelete, supportsOnMovieDelete,
supportsOnMovieFileDelete,
supportsOnMovieFileDeleteForUpgrade,
supportsOnHealthIssue, supportsOnHealthIssue,
includeHealthWarnings includeHealthWarnings
} = item; } = item;
@ -89,14 +93,39 @@ function NotificationEventItems(props) {
<div> <div>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="onDelete" name="onMovieDelete"
helpText={translate('OnDeleteHelpText')} helpText={translate('OnMovieDeleteHelpText')}
isDisabled={!supportsOnDelete.value} isDisabled={!supportsOnMovieDelete.value}
{...onDelete} {...onMovieDelete}
onChange={onInputChange} onChange={onInputChange}
/> />
</div> </div>
<div>
<FormInputGroup
type={inputTypes.CHECK}
name="onMovieFileDelete"
helpText={translate('OnMovieFileDeleteHelpText')}
isDisabled={!supportsOnMovieFileDelete.value}
{...onMovieFileDelete}
onChange={onInputChange}
/>
</div>
{
onMovieFileDelete.value &&
<div>
<FormInputGroup
type={inputTypes.CHECK}
name="onMovieFileDeleteForUpgrade"
helpText={translate('OnMovieFileDeleteForUpgradeHelpText')}
isDisabled={!supportsOnMovieFileDeleteForUpgrade.value}
{...onMovieFileDeleteForUpgrade}
onChange={onInputChange}
/>
</div>
}
<div> <div>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

View File

@ -106,6 +106,9 @@ export default {
selectedSchema.onDownload = selectedSchema.supportsOnDownload; selectedSchema.onDownload = selectedSchema.supportsOnDownload;
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade; selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
selectedSchema.onRename = selectedSchema.supportsOnRename; selectedSchema.onRename = selectedSchema.supportsOnRename;
selectedSchema.OnMovieDelete = selectedSchema.supportsOnMovieDelete;
selectedSchema.OnMovieFileDelete = selectedSchema.supportsOnMovieFileDelete;
selectedSchema.OnMovieFileDeleteForUpgrade = selectedSchema.supportsOnMovieFileDeleteForUpgrade;
return selectedSchema; return selectedSchema;
}); });

View File

@ -1,4 +1,4 @@
using NzbDrone.Core.Notifications; using NzbDrone.Core.Notifications;
namespace NzbDrone.Api.Notifications namespace NzbDrone.Api.Notifications
{ {
@ -17,12 +17,16 @@ protected override void MapToResource(NotificationResource resource, Notificatio
resource.OnDownload = definition.OnDownload; resource.OnDownload = definition.OnDownload;
resource.OnUpgrade = definition.OnUpgrade; resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnDelete = definition.OnDelete; resource.OnMovieDelete = definition.OnMovieDelete;
resource.OnMovieFileDelete = definition.OnMovieFileDelete;
resource.OnMovieFileDeleteForUpgrade = definition.OnMovieFileDeleteForUpgrade;
resource.SupportsOnGrab = definition.SupportsOnGrab; resource.SupportsOnGrab = definition.SupportsOnGrab;
resource.SupportsOnDownload = definition.SupportsOnDownload; resource.SupportsOnDownload = definition.SupportsOnDownload;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade; resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnDelete = definition.SupportsOnDelete; resource.SupportsOnMovieDelete = definition.SupportsOnMovieDelete;
resource.SupportsOnMovieFileDelete = definition.SupportsOnMovieFileDelete;
resource.SupportsOnMovieFileDeleteForUpgrade = definition.SupportsOnMovieFileDeleteForUpgrade;
resource.Tags = definition.Tags; resource.Tags = definition.Tags;
} }
@ -34,12 +38,16 @@ protected override void MapToModel(NotificationDefinition definition, Notificati
definition.OnDownload = resource.OnDownload; definition.OnDownload = resource.OnDownload;
definition.OnUpgrade = resource.OnUpgrade; definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnDelete = resource.OnDelete; definition.OnMovieDelete = resource.OnMovieDelete;
definition.OnMovieFileDelete = resource.OnMovieFileDelete;
definition.OnMovieFileDeleteForUpgrade = resource.OnMovieFileDeleteForUpgrade;
definition.SupportsOnGrab = resource.SupportsOnGrab; definition.SupportsOnGrab = resource.SupportsOnGrab;
definition.SupportsOnDownload = resource.SupportsOnDownload; definition.SupportsOnDownload = resource.SupportsOnDownload;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade; definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnDelete = resource.SupportsOnDelete; definition.SupportsOnMovieDelete = resource.SupportsOnMovieDelete;
definition.SupportsOnMovieFileDelete = resource.SupportsOnMovieFileDelete;
definition.SupportsOnMovieFileDeleteForUpgrade = resource.SupportsOnMovieFileDeleteForUpgrade;
definition.Tags = resource.Tags; definition.Tags = resource.Tags;
} }

View File

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace NzbDrone.Api.Notifications namespace NzbDrone.Api.Notifications
{ {
@ -8,12 +8,16 @@ public class NotificationResource : ProviderResource<NotificationResource>
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnDelete { get; set; } public bool OnMovieDelete { get; set; }
public bool OnMovieFileDelete { get; set; }
public bool OnMovieFileDeleteForUpgrade { get; set; }
public bool SupportsOnGrab { get; set; } public bool SupportsOnGrab { get; set; }
public bool SupportsOnDownload { get; set; } public bool SupportsOnDownload { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnDelete { get; set; } public bool SupportsOnMovieDelete { get; set; }
public bool SupportsOnMovieFileDelete { get; set; }
public bool SupportsOnMovieFileDeleteForUpgrade { get; set; }
public HashSet<int> Tags { get; set; } public HashSet<int> Tags { get; set; }
} }
} }

View File

@ -1,4 +1,4 @@
using System; using System;
using FluentAssertions; using FluentAssertions;
using FluentValidation.Results; using FluentValidation.Results;
using NUnit.Framework; using NUnit.Framework;
@ -62,9 +62,14 @@ public override void OnMovieRename(Movie movie)
TestLogger.Info("OnRename was called"); TestLogger.Info("OnRename was called");
} }
public override void OnDelete(DeleteMessage message) public override void OnMovieFileDelete(MovieFileDeleteMessage message)
{ {
TestLogger.Info("OnDelete was called"); TestLogger.Info("OnMovieFileDelete was called");
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
TestLogger.Info("OnMovieDelete was called");
} }
public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist) public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist)
@ -105,7 +110,9 @@ public void should_support_all_if_implemented()
notification.SupportsOnDownload.Should().BeTrue(); notification.SupportsOnDownload.Should().BeTrue();
notification.SupportsOnUpgrade.Should().BeTrue(); notification.SupportsOnUpgrade.Should().BeTrue();
notification.SupportsOnRename.Should().BeTrue(); notification.SupportsOnRename.Should().BeTrue();
notification.SupportsOnDelete.Should().BeTrue(); notification.SupportsOnMovieDelete.Should().BeTrue();
notification.SupportsOnMovieFileDelete.Should().BeTrue();
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeTrue();
notification.SupportsOnHealthIssue.Should().BeTrue(); notification.SupportsOnHealthIssue.Should().BeTrue();
} }
@ -118,7 +125,9 @@ public void should_support_none_if_none_are_implemented()
notification.SupportsOnDownload.Should().BeFalse(); notification.SupportsOnDownload.Should().BeFalse();
notification.SupportsOnUpgrade.Should().BeFalse(); notification.SupportsOnUpgrade.Should().BeFalse();
notification.SupportsOnRename.Should().BeFalse(); notification.SupportsOnRename.Should().BeFalse();
notification.SupportsOnDelete.Should().BeFalse(); notification.SupportsOnMovieDelete.Should().BeFalse();
notification.SupportsOnMovieFileDelete.Should().BeFalse();
notification.SupportsOnMovieFileDeleteForUpgrade.Should().BeFalse();
notification.SupportsOnHealthIssue.Should().BeFalse(); notification.SupportsOnHealthIssue.Should().BeFalse();
} }
} }

View File

@ -0,0 +1,16 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(192)]
public class add_on_delete_to_notifications : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Rename.Column("OnDelete").OnTable("Notifications").To("OnMovieDelete");
Alter.Table("Notifications").AddColumn("OnMovieFileDelete").AsBoolean().WithDefaultValue(0);
Alter.Table("Notifications").AddColumn("OnMovieFileDeleteForUpgrade").AsBoolean().WithDefaultValue(0);
}
}
}

View File

@ -87,7 +87,9 @@ public static void Map()
.Ignore(i => i.SupportsOnDownload) .Ignore(i => i.SupportsOnDownload)
.Ignore(i => i.SupportsOnUpgrade) .Ignore(i => i.SupportsOnUpgrade)
.Ignore(i => i.SupportsOnRename) .Ignore(i => i.SupportsOnRename)
.Ignore(i => i.SupportsOnDelete) .Ignore(i => i.SupportsOnMovieDelete)
.Ignore(i => i.SupportsOnMovieFileDelete)
.Ignore(i => i.SupportsOnMovieFileDeleteForUpgrade)
.Ignore(i => i.SupportsOnHealthIssue); .Ignore(i => i.SupportsOnHealthIssue);
Mapper.Entity<MetadataDefinition>("Metadata").RegisterModel() Mapper.Entity<MetadataDefinition>("Metadata").RegisterModel()

View File

@ -612,8 +612,6 @@
"NoVideoFilesFoundSelectedFolder": "No video files were found in the selected folder", "NoVideoFilesFoundSelectedFolder": "No video files were found in the selected folder",
"OAuthPopupMessage": "Pop-ups are being blocked by your browser", "OAuthPopupMessage": "Pop-ups are being blocked by your browser",
"Ok": "Ok", "Ok": "Ok",
"OnDelete": "On Delete",
"OnDeleteHelpText": "On Delete",
"OnDownloadHelpText": "On Import", "OnDownloadHelpText": "On Import",
"OnGrab": "On Grab", "OnGrab": "On Grab",
"OnGrabHelpText": "On Grab", "OnGrabHelpText": "On Grab",
@ -623,8 +621,15 @@
"OnLatestVersion": "The latest version of Radarr is already installed", "OnLatestVersion": "The latest version of Radarr is already installed",
"OnlyTorrent": "Only Torrent", "OnlyTorrent": "Only Torrent",
"OnlyUsenet": "Only Usenet", "OnlyUsenet": "Only Usenet",
"OnMovieDelete": "On Movie Delete",
"OnMovieDeleteHelpText": "On Movie Delete",
"OnMovieFileDelete": "On Movie File Delete",
"OnMovieFileDeleteHelpText": "On Movie File Delete",
"OnMovieFileDeleteForUpgrade": "On Movie File Delete For Upgrade",
"OnMovieFileDeleteForUpgradeHelpText": "On Movie File Delete For Upgrade",
"OnRename": "On Rename", "OnRename": "On Rename",
"OnRenameHelpText": "On Rename", "OnRenameHelpText": "On Rename",
"OnUpgrade": "On Upgrade",
"OnUpgradeHelpText": "On Upgrade", "OnUpgradeHelpText": "On Upgrade",
"OpenBrowserOnStart": "Open browser on start", "OpenBrowserOnStart": "Open browser on start",
"OpenThisModal": "Open This Modal", "OpenThisModal": "Open This Modal",

View File

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

View File

@ -28,6 +28,7 @@ public class MediaFileDeletionService : IDeleteMediaFiles,
private readonly IMediaFileService _mediaFileService; private readonly IMediaFileService _mediaFileService;
private readonly IMovieService _movieService; private readonly IMovieService _movieService;
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,
@ -35,6 +36,7 @@ public MediaFileDeletionService(IDiskProvider diskProvider,
IMediaFileService mediaFileService, IMediaFileService mediaFileService,
IMovieService movieService, IMovieService movieService,
IConfigService configService, IConfigService configService,
IEventAggregator eventAggregator,
Logger logger) Logger logger)
{ {
_diskProvider = diskProvider; _diskProvider = diskProvider;
@ -42,6 +44,7 @@ public MediaFileDeletionService(IDiskProvider diskProvider,
_mediaFileService = mediaFileService; _mediaFileService = mediaFileService;
_movieService = movieService; _movieService = movieService;
_configService = configService; _configService = configService;
_eventAggregator = eventAggregator;
_logger = logger; _logger = logger;
} }
@ -81,6 +84,8 @@ public void DeleteMovieFile(Movie movie, MovieFile movieFile)
// Delete the movie file from the database to clean it up even if the file was already deleted // Delete the movie file from the database to clean it up even if the file was already deleted
_mediaFileService.Delete(movieFile, DeleteMediaFileReason.Manual); _mediaFileService.Delete(movieFile, DeleteMediaFileReason.Manual);
_eventAggregator.PublishEvent(new DeleteCompletedEvent());
} }
public void HandleAsync(MoviesDeletedEvent message) public void HandleAsync(MoviesDeletedEvent message)
@ -116,6 +121,8 @@ public void HandleAsync(MoviesDeletedEvent message)
_recycleBinProvider.DeleteFolder(movie.Path); _recycleBinProvider.DeleteFolder(movie.Path);
} }
} }
_eventAggregator.PublishEvent(new DeleteCompletedEvent());
} }
} }

View File

@ -26,6 +26,16 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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

@ -117,6 +117,55 @@ public override void OnMovieRename(Movie movie)
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var movieFile = deleteMessage.MovieFile;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Radarr_EventType", "MovieFileDelete");
environmentVariables.Add("Radarr_MovieFile_DeleteReason", deleteMessage.Reason.ToString());
environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString());
environmentVariables.Add("Radarr_Movie_Title", movie.Title);
environmentVariables.Add("Radarr_Movie_Year", movie.Year.ToString());
environmentVariables.Add("Radarr_Movie_Path", movie.Path);
environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId ?? string.Empty);
environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString());
environmentVariables.Add("Radarr_MovieFile_Id", movieFile.Id.ToString());
environmentVariables.Add("Radarr_MovieFile_RelativePath", movieFile.RelativePath);
environmentVariables.Add("Radarr_MovieFile_Path", Path.Combine(movie.Path, movieFile.RelativePath));
environmentVariables.Add("Radarr_MovieFile_Size", movieFile.Size.ToString());
environmentVariables.Add("Radarr_MovieFile_Quality", movieFile.Quality.Quality.Name);
environmentVariables.Add("Radarr_MovieFile_QualityVersion", movieFile.Quality.Revision.Version.ToString());
environmentVariables.Add("Radarr_MovieFile_ReleaseGroup", movieFile.ReleaseGroup ?? string.Empty);
environmentVariables.Add("Radarr_MovieFile_SceneName", movieFile.SceneName ?? string.Empty);
ExecuteScript(environmentVariables);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Radarr_EventType", "MovieDelete");
environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString());
environmentVariables.Add("Radarr_Movie_Title", movie.Title);
environmentVariables.Add("Radarr_Movie_Year", movie.Year.ToString());
environmentVariables.Add("Radarr_Movie_Path", movie.Path);
environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId ?? string.Empty);
environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString());
environmentVariables.Add("Radarr_Movie_DeletedFiles", deleteMessage.DeletedFiles.ToString());
if (deleteMessage.DeletedFiles && movie.MovieFile != null)
{
environmentVariables.Add("Radarr_Movie_Folder_Size", movie.MovieFile.Size.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

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
@ -212,6 +213,43 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var attachments = new List<Embed>
{
new Embed
{
Title = movie.Title,
Description = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Movie Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var fullPath = Path.Combine(deleteMessage.Movie.Path, deleteMessage.MovieFile.RelativePath);
var attachments = new List<Embed>
{
new Embed
{
Title = movie.Title,
Description = deleteMessage.MovieFile.Path
}
};
var payload = CreatePayload("Movie File 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

@ -86,6 +86,54 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(variables, Settings); _proxy.SendNotification(variables, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var movieFile = deleteMessage.MovieFile;
var variables = new StringDictionary();
variables.Add("Radarr_EventType", "MovieFileDelete");
variables.Add("Radarr_MovieFile_DeleteReason", deleteMessage.Reason.ToString());
variables.Add("Radarr_Movie_Id", movie.Id.ToString());
variables.Add("Radarr_Movie_Title", movie.Title);
variables.Add("Radarr_Movie_Year", movie.Year.ToString());
variables.Add("Radarr_Movie_Path", movie.Path);
variables.Add("Radarr_Movie_ImdbId", movie.ImdbId ?? string.Empty);
variables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString());
variables.Add("Radarr_MovieFile_Id", movieFile.Id.ToString());
variables.Add("Radarr_MovieFile_RelativePath", movieFile.RelativePath);
variables.Add("Radarr_MovieFile_Path", Path.Combine(movie.Path, movieFile.RelativePath));
variables.Add("Radarr_MovieFile_Size", movieFile.Size.ToString());
variables.Add("Radarr_MovieFile_Quality", movieFile.Quality.Quality.Name);
variables.Add("Radarr_MovieFile_QualityVersion", movieFile.Quality.Revision.Version.ToString());
variables.Add("Radarr_MovieFile_ReleaseGroup", movieFile.ReleaseGroup ?? string.Empty);
variables.Add("Radarr_MovieFile_SceneName", movieFile.SceneName ?? string.Empty);
_proxy.SendNotification(variables, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var movie = deleteMessage.Movie;
var variables = new StringDictionary();
variables.Add("Radarr_EventType", "MovieDelete");
variables.Add("Radarr_Movie_Id", movie.Id.ToString());
variables.Add("Radarr_Movie_Title", movie.Title);
variables.Add("Radarr_Movie_Year", movie.Year.ToString());
variables.Add("Radarr_Movie_Path", movie.Path);
variables.Add("Radarr_Movie_ImdbId", movie.ImdbId ?? string.Empty);
variables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString());
variables.Add("Radarr_Movie_DeletedFiles", deleteMessage.DeletedFiles.ToString());
if (deleteMessage.DeletedFiles && movie.MovieFile != null)
{
variables.Add("Radarr_Movie_Folder_Size", movie.MovieFile.Size.ToString());
}
_proxy.SendNotification(variables, Settings);
}
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
var variables = new StringDictionary(); var variables = new StringDictionary();

View File

@ -31,6 +31,20 @@ public override void OnDownload(DownloadMessage message)
_emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body); _emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var body = $"{deleteMessage.Message} deleted.";
_emailService.SendEmail(Settings, MOVIE_FILE_DELETED_TITLE_BRANDED, body);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var body = $"{deleteMessage.Message}";
_emailService.SendEmail(Settings, MOVIE_DELETED_TITLE_BRANDED, body);
}
public override void OnHealthIssue(HealthCheck.HealthCheck message) public override void OnHealthIssue(HealthCheck.HealthCheck message)
{ {
_emailService.SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message); _emailService.SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);

View File

@ -29,6 +29,16 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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,14 +10,17 @@ public interface INotification : IProvider
void OnGrab(GrabMessage grabMessage); void OnGrab(GrabMessage grabMessage);
void OnDownload(DownloadMessage message); void OnDownload(DownloadMessage message);
void OnMovieRename(Movie movie); void OnMovieRename(Movie movie);
void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage);
void OnMovieDelete(MovieDeleteMessage deleteMessage);
void OnHealthIssue(HealthCheck.HealthCheck healthCheck); void OnHealthIssue(HealthCheck.HealthCheck healthCheck);
void OnDelete(DeleteMessage deleteMessage);
void ProcessQueue(); void ProcessQueue();
bool SupportsOnGrab { get; } bool SupportsOnGrab { get; }
bool SupportsOnDownload { get; } bool SupportsOnDownload { get; }
bool SupportsOnUpgrade { get; } bool SupportsOnUpgrade { get; }
bool SupportsOnRename { get; } bool SupportsOnRename { get; }
bool SupportsOnMovieDelete { get; }
bool SupportsOnMovieFileDelete { get; }
bool SupportsOnMovieFileDeleteForUpgrade { get; }
bool SupportsOnHealthIssue { get; } bool SupportsOnHealthIssue { get; }
bool SupportsOnDelete { get; }
} }
} }

View File

@ -27,6 +27,16 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE_BRANDED, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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

@ -0,0 +1,28 @@
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Movies;
namespace NzbDrone.Core.Notifications
{
public class MovieDeleteMessage
{
public string Message { get; set; }
public Movie Movie { get; set; }
public bool DeletedFiles { get; set; }
public string DeletedFilesMessage { get; set; }
public override string ToString()
{
return Message;
}
public MovieDeleteMessage(Movie movie, bool deleteFiles)
{
Movie = movie;
DeletedFiles = deleteFiles;
DeletedFilesMessage = DeletedFiles ?
"Movie removed and all files were deleted" :
"Movie removed, files were not deleted";
Message = movie.Title + " - " + DeletedFilesMessage;
}
}
}

View File

@ -0,0 +1,19 @@
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Movies;
namespace NzbDrone.Core.Notifications
{
public class MovieFileDeleteMessage
{
public string Message { get; set; }
public Movie Movie { get; set; }
public MovieFile MovieFile { get; set; }
public DeleteMediaFileReason Reason { get; set; }
public override string ToString()
{
return Message;
}
}
}

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
@ -11,10 +12,14 @@ public abstract class NotificationBase<TSettings> : INotification
{ {
protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed"; protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed";
protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded"; protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded";
protected const string MOVIE_DELETED_TITLE = "Movie Deleted";
protected const string MOVIE_FILE_DELETED_TITLE = "Movie File Deleted";
protected const string HEALTH_ISSUE_TITLE = "Health Check Failure"; protected const string HEALTH_ISSUE_TITLE = "Health Check Failure";
protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE; protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE;
protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE; protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE;
protected const string MOVIE_DELETED_TITLE_BRANDED = "Radarr - " + MOVIE_DELETED_TITLE;
protected const string MOVIE_FILE_DELETED_TITLE_BRANDED = "Radarr - " + MOVIE_FILE_DELETED_TITLE;
protected const string HEALTH_ISSUE_TITLE_BRANDED = "Radarr - " + HEALTH_ISSUE_TITLE; protected const string HEALTH_ISSUE_TITLE_BRANDED = "Radarr - " + HEALTH_ISSUE_TITLE;
public abstract string Name { get; } public abstract string Name { get; }
@ -42,11 +47,15 @@ public virtual void OnMovieRename(Movie movie)
{ {
} }
public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public virtual void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{ {
} }
public virtual void OnDelete(DeleteMessage deleteMessage) public virtual void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
}
public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{ {
} }
@ -58,8 +67,10 @@ public virtual void ProcessQueue()
public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename"); public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename");
public bool SupportsOnDownload => HasConcreteImplementation("OnDownload"); public bool SupportsOnDownload => HasConcreteImplementation("OnDownload");
public bool SupportsOnUpgrade => SupportsOnDownload; public bool SupportsOnUpgrade => SupportsOnDownload;
public bool SupportsOnMovieDelete => HasConcreteImplementation("OnMovieDelete");
public bool SupportsOnMovieFileDelete => HasConcreteImplementation("OnMovieFileDelete");
public bool SupportsOnMovieFileDeleteForUpgrade => SupportsOnMovieFileDelete;
public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue"); public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue");
public bool SupportsOnDelete => HasConcreteImplementation("OnDelete");
protected TSettings Settings => (TSettings)Definition.Settings; protected TSettings Settings => (TSettings)Definition.Settings;

View File

@ -8,16 +8,20 @@ public class NotificationDefinition : ProviderDefinition
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnMovieDelete { get; set; }
public bool OnMovieFileDelete { get; set; }
public bool OnMovieFileDeleteForUpgrade { get; set; }
public bool OnHealthIssue { get; set; } public bool OnHealthIssue { get; set; }
public bool OnDelete { get; set; }
public bool SupportsOnGrab { get; set; } public bool SupportsOnGrab { get; set; }
public bool SupportsOnDownload { get; set; } public bool SupportsOnDownload { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnMovieDelete { get; set; }
public bool SupportsOnMovieFileDelete { get; set; }
public bool SupportsOnMovieFileDeleteForUpgrade { get; set; }
public bool SupportsOnHealthIssue { get; set; } public bool SupportsOnHealthIssue { get; set; }
public bool SupportsOnDelete { get; set; }
public bool IncludeHealthWarnings { get; set; } public bool IncludeHealthWarnings { get; set; }
public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnHealthIssue || OnDelete; public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnMovieDelete || OnMovieFileDelete || OnMovieFileDeleteForUpgrade || OnHealthIssue;
} }
} }

View File

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Common.Composition; using NzbDrone.Common.Composition;
@ -13,8 +13,9 @@ public interface INotificationFactory : IProviderFactory<INotification, Notifica
List<INotification> OnDownloadEnabled(); List<INotification> OnDownloadEnabled();
List<INotification> OnUpgradeEnabled(); List<INotification> OnUpgradeEnabled();
List<INotification> OnRenameEnabled(); List<INotification> OnRenameEnabled();
List<INotification> OnMovieDeleteEnabled();
List<INotification> OnMovieFileDeleteEnabled();
List<INotification> OnHealthIssueEnabled(); List<INotification> OnHealthIssueEnabled();
List<INotification> OnDeleteEnabled();
} }
public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory
@ -44,16 +45,26 @@ public List<INotification> OnRenameEnabled()
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
} }
public List<INotification> OnMovieDeleteEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnMovieDelete).ToList();
}
public List<INotification> OnMovieFileDeleteEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnMovieFileDelete).ToList();
}
public List<INotification> OnMovieFileDeleteForUpgradeEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnMovieFileDeleteForUpgrade).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();
} }
public List<INotification> OnDeleteEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnDelete).ToList();
}
public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition) public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition)
{ {
base.SetProviderCharacteristics(provider, definition); base.SetProviderCharacteristics(provider, definition);
@ -62,8 +73,10 @@ public override void SetProviderCharacteristics(INotification provider, Notifica
definition.SupportsOnDownload = provider.SupportsOnDownload; definition.SupportsOnDownload = provider.SupportsOnDownload;
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade; definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
definition.SupportsOnRename = provider.SupportsOnRename; definition.SupportsOnRename = provider.SupportsOnRename;
definition.SupportsOnMovieDelete = provider.SupportsOnMovieDelete;
definition.SupportsOnMovieFileDelete = provider.SupportsOnMovieFileDelete;
definition.SupportsOnMovieFileDeleteForUpgrade = provider.SupportsOnMovieFileDeleteForUpgrade;
definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue;
definition.SupportsOnDelete = provider.SupportsOnDelete;
} }
} }
} }

View File

@ -7,6 +7,7 @@
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.Movies.Events;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
@ -16,8 +17,10 @@ public class NotificationService
: IHandle<MovieRenamedEvent>, : IHandle<MovieRenamedEvent>,
IHandle<MovieGrabbedEvent>, IHandle<MovieGrabbedEvent>,
IHandle<MovieDownloadedEvent>, IHandle<MovieDownloadedEvent>,
IHandle<HealthCheckFailedEvent>, IHandle<MoviesDeletedEvent>,
IHandle<MovieFileDeletedEvent>, IHandle<MovieFileDeletedEvent>,
IHandle<HealthCheckFailedEvent>,
IHandleAsync<DeleteCompletedEvent>,
IHandleAsync<DownloadsProcessedEvent>, IHandleAsync<DownloadsProcessedEvent>,
IHandleAsync<RenameCompletedEvent>, IHandleAsync<RenameCompletedEvent>,
IHandleAsync<HealthCheckCompleteEvent> IHandleAsync<HealthCheckCompleteEvent>
@ -159,6 +162,56 @@ public void Handle(MovieRenamedEvent message)
} }
} }
public void Handle(MovieFileDeletedEvent message)
{
var deleteMessage = new MovieFileDeleteMessage();
deleteMessage.Message = GetMessage(message.MovieFile.Movie, message.MovieFile.Quality);
deleteMessage.MovieFile = message.MovieFile;
deleteMessage.Movie = message.MovieFile.Movie;
deleteMessage.Reason = message.Reason;
foreach (var notification in _notificationFactory.OnMovieFileDeleteEnabled())
{
try
{
if (message.Reason != MediaFiles.DeleteMediaFileReason.Upgrade || ((NotificationDefinition)notification.Definition).OnMovieFileDeleteForUpgrade)
{
if (ShouldHandleMovie(notification.Definition, message.MovieFile.Movie))
{
notification.OnMovieFileDelete(deleteMessage);
}
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnMovieFileDelete notification to: " + notification.Definition.Name);
}
}
}
public void Handle(MoviesDeletedEvent message)
{
foreach (Movie movie in message.Movies)
{
var deleteMessage = new MovieDeleteMessage(movie, message.DeleteFiles);
foreach (var notification in _notificationFactory.OnMovieDeleteEnabled())
{
try
{
if (ShouldHandleMovie(notification.Definition, deleteMessage.Movie))
{
notification.OnMovieDelete(deleteMessage);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnMovieDelete notification to: " + notification.Definition.Name);
}
}
}
}
public void Handle(HealthCheckFailedEvent message) public void Handle(HealthCheckFailedEvent message)
{ {
foreach (var notification in _notificationFactory.OnHealthIssueEnabled()) foreach (var notification in _notificationFactory.OnHealthIssueEnabled())
@ -177,28 +230,9 @@ public void Handle(HealthCheckFailedEvent message)
} }
} }
public void Handle(MovieFileDeletedEvent message) public void HandleAsync(DeleteCompletedEvent message)
{ {
var deleteMessage = new DeleteMessage(); ProcessQueue();
deleteMessage.Message = GetMessage(message.MovieFile.Movie, message.MovieFile.Quality);
deleteMessage.MovieFile = message.MovieFile;
deleteMessage.Movie = message.MovieFile.Movie;
deleteMessage.Reason = message.Reason;
foreach (var notification in _notificationFactory.OnDeleteEnabled())
{
try
{
if (ShouldHandleMovie(notification.Definition, message.MovieFile.Movie))
{
notification.OnDelete(deleteMessage);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnDelete notification to: " + notification.Definition.Name);
}
}
} }
public void HandleAsync(DownloadsProcessedEvent message) public void HandleAsync(DownloadsProcessedEvent message)

View File

@ -48,6 +48,19 @@ public override void OnMovieRename(Movie movie)
UpdateIfEnabled(movie); UpdateIfEnabled(movie);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
UpdateIfEnabled(deleteMessage.Movie);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
UpdateIfEnabled(deleteMessage.Movie);
}
}
private void UpdateIfEnabled(Movie movie) private void UpdateIfEnabled(Movie movie)
{ {
if (Settings.UpdateLibrary) if (Settings.UpdateLibrary)

View File

@ -26,9 +26,19 @@ public override void OnDownload(DownloadMessage message)
_prowlProxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority); _prowlProxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{ {
_prowlProxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority); _prowlProxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_prowlProxy.SendNotification(MOVIE_DELETED_TITLE, deleteMessage.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority);
}
public override void OnHealthIssue(HealthCheck.HealthCheck message)
{
_prowlProxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings.ApiKey, (ProwlPriority)Settings.Priority);
} }
public override ValidationResult Test() public override ValidationResult Test()

View File

@ -29,6 +29,16 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
@ -69,6 +71,38 @@ public override void OnMovieRename(Movie movie)
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = deleteMessage.Movie.Title,
Text = Path.Combine(deleteMessage.Movie.Path, deleteMessage.MovieFile.RelativePath)
}
};
var payload = CreatePayload("Movie File Deleted", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = deleteMessage.Movie.Title,
Text = deleteMessage.DeletedFilesMessage
}
};
var payload = CreatePayload("Movie 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

@ -46,6 +46,26 @@ public override void OnMovieRename(Movie movie)
} }
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
if (Settings.UpdateLibrary)
{
var fullPath = Path.Combine(deleteMessage.Movie.Path, deleteMessage.MovieFile.RelativePath);
_indexerProxy.DeleteFile(fullPath);
}
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
if (Settings.UpdateLibrary)
{
_indexerProxy.DeleteFolder(deleteMessage.Movie.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 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_proxy.SendNotification(MOVIE_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,11 +29,16 @@ public override void OnDownload(DownloadMessage message)
_traktService.AddMovieToCollection(Settings, message.Movie, message.MovieFile); _traktService.AddMovieToCollection(Settings, message.Movie, message.MovieFile);
} }
public override void OnDelete(DeleteMessage message) public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{ {
if (message.Reason != MediaFiles.DeleteMediaFileReason.Upgrade) _traktService.RemoveMovieFromCollection(Settings, deleteMessage.Movie);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{ {
_traktService.RemoveMovieFromCollection(Settings, message.Movie, message.MovieFile); _traktService.RemoveMovieFromCollection(Settings, deleteMessage.Movie);
} }
} }

View File

@ -19,7 +19,7 @@ public interface ITraktService
HttpRequest GetOAuthRequest(string callbackUrl); HttpRequest GetOAuthRequest(string callbackUrl);
TraktAuthRefreshResource RefreshAuthToken(string refreshToken); TraktAuthRefreshResource RefreshAuthToken(string refreshToken);
void AddMovieToCollection(TraktSettings settings, Movie movie, MovieFile movieFile); void AddMovieToCollection(TraktSettings settings, Movie movie, MovieFile movieFile);
void RemoveMovieFromCollection(TraktSettings settings, Movie movie, MovieFile movieFile); void RemoveMovieFromCollection(TraktSettings settings, Movie movie);
string GetUserName(string accessToken); string GetUserName(string accessToken);
ValidationFailure Test(TraktSettings settings); ValidationFailure Test(TraktSettings settings);
} }
@ -76,7 +76,7 @@ public ValidationFailure Test(TraktSettings settings)
} }
} }
public void RemoveMovieFromCollection(TraktSettings settings, Movie movie, MovieFile movieFile) public void RemoveMovieFromCollection(TraktSettings settings, Movie movie)
{ {
var payload = new TraktCollectMoviesResource var payload = new TraktCollectMoviesResource
{ {

View File

@ -28,6 +28,16 @@ public override void OnDownload(DownloadMessage message)
_twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings); _twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
_twitterService.SendNotification($"Movie File Deleted: {deleteMessage.Message}", Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
_twitterService.SendNotification($"Movie 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

@ -75,6 +75,31 @@ public override void OnMovieRename(Movie movie)
_proxy.SendWebhook(payload, Settings); _proxy.SendWebhook(payload, Settings);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
var payload = new WebhookMovieFileDeletePayload
{
EventType = WebhookEventType.MovieFileDelete,
Movie = new WebhookMovie(deleteMessage.Movie),
MovieFile = new WebhookMovieFile(deleteMessage.MovieFile),
DeleteReason = deleteMessage.Reason
};
_proxy.SendWebhook(payload, Settings);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
var payload = new WebhookMovieDeletePayload
{
EventType = WebhookEventType.MovieDelete,
Movie = new WebhookMovie(deleteMessage.Movie),
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

@ -12,6 +12,8 @@ public enum WebhookEventType
Grab, Grab,
Download, Download,
Rename, Rename,
MovieDelete,
MovieFileDelete,
Health Health
} }
} }

View File

@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookMovieDeletePayload : WebhookPayload
{
public WebhookMovie Movie { get; set; }
public bool DeletedFiles { get; set; }
}
}

View File

@ -0,0 +1,12 @@
using System.Collections.Generic;
using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookMovieFileDeletePayload : WebhookPayload
{
public WebhookMovie Movie { get; set; }
public WebhookMovieFile MovieFile { get; set; }
public DeleteMediaFileReason DeleteReason { get; set; }
}
}

View File

@ -41,6 +41,25 @@ public override void OnMovieRename(Movie movie)
UpdateAndCleanMovie(movie); UpdateAndCleanMovie(movie);
} }
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
{
const string header = "Radarr - Deleted";
Notify(Settings, header, deleteMessage.Message);
UpdateAndCleanMovie(deleteMessage.Movie, true);
}
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
{
if (deleteMessage.DeletedFiles)
{
const string header = "Radarr - Deleted";
Notify(Settings, header, deleteMessage.Message);
UpdateAndCleanMovie(deleteMessage.Movie, true);
}
}
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

@ -9,13 +9,17 @@ public class NotificationResource : ProviderResource<NotificationResource>
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnDelete { get; set; } public bool OnMovieDelete { get; set; }
public bool OnMovieFileDelete { get; set; }
public bool OnMovieFileDeleteForUpgrade { get; set; }
public bool OnHealthIssue { get; set; } public bool OnHealthIssue { get; set; }
public bool SupportsOnGrab { get; set; } public bool SupportsOnGrab { get; set; }
public bool SupportsOnDownload { get; set; } public bool SupportsOnDownload { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnDelete { get; set; } public bool SupportsOnMovieDelete { get; set; }
public bool SupportsOnMovieFileDelete { get; set; }
public bool SupportsOnMovieFileDeleteForUpgrade { get; set; }
public bool SupportsOnHealthIssue { get; set; } public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; } public bool IncludeHealthWarnings { get; set; }
public string TestCommand { get; set; } public string TestCommand { get; set; }
@ -36,13 +40,17 @@ public override NotificationResource ToResource(NotificationDefinition definitio
resource.OnDownload = definition.OnDownload; resource.OnDownload = definition.OnDownload;
resource.OnUpgrade = definition.OnUpgrade; resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnDelete = definition.OnDelete; resource.OnMovieDelete = definition.OnMovieDelete;
resource.OnMovieFileDelete = definition.OnMovieFileDelete;
resource.OnMovieFileDeleteForUpgrade = definition.OnMovieFileDeleteForUpgrade;
resource.OnHealthIssue = definition.OnHealthIssue; resource.OnHealthIssue = definition.OnHealthIssue;
resource.SupportsOnGrab = definition.SupportsOnGrab; resource.SupportsOnGrab = definition.SupportsOnGrab;
resource.SupportsOnDownload = definition.SupportsOnDownload; resource.SupportsOnDownload = definition.SupportsOnDownload;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade; resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnDelete = definition.SupportsOnDelete; resource.SupportsOnMovieDelete = definition.SupportsOnMovieDelete;
resource.SupportsOnMovieFileDelete = definition.SupportsOnMovieFileDelete;
resource.SupportsOnMovieFileDeleteForUpgrade = definition.SupportsOnMovieFileDeleteForUpgrade;
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue; resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings; resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
@ -62,13 +70,17 @@ public override NotificationDefinition ToModel(NotificationResource resource)
definition.OnDownload = resource.OnDownload; definition.OnDownload = resource.OnDownload;
definition.OnUpgrade = resource.OnUpgrade; definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnDelete = resource.OnDelete; definition.OnMovieDelete = resource.OnMovieDelete;
definition.OnMovieFileDelete = resource.OnMovieFileDelete;
definition.OnMovieFileDeleteForUpgrade = resource.OnMovieFileDeleteForUpgrade;
definition.OnHealthIssue = resource.OnHealthIssue; definition.OnHealthIssue = resource.OnHealthIssue;
definition.SupportsOnGrab = resource.SupportsOnGrab; definition.SupportsOnGrab = resource.SupportsOnGrab;
definition.SupportsOnDownload = resource.SupportsOnDownload; definition.SupportsOnDownload = resource.SupportsOnDownload;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade; definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnDelete = resource.SupportsOnDelete; definition.SupportsOnMovieDelete = resource.SupportsOnMovieDelete;
definition.SupportsOnMovieFileDelete = resource.SupportsOnMovieFileDelete;
definition.SupportsOnMovieFileDeleteForUpgrade = resource.SupportsOnMovieFileDeleteForUpgrade;
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings; definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;