New: Add Webhook support to sonarr
Add Form type url (type=url input field)
Add isValidUrl input type validation
Only allow absolute urls when checking if a url is valid
String => string as per comments that sonarr is standarizing on the lowercase primative
Remove this before function calls
Refactored everything so OnGrab is supported
Don't double submit the webhook
Wrappers around Series, EpisodeFile, Episode so the entire data structure isn't exposed
Add Braces as per style guide
Series.ID and Series.TvdbId should be integers
Reorder webhook payload as per style guide
Upgrade to use ongrab as json instead of string
Add method selection to webhook settings
include episode directly in download event
QualityVersion should be an int and not a string (don't convert it int=>string)
Remove the list of episodes
Add season number to episode data structure
Code Review Fixes:
* Remove episodefile from payload, move everything to episode
* Change episode to a list
convert to var as per code review / style guide
Down with internals
Everything now uses webhookpayload. None of that payload.Message stuff
{"EventType":"Test","Series":{"Id":1,"Title":"Test Title","Path":"C:\\testpath","TvdbId":1234},"Episodes":[{"Id":123,"EpisodeNumber":1,"SeasonNumber":1,"Title":"Test title","AirDate":null,"AirDateUtc":null,"Quality":null,"QualityVersion":0,"ReleaseGroup":null,"SceneName":null}]}
Remove logger and processProvider
Remove unused constructor
9 years ago
|
|
|
|
using FluentValidation.Results;
|
|
|
|
|
using NzbDrone.Core.MediaFiles;
|
|
|
|
|
using NzbDrone.Core.Tv;
|
|
|
|
|
using NzbDrone.Core.Validation;
|
|
|
|
|
using NzbDrone.Core.Rest;
|
|
|
|
|
using RestSharp;
|
|
|
|
|
using NzbDrone.Core.Qualities;
|
|
|
|
|
using NzbDrone.Core.Parser.Model;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Core.Notifications.Webhook
|
|
|
|
|
{
|
|
|
|
|
public interface IWebhookService
|
|
|
|
|
{
|
|
|
|
|
void OnDownload(Series series, EpisodeFile episodeFile, WebhookSettings settings);
|
|
|
|
|
void OnRename(Series series, WebhookSettings settings);
|
|
|
|
|
void OnGrab(Series series, RemoteEpisode episode, QualityModel quality, WebhookSettings settings);
|
|
|
|
|
ValidationFailure Test(WebhookSettings settings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class WebhookService : IWebhookService
|
|
|
|
|
{
|
|
|
|
|
public void OnDownload(Series series, EpisodeFile episodeFile, WebhookSettings settings)
|
|
|
|
|
{
|
|
|
|
|
var payload = new WebhookPayload
|
|
|
|
|
{
|
|
|
|
|
EventType = "Download",
|
|
|
|
|
Series = new WebhookSeries(series),
|
|
|
|
|
Episodes = episodeFile.Episodes.Value.ConvertAll(x => new WebhookEpisode(x) {
|
|
|
|
|
Quality = episodeFile.Quality.Quality.Name,
|
|
|
|
|
QualityVersion = episodeFile.Quality.Revision.Version,
|
|
|
|
|
ReleaseGroup = episodeFile.ReleaseGroup,
|
|
|
|
|
SceneName = episodeFile.SceneName
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
NotifyWebhook(payload, settings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnRename(Series series, WebhookSettings settings)
|
|
|
|
|
{
|
|
|
|
|
var payload = new WebhookPayload
|
|
|
|
|
{
|
|
|
|
|
EventType = "Rename",
|
|
|
|
|
Series = new WebhookSeries(series)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
NotifyWebhook(payload, settings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnGrab(Series series, RemoteEpisode episode, QualityModel quality, WebhookSettings settings)
|
|
|
|
|
{
|
|
|
|
|
var payload = new WebhookPayload
|
|
|
|
|
{
|
|
|
|
|
EventType = "Grab",
|
|
|
|
|
Series = new WebhookSeries(series),
|
|
|
|
|
Episodes = episode.Episodes.ConvertAll(x => new WebhookEpisode(x)
|
|
|
|
|
{
|
|
|
|
|
Quality = quality.Quality.Name,
|
|
|
|
|
QualityVersion = quality.Revision.Version,
|
|
|
|
|
ReleaseGroup = episode.ParsedEpisodeInfo.ReleaseGroup
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
NotifyWebhook(payload, settings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void NotifyWebhook(WebhookPayload body, WebhookSettings settings)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
var client = RestClientFactory.BuildClient(settings.Url);
|
|
|
|
|
var request = new RestRequest((Method) settings.Method);
|
|
|
|
|
request.RequestFormat = DataFormat.Json;
|
|
|
|
|
request.AddBody(body);
|
|
|
|
|
client.ExecuteAndValidate(request);
|
|
|
|
|
}
|
|
|
|
|
catch (RestException ex)
|
|
|
|
|
{
|
|
|
|
|
throw new WebhookException("Unable to post to webhook: {0}", ex, ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ValidationFailure Test(WebhookSettings settings)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
NotifyWebhook(
|
|
|
|
|
new WebhookPayload
|
|
|
|
|
{
|
|
|
|
|
EventType = "Test",
|
|
|
|
|
Series = new WebhookSeries()
|
|
|
|
|
{
|
|
|
|
|
Id = 1,
|
|
|
|
|
Title = "Test Title",
|
|
|
|
|
Path = "C:\\testpath",
|
|
|
|
|
TvdbId = 1234
|
|
|
|
|
},
|
|
|
|
|
Episodes = new List<WebhookEpisode>() {
|
|
|
|
|
new WebhookEpisode()
|
|
|
|
|
{
|
|
|
|
|
Id = 123,
|
|
|
|
|
EpisodeNumber = 1,
|
|
|
|
|
SeasonNumber = 1,
|
|
|
|
|
Title = "Test title"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
settings
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
catch (WebhookException ex)
|
|
|
|
|
{
|
|
|
|
|
return new NzbDroneValidationFailure("Url", ex.Message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|