New: On Episode File Delete For Upgrade notification option

This commit is contained in:
Robin Dadswell 2021-01-30 22:54:26 +00:00 committed by GitHub
parent ec058436d3
commit 474f4bcc6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 77 additions and 4 deletions

View File

@ -44,6 +44,7 @@ function EditNotificationModalContent(props) {
onRename, onRename,
onSeriesDelete, onSeriesDelete,
onEpisodeFileDelete, onEpisodeFileDelete,
onEpisodeFileDeleteForUpgrade,
onHealthIssue, onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
@ -51,6 +52,7 @@ function EditNotificationModalContent(props) {
supportsOnRename, supportsOnRename,
supportsOnSeriesDelete, supportsOnSeriesDelete,
supportsOnEpisodeFileDelete, supportsOnEpisodeFileDelete,
supportsOnEpisodeFileDeleteForUpgrade,
supportsOnHealthIssue, supportsOnHealthIssue,
includeHealthWarnings, includeHealthWarnings,
tags, tags,
@ -180,6 +182,23 @@ function EditNotificationModalContent(props) {
/> />
</FormGroup> </FormGroup>
{
onEpisodeFileDelete.value ?
<FormGroup>
<FormLabel>On Episode File Delete For Upgrade</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="onEpisodeFileDeleteForUpgrade"
helpText="Be notified when episode files are deleted for upgrades"
isDisabled={!supportsOnEpisodeFileDeleteForUpgrade.value}
{...onEpisodeFileDeleteForUpgrade}
onChange={onInputChange}
/>
</FormGroup> :
null
}
<FormGroup> <FormGroup>
<FormLabel>On Health Issue</FormLabel> <FormLabel>On Health Issue</FormLabel>

View File

@ -60,6 +60,7 @@ class Notification extends Component {
onRename, onRename,
onSeriesDelete, onSeriesDelete,
onEpisodeFileDelete, onEpisodeFileDelete,
onEpisodeFileDeleteForUpgrade,
onHealthIssue, onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
@ -67,6 +68,7 @@ class Notification extends Component {
supportsOnRename, supportsOnRename,
supportsOnSeriesDelete, supportsOnSeriesDelete,
supportsOnEpisodeFileDelete, supportsOnEpisodeFileDelete,
supportsOnEpisodeFileDeleteForUpgrade,
supportsOnHealthIssue supportsOnHealthIssue
} = this.props; } = this.props;
@ -136,6 +138,14 @@ class Notification extends Component {
null null
} }
{
supportsOnEpisodeFileDeleteForUpgrade && onEpisodeFileDelete && onEpisodeFileDeleteForUpgrade ?
<Label kind={kinds.SUCCESS}>
On Episode File Delete For Upgrade
</Label> :
null
}
{ {
!onGrab && !onDownload && !onRename && !onHealthIssue && !onSeriesDelete && !onEpisodeFileDelete ? !onGrab && !onDownload && !onRename && !onHealthIssue && !onSeriesDelete && !onEpisodeFileDelete ?
<Label <Label
@ -177,11 +187,13 @@ Notification.propTypes = {
onRename: PropTypes.bool.isRequired, onRename: PropTypes.bool.isRequired,
onSeriesDelete: PropTypes.bool.isRequired, onSeriesDelete: PropTypes.bool.isRequired,
onEpisodeFileDelete: PropTypes.bool.isRequired, onEpisodeFileDelete: PropTypes.bool.isRequired,
onEpisodeFileDeleteForUpgrade: 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,
supportsOnSeriesDelete: PropTypes.bool.isRequired, supportsOnSeriesDelete: PropTypes.bool.isRequired,
supportsOnEpisodeFileDelete: PropTypes.bool.isRequired, supportsOnEpisodeFileDelete: PropTypes.bool.isRequired,
supportsOnEpisodeFileDeleteForUpgrade: 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

@ -108,6 +108,7 @@ export default {
selectedSchema.onRename = selectedSchema.supportsOnRename; selectedSchema.onRename = selectedSchema.supportsOnRename;
selectedSchema.OnSeriesDelete = selectedSchema.supportsOnSeriesDelete; selectedSchema.OnSeriesDelete = selectedSchema.supportsOnSeriesDelete;
selectedSchema.OnEpisodeFileDelete = selectedSchema.supportsOnEpisodeFileDelete; selectedSchema.OnEpisodeFileDelete = selectedSchema.supportsOnEpisodeFileDelete;
selectedSchema.OnEpisodeFileDeleteForUpgrade = selectedSchema.supportsOnEpisodeFileDeleteForUpgrade;
return selectedSchema; return selectedSchema;
}); });

View File

@ -116,6 +116,7 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnRename.Should().BeTrue(); notification.SupportsOnRename.Should().BeTrue();
notification.SupportsOnSeriesDelete.Should().BeTrue(); notification.SupportsOnSeriesDelete.Should().BeTrue();
notification.SupportsOnEpisodeFileDelete.Should().BeTrue(); notification.SupportsOnEpisodeFileDelete.Should().BeTrue();
notification.SupportsOnEpisodeFileDeleteForUpgrade.Should().BeTrue();
notification.SupportsOnHealthIssue.Should().BeTrue(); notification.SupportsOnHealthIssue.Should().BeTrue();
} }
@ -131,6 +132,7 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnRename.Should().BeFalse(); notification.SupportsOnRename.Should().BeFalse();
notification.SupportsOnSeriesDelete.Should().BeFalse(); notification.SupportsOnSeriesDelete.Should().BeFalse();
notification.SupportsOnEpisodeFileDelete.Should().BeFalse(); notification.SupportsOnEpisodeFileDelete.Should().BeFalse();
notification.SupportsOnEpisodeFileDeleteForUpgrade.Should().BeFalse();
notification.SupportsOnHealthIssue.Should().BeFalse(); notification.SupportsOnHealthIssue.Should().BeFalse();
} }
} }

