mirror of
https://github.com/Radarr/Radarr.git
synced 2024-10-03 22:57:18 +02:00
Convert Notifiarr Payload to JSON, Standardize with Webhook
This commit is contained in:
parent
d70d351ea2
commit
adcd00d9fd
@ -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<NotifiarrSettings>
|
||||
public class Notifiarr : WebhookBase<NotifiarrSettings>
|
||||
{
|
||||
private readonly INotifiarrProxy _proxy;
|
||||
|
||||
public Notifiarr(INotifiarrProxy proxy)
|
||||
public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider)
|
||||
: base(configFileProvider)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
@ -25,179 +24,65 @@ public Notifiarr(INotifiarrProxy proxy)
|
||||
|
||||
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();
|
||||
_proxy.SendNotification(BuildOnDownloadPayload(message), Settings);
|
||||
}
|
||||
|
||||
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(variables, Settings);
|
||||
public override void OnMovieRename(Movie movie, List<RenamedMovieFile> 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<ValidationFailure>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
ProcessNotification(payload, settings);
|
||||
}
|
||||
|
||||
private void ProcessNotification(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");
|
||||
}
|
||||
}
|
||||
var request = new HttpRequestBuilder(URL + "/api/v1/notification/radarr")
|
||||
.Accept(HttpAccept.Json)
|
||||
.SetHeader("X-API-Key", settings.APIKey)
|
||||
.Build();
|
||||
|
||||
public ValidationFailure Test(NotifiarrSettings settings)
|
||||
{
|
||||
try
|
||||
{
|
||||
var variables = new StringDictionary();
|
||||
variables.Add("Radarr_EventType", "Test");
|
||||
request.Method = HttpMethod.Post;
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessNotification(StringDictionary message, 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();
|
||||
|
||||
foreach (string key in message.Keys)
|
||||
{
|
||||
requestBuilder.AddFormParameter(key, message[key]);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,6 @@ public class NotifiarrSettings : IProviderConfig
|
||||
|
||||
[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()
|
||||
{
|
||||
|
@ -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<WebhookSettings>
|
||||
public class Webhook : WebhookBase<WebhookSettings>
|
||||
{
|
||||
private readonly IWebhookProxy _proxy;
|
||||
|
||||
public Webhook(IWebhookProxy proxy)
|
||||
public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider)
|
||||
: base(configFileProvider)
|
||||
{
|
||||
_proxy = proxy;
|
||||
}
|
||||
@ -22,124 +22,42 @@ public Webhook(IWebhookProxy proxy)
|
||||
|
||||
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<RenamedMovieFile> 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 @@ private ValidationFailure SendWebhookTest()
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
171
src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs
Normal file
171
src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs
Normal file
@ -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<TSettings> : NotificationBase<TSettings>
|
||||
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<RenamedMovieFile> 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
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -3,5 +3,6 @@ namespace NzbDrone.Core.Notifications.Webhook
|
||||
public class WebhookPayload
|
||||
{
|
||||
public WebhookEventType EventType { get; set; }
|
||||
public string InstanceName { get; set; }
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user