From adcd00d9fdae430a817429597664c1291bb7511e Mon Sep 17 00:00:00 2001 From: Qstick Date: Tue, 22 Nov 2022 21:17:25 -0600 Subject: [PATCH] Convert Notifiarr Payload to JSON, Standardize with Webhook --- .../Notifications/Notifiarr/Notifiarr.cs | 181 ++++-------------- .../Notifications/Notifiarr/NotifiarrProxy.cs | 100 +++------- .../Notifiarr/NotifiarrSettings.cs | 2 - .../Notifications/Webhook/Webhook.cs | 137 ++----------- .../Notifications/Webhook/WebhookBase.cs | 171 +++++++++++++++++ .../Notifications/Webhook/WebhookPayload.cs | 1 + 6 files changed, 244 insertions(+), 348 deletions(-) create mode 100644 src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs index 409687ed1..dc5551387 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs @@ -1,21 +1,20 @@ -using System; using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Linq; using FluentValidation.Results; using NzbDrone.Common.Extensions; -using NzbDrone.Core.HealthCheck; -using NzbDrone.Core.MediaFiles.MediaInfo; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; +using NzbDrone.Core.Notifications.Webhook; +using NzbDrone.Core.Validation; namespace NzbDrone.Core.Notifications.Notifiarr { - public class Notifiarr : NotificationBase + public class Notifiarr : WebhookBase { private readonly INotifiarrProxy _proxy; - public Notifiarr(INotifiarrProxy proxy) + public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider) + : base(configFileProvider) { _proxy = proxy; } @@ -25,179 +24,65 @@ namespace NzbDrone.Core.Notifications.Notifiarr public override void OnGrab(GrabMessage message) { - var movie = message.Movie; - var remoteMovie = message.RemoteMovie; - var quality = message.Quality; - var variables = new StringDictionary(); - - variables.Add("Radarr_EventType", "Grab"); - variables.Add("Radarr_Movie_Id", movie.Id.ToString()); - variables.Add("Radarr_Movie_Title", movie.MovieMetadata.Value.Title); - variables.Add("Radarr_Movie_Year", movie.MovieMetadata.Value.Year.ToString()); - variables.Add("Radarr_Movie_ImdbId", movie.MovieMetadata.Value.ImdbId ?? string.Empty); - variables.Add("Radarr_Movie_TmdbId", movie.MovieMetadata.Value.TmdbId.ToString()); - variables.Add("Radarr_Movie_In_Cinemas_Date", movie.MovieMetadata.Value.InCinemas.ToString() ?? string.Empty); - variables.Add("Radarr_Movie_Physical_Release_Date", movie.MovieMetadata.Value.PhysicalRelease.ToString() ?? string.Empty); - variables.Add("Radarr_Release_Title", remoteMovie.Release.Title); - variables.Add("Radarr_Release_Indexer", remoteMovie.Release.Indexer ?? string.Empty); - variables.Add("Radarr_Release_Size", remoteMovie.Release.Size.ToString()); - variables.Add("Radarr_Release_ReleaseGroup", remoteMovie.ParsedMovieInfo.ReleaseGroup ?? string.Empty); - variables.Add("Radarr_Release_Quality", quality.Quality.Name); - variables.Add("Radarr_Release_QualityVersion", quality.Revision.Version.ToString()); - variables.Add("Radarr_IndexerFlags", remoteMovie.Release.IndexerFlags.ToString()); - variables.Add("Radarr_Download_Client", message.DownloadClientName ?? string.Empty); - variables.Add("Radarr_Download_Client_Type", message.DownloadClientType ?? string.Empty); - variables.Add("Radarr_Download_Id", message.DownloadId ?? string.Empty); - variables.Add("Radarr_Release_CustomFormat", string.Join("|", remoteMovie.CustomFormats)); - variables.Add("Radarr_Release_CustomFormatScore", remoteMovie.CustomFormatScore.ToString()); - - _proxy.SendNotification(variables, Settings); + _proxy.SendNotification(BuildOnGrabPayload(message), Settings); } public override void OnDownload(DownloadMessage message) { - var movie = message.Movie; - var movieFile = message.MovieFile; - var sourcePath = message.SourcePath; - var variables = new StringDictionary(); - - variables.Add("Radarr_EventType", "Download"); - variables.Add("Radarr_IsUpgrade", message.OldMovieFiles.Any().ToString()); - variables.Add("Radarr_Movie_Id", movie.Id.ToString()); - variables.Add("Radarr_Movie_Title", movie.MovieMetadata.Value.Title); - variables.Add("Radarr_Movie_Year", movie.MovieMetadata.Value.Year.ToString()); - variables.Add("Radarr_Movie_Path", movie.Path); - variables.Add("Radarr_Movie_ImdbId", movie.MovieMetadata.Value.ImdbId ?? string.Empty); - variables.Add("Radarr_Movie_TmdbId", movie.MovieMetadata.Value.TmdbId.ToString()); - variables.Add("Radarr_Movie_In_Cinemas_Date", movie.MovieMetadata.Value.InCinemas.ToString() ?? string.Empty); - variables.Add("Radarr_Movie_Physical_Release_Date", movie.MovieMetadata.Value.PhysicalRelease.ToString() ?? string.Empty); - 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_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); - variables.Add("Radarr_MovieFile_SourcePath", sourcePath); - variables.Add("Radarr_MovieFile_SourceFolder", Path.GetDirectoryName(sourcePath)); - variables.Add("Radarr_MovieFile_MediaInfo_AudioChannels", MediaInfoFormatter.FormatAudioChannels(movieFile.MediaInfo).ToString()); - variables.Add("Radarr_MovieFile_MediaInfo_AudioCodec", MediaInfoFormatter.FormatAudioCodec(movieFile.MediaInfo, null)); - variables.Add("Radarr_MovieFile_MediaInfo_AudioLanguages", movieFile.MediaInfo.AudioLanguages.Distinct().ConcatToString(" / ")); - variables.Add("Radarr_MovieFile_MediaInfo_Languages", movieFile.MediaInfo.AudioLanguages.ConcatToString(" / ")); - variables.Add("Radarr_MovieFile_MediaInfo_Height", movieFile.MediaInfo.Height.ToString()); - variables.Add("Radarr_MovieFile_MediaInfo_Width", movieFile.MediaInfo.Width.ToString()); - variables.Add("Radarr_MovieFile_MediaInfo_Subtitles", movieFile.MediaInfo.Subtitles.ConcatToString(" / ")); - variables.Add("Radarr_MovieFile_MediaInfo_VideoCodec", MediaInfoFormatter.FormatVideoCodec(movieFile.MediaInfo, null)); - variables.Add("Radarr_MovieFile_MediaInfo_VideoDynamicRangeType", MediaInfoFormatter.FormatVideoDynamicRangeType(movieFile.MediaInfo)); - variables.Add("Radarr_Download_Id", message.DownloadId ?? string.Empty); - variables.Add("Radarr_Download_Client", message.DownloadClientInfo?.Name ?? string.Empty); - variables.Add("Radarr_Download_Client_Type", message.DownloadClientInfo?.Type ?? string.Empty); - - if (message.OldMovieFiles.Any()) - { - variables.Add("Radarr_DeletedRelativePaths", string.Join("|", message.OldMovieFiles.Select(e => e.RelativePath))); - variables.Add("Radarr_DeletedPaths", string.Join("|", message.OldMovieFiles.Select(e => Path.Combine(movie.Path, e.RelativePath)))); - } + _proxy.SendNotification(BuildOnDownloadPayload(message), Settings); + } - _proxy.SendNotification(variables, Settings); + public override void OnMovieRename(Movie movie, List renamedFiles) + { + _proxy.SendNotification(BuildOnRenamePayload(movie, renamedFiles), 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.MovieMetadata.Value.Title); - variables.Add("Radarr_Movie_Year", movie.MovieMetadata.Value.Year.ToString()); - variables.Add("Radarr_Movie_Path", movie.Path); - variables.Add("Radarr_Movie_ImdbId", movie.MovieMetadata.Value.ImdbId ?? string.Empty); - variables.Add("Radarr_Movie_TmdbId", movie.MovieMetadata.Value.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); + _proxy.SendNotification(BuildOnMovieFileDelete(deleteMessage), Settings); } public override void OnMovieAdded(Movie movie) { - var variables = new StringDictionary(); - - variables.Add("Radarr_EventType", "MovieAdded"); - variables.Add("Radarr_Movie_Id", movie.Id.ToString()); - variables.Add("Radarr_Movie_Title", movie.MovieMetadata.Value.Title); - variables.Add("Radarr_Movie_Year", movie.MovieMetadata.Value.Year.ToString()); - variables.Add("Radarr_Movie_Path", movie.Path); - variables.Add("Radarr_Movie_ImdbId", movie.MovieMetadata.Value.ImdbId ?? string.Empty); - variables.Add("Radarr_Movie_TmdbId", movie.MovieMetadata.Value.TmdbId.ToString()); - variables.Add("Radarr_Movie_AddMethod", movie.AddOptions.AddMethod.ToString()); - - _proxy.SendNotification(variables, Settings); + _proxy.SendNotification(BuildOnMovieAdded(movie), 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.MovieMetadata.Value.Title); - variables.Add("Radarr_Movie_Year", movie.MovieMetadata.Value.Year.ToString()); - variables.Add("Radarr_Movie_Path", movie.Path); - variables.Add("Radarr_Movie_ImdbId", movie.MovieMetadata.Value.ImdbId ?? string.Empty); - variables.Add("Radarr_Movie_TmdbId", movie.MovieMetadata.Value.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); + _proxy.SendNotification(BuildOnMovieDelete(deleteMessage), Settings); } public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - var variables = new StringDictionary(); - - variables.Add("Radarr_EventType", "HealthIssue"); - variables.Add("Radarr_Health_Issue_Level", Enum.GetName(typeof(HealthCheckResult), healthCheck.Type)); - variables.Add("Radarr_Health_Issue_Message", healthCheck.Message); - variables.Add("Radarr_Health_Issue_Type", healthCheck.Source.Name); - variables.Add("Radarr_Health_Issue_Wiki", healthCheck.WikiUrl.ToString() ?? string.Empty); - - _proxy.SendNotification(variables, Settings); + _proxy.SendNotification(BuildHealthPayload(healthCheck), Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - var variables = new StringDictionary(); - - variables.Add("Radarr_EventType", "ApplicationUpdate"); - variables.Add("Radarr_Update_Message", updateMessage.Message); - variables.Add("Radarr_Update_NewVersion", updateMessage.NewVersion.ToString()); - variables.Add("Radarr_Update_PreviousVersion", updateMessage.PreviousVersion.ToString()); - - _proxy.SendNotification(variables, Settings); + _proxy.SendNotification(BuildApplicationUpdatePayload(updateMessage), Settings); } public override ValidationResult Test() { var failures = new List(); - failures.AddIfNotNull(_proxy.Test(Settings)); + failures.AddIfNotNull(SendWebhookTest()); return new ValidationResult(failures); } + + private ValidationFailure SendWebhookTest() + { + try + { + _proxy.SendNotification(BuildTestPayload(), Settings); + } + catch (NotifiarrException ex) + { + return new NzbDroneValidationFailure("APIKey", ex.Message); + } + + return null; + } } } diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs index e4a93d884..512130bda 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrProxy.cs @@ -1,117 +1,69 @@ -using System; -using System.Collections.Specialized; -using FluentValidation.Results; +using System.Net.Http; using NLog; using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.Notifications.Webhook; namespace NzbDrone.Core.Notifications.Notifiarr { public interface INotifiarrProxy { - void SendNotification(StringDictionary message, NotifiarrSettings settings); - ValidationFailure Test(NotifiarrSettings settings); + void SendNotification(WebhookPayload payload, NotifiarrSettings settings); } public class NotifiarrProxy : INotifiarrProxy { + private const string URL = "https://notifiarr.com"; private readonly IHttpClient _httpClient; - private readonly Logger _logger; - public NotifiarrProxy(IHttpClient httpClient, Logger logger) + public NotifiarrProxy(IHttpClient httpClient) { _httpClient = httpClient; - _logger = logger; } - public void SendNotification(StringDictionary message, NotifiarrSettings settings) + public void SendNotification(WebhookPayload payload, NotifiarrSettings settings) { - try - { - ProcessNotification(message, settings); - } - catch (NotifiarrException ex) - { - _logger.Error(ex, "Unable to send notification"); - throw new NotifiarrException("Unable to send notification"); - } - } - - public ValidationFailure Test(NotifiarrSettings settings) - { - try - { - var variables = new StringDictionary(); - variables.Add("Radarr_EventType", "Test"); - - SendNotification(variables, settings); - return null; - } - catch (HttpException ex) - { - switch ((int)ex.Response.StatusCode) - { - case 401: - _logger.Error(ex, "API key is invalid: " + ex.Message); - return new ValidationFailure("APIKey", "API key is invalid"); - case 400: - _logger.Error(ex, "Unable to send test message. Ensure Radarr Integration is enabled & assigned a channel on Notifiarr"); - return new ValidationFailure("", "Unable to send test message. Ensure Radarr Integration is enabled & assigned a channel on Notifiarr"); - case 520: - case 521: - case 522: - case 523: - case 524: - _logger.Error(ex, "Cloudflare Related HTTP Error - Unable to send test message: " + ex.Message); - return new ValidationFailure("", "Cloudflare Related HTTP Error - Unable to send test message"); - } - - _logger.Error(ex, "Unknown HTTP Error - Unable to send test message: " + ex.Message); - return new ValidationFailure("", "Unknown HTTP Error - Unable to send test message"); - } - catch (Exception ex) - { - _logger.Error(ex, "Unable to send test notification: " + ex.Message); - return new ValidationFailure("", "Unable to send test notification"); - } + ProcessNotification(payload, settings); } - private void ProcessNotification(StringDictionary message, NotifiarrSettings settings) + private void ProcessNotification(WebhookPayload payload, NotifiarrSettings settings) { try { - var url = "https://notifiarr.com"; - var requestBuilder = new HttpRequestBuilder(url + "/api/v1/notification/radarr/" + settings.APIKey).Post(); - requestBuilder.AddFormParameter("instanceName", settings.InstanceName).Build(); + var request = new HttpRequestBuilder(URL + "/api/v1/notification/radarr") + .Accept(HttpAccept.Json) + .SetHeader("X-API-Key", settings.APIKey) + .Build(); - foreach (string key in message.Keys) - { - requestBuilder.AddFormParameter(key, message[key]); - } + request.Method = HttpMethod.Post; - var request = requestBuilder.Build(); + request.Headers.ContentType = "application/json"; + request.SetContent(payload.ToJson()); _httpClient.Post(request); } catch (HttpException ex) { - switch ((int)ex.Response.StatusCode) + var responseCode = ex.Response.StatusCode; + switch ((int)responseCode) { case 401: - _logger.Error("", "API key is invalid"); - throw new NotifiarrException("API key is invalid", ex); + throw new NotifiarrException("API key is invalid"); case 400: - _logger.Error(ex, "Unable to send notification. Ensure Radarr Integration is enabled & assigned a channel on Notifiarr"); - throw new NotifiarrException("Unable to send notification. Ensure Radarr Integration is enabled & assigned a channel on Notifiarr", ex); + throw new NotifiarrException("Unable to send notification. Ensure Radarr Integration is enabled & assigned a channel on Notifiarr"); + case 502: + case 503: + case 504: + throw new NotifiarrException("Unable to send notification. Service Unavailable", ex); case 520: case 521: case 522: case 523: case 524: - _logger.Error(ex, "Cloudflare Related HTTP Error - Unable to send notification"); throw new NotifiarrException("Cloudflare Related HTTP Error - Unable to send notification", ex); + default: + throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex); } - - throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex); } } } diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrSettings.cs b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrSettings.cs index 497437609..1a8bb06c9 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrSettings.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/NotifiarrSettings.cs @@ -19,8 +19,6 @@ namespace NzbDrone.Core.Notifications.Notifiarr [FieldDefinition(0, Label = "API Key", Privacy = PrivacyLevel.ApiKey, HelpText = "Your API key from your profile", HelpLink = "https://notifiarr.com")] public string APIKey { get; set; } - [FieldDefinition(1, Label = "Instance Name", Advanced = true, HelpText = "Unique name for this instance", HelpLink = "https://notifiarr.com")] - public string InstanceName { get; set; } public NzbDroneValidationResult Validate() { diff --git a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs index f6f9837f4..0bebe7aec 100755 --- a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs @@ -1,19 +1,19 @@ using System.Collections.Generic; -using System.IO; -using System.Linq; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Notifications.Webhook { - public class Webhook : NotificationBase + public class Webhook : WebhookBase { private readonly IWebhookProxy _proxy; - public Webhook(IWebhookProxy proxy) + public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider) + : base(configFileProvider) { _proxy = proxy; } @@ -22,124 +22,42 @@ namespace NzbDrone.Core.Notifications.Webhook public override void OnGrab(GrabMessage message) { - var remoteMovie = message.RemoteMovie; - var quality = message.Quality; - - var payload = new WebhookGrabPayload - { - EventType = WebhookEventType.Grab, - Movie = new WebhookMovie(message.Movie), - RemoteMovie = new WebhookRemoteMovie(remoteMovie), - Release = new WebhookRelease(quality, remoteMovie), - DownloadClient = message.DownloadClientName, - DownloadClientType = message.DownloadClientType, - DownloadId = message.DownloadId - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildOnGrabPayload(message), Settings); } public override void OnDownload(DownloadMessage message) { - var movieFile = message.MovieFile; - - var payload = new WebhookImportPayload - { - EventType = WebhookEventType.Download, - Movie = new WebhookMovie(message.Movie), - RemoteMovie = new WebhookRemoteMovie(message.Movie), - MovieFile = new WebhookMovieFile(movieFile), - IsUpgrade = message.OldMovieFiles.Any(), - DownloadClient = message.DownloadClientInfo?.Name, - DownloadClientType = message.DownloadClientInfo?.Type, - DownloadId = message.DownloadId - }; - - if (message.OldMovieFiles.Any()) - { - payload.DeletedFiles = message.OldMovieFiles.ConvertAll(x => - new WebhookMovieFile(x) - { - Path = Path.Combine(message.Movie.Path, x.RelativePath) - }); - } - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildOnDownloadPayload(message), Settings); } public override void OnMovieRename(Movie movie, List renamedFiles) { - var payload = new WebhookRenamePayload - { - EventType = WebhookEventType.Rename, - Movie = new WebhookMovie(movie), - RenamedMovieFiles = renamedFiles.ConvertAll(x => new WebhookRenamedMovieFile(x)) - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildOnRenamePayload(movie, renamedFiles), Settings); } public override void OnMovieAdded(Movie movie) { - var payload = new WebhookRenamePayload - { - EventType = WebhookEventType.MovieAdded, - Movie = new WebhookMovie(movie) - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildOnMovieAdded(movie), 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); + _proxy.SendWebhook(BuildOnMovieFileDelete(deleteMessage), 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); + _proxy.SendWebhook(BuildOnMovieDelete(deleteMessage), Settings); } public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - var payload = new WebhookHealthPayload - { - EventType = WebhookEventType.Health, - Level = healthCheck.Type, - Message = healthCheck.Message, - Type = healthCheck.Source.Name, - WikiUrl = healthCheck.WikiUrl?.ToString() - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildHealthPayload(healthCheck), Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - var payload = new WebhookApplicationUpdatePayload - { - EventType = WebhookEventType.ApplicationUpdate, - Message = updateMessage.Message, - PreviousVersion = updateMessage.PreviousVersion.ToString(), - NewVersion = updateMessage.NewVersion.ToString() - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildApplicationUpdatePayload(updateMessage), Settings); } public override string Name => "Webhook"; @@ -157,36 +75,7 @@ namespace NzbDrone.Core.Notifications.Webhook { try { - var payload = new WebhookGrabPayload - { - EventType = WebhookEventType.Test, - Movie = new WebhookMovie - { - Id = 1, - Title = "Test Title", - Year = 1970, - FolderPath = "C:\\testpath", - ReleaseDate = "1970-01-01" - }, - RemoteMovie = new WebhookRemoteMovie - { - TmdbId = 1234, - ImdbId = "5678", - Title = "Test title", - Year = 1970 - }, - Release = new WebhookRelease - { - Indexer = "Test Indexer", - Quality = "Test Quality", - QualityVersion = 1, - ReleaseGroup = "Test Group", - ReleaseTitle = "Test Title", - Size = 9999999 - } - }; - - _proxy.SendWebhook(payload, Settings); + _proxy.SendWebhook(BuildTestPayload(), Settings); } catch (WebhookException ex) { diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs new file mode 100644 index 000000000..e3cedd177 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs @@ -0,0 +1,171 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Movies; +using NzbDrone.Core.ThingiProvider; + +namespace NzbDrone.Core.Notifications.Webhook +{ + public abstract class WebhookBase : NotificationBase + where TSettings : IProviderConfig, new() + { + private readonly IConfigFileProvider _configFileProvider; + + protected WebhookBase(IConfigFileProvider configFileProvider) + : base() + { + _configFileProvider = configFileProvider; + } + + protected WebhookGrabPayload BuildOnGrabPayload(GrabMessage message) + { + var remoteMovie = message.RemoteMovie; + var quality = message.Quality; + + return new WebhookGrabPayload + { + EventType = WebhookEventType.Grab, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(message.Movie), + RemoteMovie = new WebhookRemoteMovie(remoteMovie), + Release = new WebhookRelease(quality, remoteMovie), + DownloadClient = message.DownloadClientName, + DownloadClientType = message.DownloadClientType, + DownloadId = message.DownloadId + }; + } + + protected WebhookImportPayload BuildOnDownloadPayload(DownloadMessage message) + { + var movieFile = message.MovieFile; + + var payload = new WebhookImportPayload + { + EventType = WebhookEventType.Download, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(message.Movie), + RemoteMovie = new WebhookRemoteMovie(message.Movie), + MovieFile = new WebhookMovieFile(movieFile), + IsUpgrade = message.OldMovieFiles.Any(), + DownloadClient = message.DownloadClientInfo?.Name, + DownloadClientType = message.DownloadClientInfo?.Type, + DownloadId = message.DownloadId + }; + + if (message.OldMovieFiles.Any()) + { + payload.DeletedFiles = message.OldMovieFiles.ConvertAll(x => + new WebhookMovieFile(x) + { + Path = Path.Combine(message.Movie.Path, x.RelativePath) + }); + } + + return payload; + } + + protected WebhookRenamePayload BuildOnMovieAdded(Movie movie) + { + return new WebhookRenamePayload + { + EventType = WebhookEventType.MovieAdded, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(movie) + }; + } + + protected WebhookMovieFileDeletePayload BuildOnMovieFileDelete(MovieFileDeleteMessage deleteMessage) + { + return new WebhookMovieFileDeletePayload + { + EventType = WebhookEventType.MovieFileDelete, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(deleteMessage.Movie), + MovieFile = new WebhookMovieFile(deleteMessage.MovieFile), + DeleteReason = deleteMessage.Reason + }; + } + + protected WebhookMovieDeletePayload BuildOnMovieDelete(MovieDeleteMessage deleteMessage) + { + return new WebhookMovieDeletePayload + { + EventType = WebhookEventType.MovieDelete, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(deleteMessage.Movie), + DeletedFiles = deleteMessage.DeletedFiles + }; + } + + protected WebhookRenamePayload BuildOnRenamePayload(Movie movie, List renamedFiles) + { + return new WebhookRenamePayload + { + EventType = WebhookEventType.Rename, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie(movie), + RenamedMovieFiles = renamedFiles.ConvertAll(x => new WebhookRenamedMovieFile(x)) + }; + } + + protected WebhookHealthPayload BuildHealthPayload(HealthCheck.HealthCheck healthCheck) + { + return new WebhookHealthPayload + { + EventType = WebhookEventType.Health, + InstanceName = _configFileProvider.InstanceName, + Level = healthCheck.Type, + Message = healthCheck.Message, + Type = healthCheck.Source.Name, + WikiUrl = healthCheck.WikiUrl?.ToString() + }; + } + + protected WebhookApplicationUpdatePayload BuildApplicationUpdatePayload(ApplicationUpdateMessage updateMessage) + { + return new WebhookApplicationUpdatePayload + { + EventType = WebhookEventType.ApplicationUpdate, + InstanceName = _configFileProvider.InstanceName, + Message = updateMessage.Message, + PreviousVersion = updateMessage.PreviousVersion.ToString(), + NewVersion = updateMessage.NewVersion.ToString() + }; + } + + protected WebhookPayload BuildTestPayload() + { + return new WebhookGrabPayload + { + EventType = WebhookEventType.Test, + InstanceName = _configFileProvider.InstanceName, + Movie = new WebhookMovie + { + Id = 1, + Title = "Test Title", + Year = 1970, + FolderPath = "C:\\testpath", + ReleaseDate = "1970-01-01" + }, + RemoteMovie = new WebhookRemoteMovie + { + TmdbId = 1234, + ImdbId = "5678", + Title = "Test title", + Year = 1970 + }, + Release = new WebhookRelease + { + Indexer = "Test Indexer", + Quality = "Test Quality", + QualityVersion = 1, + ReleaseGroup = "Test Group", + ReleaseTitle = "Test Title", + Size = 9999999 + } + }; + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookPayload.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookPayload.cs index 4b63a748e..05d51c7c1 100755 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookPayload.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookPayload.cs @@ -3,5 +3,6 @@ namespace NzbDrone.Core.Notifications.Webhook public class WebhookPayload { public WebhookEventType EventType { get; set; } + public string InstanceName { get; set; } } }