View File

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

View File

@ -76,6 +76,7 @@ namespace NzbDrone.Core.Datastore
.Ignore(i => i.SupportsOnRename) .Ignore(i => i.SupportsOnRename)
.Ignore(i => i.SupportsOnSeriesDelete) .Ignore(i => i.SupportsOnSeriesDelete)
.Ignore(i => i.SupportsOnEpisodeFileDelete) .Ignore(i => i.SupportsOnEpisodeFileDelete)
.Ignore(i => i.SupportsOnEpisodeFileDeleteForUpgrade)
.Ignore(i => i.SupportsOnHealthIssue); .Ignore(i => i.SupportsOnHealthIssue);
Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata") Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata")

View File

@ -135,6 +135,7 @@ namespace NzbDrone.Core.Notifications.CustomScript
var environmentVariables = new StringDictionary(); var environmentVariables = new StringDictionary();
environmentVariables.Add("Sonarr_EventType", "EpisodeFileDelete"); environmentVariables.Add("Sonarr_EventType", "EpisodeFileDelete");
environmentVariables.Add("Sonarr_EpisodeFile_DeleteReason", deleteMessage.Reason.ToString());
environmentVariables.Add("Sonarr_Series_Id", series.Id.ToString()); environmentVariables.Add("Sonarr_Series_Id", series.Id.ToString());
environmentVariables.Add("Sonarr_Series_Title", series.Title); environmentVariables.Add("Sonarr_Series_Title", series.Title);
environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_Path", series.Path);

View File

@ -20,6 +20,7 @@ namespace NzbDrone.Core.Notifications
bool SupportsOnRename { get; } bool SupportsOnRename { get; }
bool SupportsOnSeriesDelete { get; } bool SupportsOnSeriesDelete { get; }
bool SupportsOnEpisodeFileDelete { get; } bool SupportsOnEpisodeFileDelete { get; }
bool SupportsOnEpisodeFileDeleteForUpgrade { get; }
bool SupportsOnHealthIssue { get; } bool SupportsOnHealthIssue { get; }
} }
} }

View File

@ -75,6 +75,7 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnUpgrade => SupportsOnDownload; public bool SupportsOnUpgrade => SupportsOnDownload;
public bool SupportsOnSeriesDelete => HasConcreteImplementation("OnSeriesDelete"); public bool SupportsOnSeriesDelete => HasConcreteImplementation("OnSeriesDelete");
public bool SupportsOnEpisodeFileDelete => HasConcreteImplementation("OnEpisodeFileDelete"); public bool SupportsOnEpisodeFileDelete => HasConcreteImplementation("OnEpisodeFileDelete");
public bool SupportsOnEpisodeFileDeleteForUpgrade => SupportsOnEpisodeFileDelete;
public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue"); public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue");
protected TSettings Settings => (TSettings)Definition.Settings; protected TSettings Settings => (TSettings)Definition.Settings;

