Convert Notifiarr Payload to JSON, Standardize with Webhook

pull/7771/head
Qstick 2 years ago
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 @@ 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<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)
{
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);
}
}
}

@ -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()
{

@ -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 @@ 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<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 @@ 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)
{

@ -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…
Cancel
Save