View File

@ -10,6 +10,7 @@ namespace NzbDrone.Core.Notifications
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnSeriesDelete { get; set; } public bool OnSeriesDelete { get; set; }
public bool OnEpisodeFileDelete { get; set; } public bool OnEpisodeFileDelete { get; set; }
public bool OnEpisodeFileDeleteForUpgrade { 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; }
@ -17,9 +18,10 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnSeriesDelete { get; set; } public bool SupportsOnSeriesDelete { get; set; }
public bool SupportsOnEpisodeFileDelete { get; set; } public bool SupportsOnEpisodeFileDelete { get; set; }
public bool SupportsOnEpisodeFileDeleteForUpgrade { get; set; }
public bool SupportsOnHealthIssue { get; set; } public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; } public bool IncludeHealthWarnings { get; set; }
public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnSeriesDelete || OnEpisodeFileDelete || OnHealthIssue; public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnSeriesDelete || OnEpisodeFileDelete || OnEpisodeFileDeleteForUpgrade || OnHealthIssue;
} }
} }

View File

@ -15,6 +15,7 @@ namespace NzbDrone.Core.Notifications
List<INotification> OnRenameEnabled(); List<INotification> OnRenameEnabled();
List<INotification> OnSeriesDeleteEnabled(); List<INotification> OnSeriesDeleteEnabled();
List<INotification> OnEpisodeFileDeleteEnabled(); List<INotification> OnEpisodeFileDeleteEnabled();
List<INotification> OnEpisodeFileDeleteForUpgradeEnabled();
List<INotification> OnHealthIssueEnabled(); List<INotification> OnHealthIssueEnabled();
} }
@ -55,6 +56,10 @@ namespace NzbDrone.Core.Notifications
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnEpisodeFileDelete).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnEpisodeFileDelete).ToList();
} }
public List<INotification> OnEpisodeFileDeleteForUpgradeEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnEpisodeFileDeleteForUpgrade).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();
@ -70,6 +75,7 @@ namespace NzbDrone.Core.Notifications
definition.SupportsOnRename = provider.SupportsOnRename; definition.SupportsOnRename = provider.SupportsOnRename;
definition.SupportsOnSeriesDelete = provider.SupportsOnSeriesDelete; definition.SupportsOnSeriesDelete = provider.SupportsOnSeriesDelete;
definition.SupportsOnEpisodeFileDelete = provider.SupportsOnEpisodeFileDelete; definition.SupportsOnEpisodeFileDelete = provider.SupportsOnEpisodeFileDelete;
definition.SupportsOnEpisodeFileDeleteForUpgrade = provider.SupportsOnEpisodeFileDeleteForUpgrade;
definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue;
} }
} }

View File

@ -205,9 +205,12 @@ namespace NzbDrone.Core.Notifications
{ {
try try
{ {
if (ShouldHandleSeries(notification.Definition, deleteMessage.EpisodeFile.Series)) if (message.Reason != MediaFiles.DeleteMediaFileReason.Upgrade || ((NotificationDefinition)notification.Definition).OnEpisodeFileDeleteForUpgrade)
{ {
notification.OnEpisodeFileDelete(deleteMessage); if (ShouldHandleSeries(notification.Definition, deleteMessage.EpisodeFile.Series))
{
notification.OnEpisodeFileDelete(deleteMessage);
}
} }
} }
catch (Exception ex) catch (Exception ex)

View File

@ -82,7 +82,8 @@ namespace NzbDrone.Core.Notifications.Webhook
{ {
EventType = WebhookEventType.EpisodeFileDelete, EventType = WebhookEventType.EpisodeFileDelete,
Series = new WebhookSeries(deleteMessage.Series), Series = new WebhookSeries(deleteMessage.Series),
Episodes = deleteMessage.EpisodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x)) Episodes = deleteMessage.EpisodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x)),
DeleteReason = deleteMessage.Reason
}; };
_proxy.SendWebhook(payload, Settings); _proxy.SendWebhook(payload, Settings);

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Core.Notifications.Webhook namespace NzbDrone.Core.Notifications.Webhook
{ {
@ -6,6 +7,7 @@ namespace NzbDrone.Core.Notifications.Webhook
{ {
public WebhookSeries Series { get; set; } public WebhookSeries Series { get; set; }
public List<WebhookEpisode> Episodes { get; set; } public List<WebhookEpisode> Episodes { get; set; }
public DeleteMediaFileReason DeleteReason { get; set; }
} }
} }

View File

@ -11,6 +11,7 @@ namespace Sonarr.Api.V3.Notifications
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnSeriesDelete { get; set; } public bool OnSeriesDelete { get; set; }
public bool OnEpisodeFileDelete { get; set; } public bool OnEpisodeFileDelete { get; set; }
public bool OnEpisodeFileDeleteForUpgrade { 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; }
@ -18,6 +19,7 @@ namespace Sonarr.Api.V3.Notifications
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnSeriesDelete { get; set; } public bool SupportsOnSeriesDelete { get; set; }
public bool SupportsOnEpisodeFileDelete { get; set; } public bool SupportsOnEpisodeFileDelete { get; set; }
public bool SupportsOnEpisodeFileDeleteForUpgrade { 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; }
@ -37,6 +39,7 @@ namespace Sonarr.Api.V3.Notifications
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnSeriesDelete = definition.OnSeriesDelete; resource.OnSeriesDelete = definition.OnSeriesDelete;
resource.OnEpisodeFileDelete = definition.OnEpisodeFileDelete; resource.OnEpisodeFileDelete = definition.OnEpisodeFileDelete;
resource.OnEpisodeFileDeleteForUpgrade = definition.OnEpisodeFileDeleteForUpgrade;
resource.OnHealthIssue = definition.OnHealthIssue; resource.OnHealthIssue = definition.OnHealthIssue;
resource.SupportsOnGrab = definition.SupportsOnGrab; resource.SupportsOnGrab = definition.SupportsOnGrab;
resource.SupportsOnDownload = definition.SupportsOnDownload; resource.SupportsOnDownload = definition.SupportsOnDownload;
@ -44,6 +47,7 @@ namespace Sonarr.Api.V3.Notifications
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnSeriesDelete = definition.SupportsOnSeriesDelete; resource.SupportsOnSeriesDelete = definition.SupportsOnSeriesDelete;
resource.SupportsOnEpisodeFileDelete = definition.SupportsOnEpisodeFileDelete; resource.SupportsOnEpisodeFileDelete = definition.SupportsOnEpisodeFileDelete;
resource.SupportsOnEpisodeFileDeleteForUpgrade = definition.SupportsOnEpisodeFileDeleteForUpgrade;
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue; resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings; resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
@ -62,6 +66,7 @@ namespace Sonarr.Api.V3.Notifications
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnSeriesDelete = resource.OnSeriesDelete; definition.OnSeriesDelete = resource.OnSeriesDelete;
definition.OnEpisodeFileDelete = resource.OnEpisodeFileDelete; definition.OnEpisodeFileDelete = resource.OnEpisodeFileDelete;
definition.OnEpisodeFileDeleteForUpgrade = resource.OnEpisodeFileDeleteForUpgrade;
definition.OnHealthIssue = resource.OnHealthIssue; definition.OnHealthIssue = resource.OnHealthIssue;
definition.SupportsOnGrab = resource.SupportsOnGrab; definition.SupportsOnGrab = resource.SupportsOnGrab;
definition.SupportsOnDownload = resource.SupportsOnDownload; definition.SupportsOnDownload = resource.SupportsOnDownload;
@ -69,6 +74,7 @@ namespace Sonarr.Api.V3.Notifications
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnSeriesDelete = resource.SupportsOnSeriesDelete; definition.SupportsOnSeriesDelete = resource.SupportsOnSeriesDelete;
definition.SupportsOnEpisodeFileDelete = resource.SupportsOnEpisodeFileDelete; definition.SupportsOnEpisodeFileDelete = resource.SupportsOnEpisodeFileDelete;
definition.SupportsOnEpisodeFileDeleteForUpgrade = resource.SupportsOnEpisodeFileDeleteForUpgrade;
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue; definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings; definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;