parent
8ae66c17f8
commit
3ced1843bf
Binary file not shown.
Binary file not shown.
@ -0,0 +1,15 @@
|
|||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(37)]
|
||||||
|
public class remove_growl_prowl : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Delete.FromTable("Notifications").Row(new { Implementation = "Growl" });
|
||||||
|
Delete.FromTable("Notifications").Row(new { Implementation = "Prowl" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,55 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using FluentValidation.Results;
|
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Notifications.Growl
|
|
||||||
{
|
|
||||||
public class Growl : NotificationBase<GrowlSettings>
|
|
||||||
{
|
|
||||||
private readonly IGrowlService _growlService;
|
|
||||||
|
|
||||||
public override string Name => "Growl";
|
|
||||||
|
|
||||||
|
|
||||||
public Growl(IGrowlService growlService)
|
|
||||||
{
|
|
||||||
_growlService = growlService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string Link => "http://growl.info/";
|
|
||||||
|
|
||||||
public override void OnGrab(GrabMessage grabMessage)
|
|
||||||
{
|
|
||||||
_growlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, "GRAB", Settings.Host, Settings.Port, Settings.Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnReleaseImport(AlbumDownloadMessage message)
|
|
||||||
{
|
|
||||||
_growlService.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, "ALBUMDOWNLOAD", Settings.Host, Settings.Port, Settings.Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
|
||||||
{
|
|
||||||
_growlService.SendNotification(HEALTH_ISSUE_TITLE, message.Message, "HEALTHISSUE", Settings.Host, Settings.Port, Settings.Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnDownloadFailure(DownloadFailedMessage message)
|
|
||||||
{
|
|
||||||
_growlService.SendNotification(DOWNLOAD_FAILURE_TITLE, message.Message, "DOWNLOADFAILURE", Settings.Host, Settings.Port, Settings.Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnImportFailure(AlbumDownloadMessage message)
|
|
||||||
{
|
|
||||||
_growlService.SendNotification(IMPORT_FAILURE_TITLE, message.Message, "IMPORTFAILURE", Settings.Host, Settings.Port, Settings.Password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override ValidationResult Test()
|
|
||||||
{
|
|
||||||
var failures = new List<ValidationFailure>();
|
|
||||||
|
|
||||||
failures.AddIfNotNull(_growlService.Test(Settings));
|
|
||||||
|
|
||||||
return new ValidationResult(failures);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,162 +0,0 @@
|
|||||||
using FluentValidation.Results;
|
|
||||||
using Growl.Connector;
|
|
||||||
using Growl.CoreLibrary;
|
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using GrowlNotification = Growl.Connector.Notification;
|
|
||||||
using NLog;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Notifications.Growl
|
|
||||||
{
|
|
||||||
public interface IGrowlService
|
|
||||||
{
|
|
||||||
void SendNotification(string title, string message, string notificationTypeName, string hostname, int port, string password);
|
|
||||||
ValidationFailure Test(GrowlSettings settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GrowlService : IGrowlService
|
|
||||||
{
|
|
||||||
private readonly Logger _logger;
|
|
||||||
|
|
||||||
private readonly Application _growlApplication = new Application("Lidarr");
|
|
||||||
private readonly NotificationType[] _notificationTypes;
|
|
||||||
|
|
||||||
private class GrowlRequestState
|
|
||||||
{
|
|
||||||
private AutoResetEvent _autoEvent = new AutoResetEvent(false);
|
|
||||||
private bool _isError;
|
|
||||||
private int _code;
|
|
||||||
private string _description;
|
|
||||||
|
|
||||||
public void Wait(int timeoutMs)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!_autoEvent.WaitOne(timeoutMs))
|
|
||||||
{
|
|
||||||
throw new GrowlException(ErrorCode.TIMED_OUT, ErrorDescription.TIMED_OUT, null);
|
|
||||||
}
|
|
||||||
if (_isError)
|
|
||||||
{
|
|
||||||
throw new GrowlException(_code, _description, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
_autoEvent.Reset();
|
|
||||||
_isError = false;
|
|
||||||
_code = 0;
|
|
||||||
_description = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update()
|
|
||||||
{
|
|
||||||
_autoEvent.Set();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(int code, string description)
|
|
||||||
{
|
|
||||||
_code = code;
|
|
||||||
_description = description;
|
|
||||||
_isError = true;
|
|
||||||
_autoEvent.Set();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public GrowlService(Logger logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
_notificationTypes = GetNotificationTypes();
|
|
||||||
|
|
||||||
var logo = typeof(GrowlService).Assembly.GetManifestResourceBytes("NzbDrone.Core.Resources.Logo.64.png");
|
|
||||||
|
|
||||||
_growlApplication.Icon = new BinaryData(logo);
|
|
||||||
}
|
|
||||||
|
|
||||||
private GrowlConnector GetGrowlConnector(string hostname, int port, string password)
|
|
||||||
{
|
|
||||||
var growlConnector = new GrowlConnector(password, hostname, port);
|
|
||||||
growlConnector.OKResponse += GrowlOKResponse;
|
|
||||||
growlConnector.ErrorResponse += GrowlErrorResponse;
|
|
||||||
return growlConnector;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendNotification(string title, string message, string notificationTypeName, string hostname, int port, string password)
|
|
||||||
{
|
|
||||||
_logger.Debug("Sending Notification to: {0}:{1}", hostname, port);
|
|
||||||
|
|
||||||
var notificationType = _notificationTypes.Single(n => n.Name == notificationTypeName);
|
|
||||||
var notification = new GrowlNotification(_growlApplication.Name, notificationType.Name, DateTime.Now.Ticks.ToString(), title, message);
|
|
||||||
|
|
||||||
var growlConnector = GetGrowlConnector(hostname, port, password);
|
|
||||||
|
|
||||||
var requestState = new GrowlRequestState();
|
|
||||||
growlConnector.Notify(notification, requestState);
|
|
||||||
requestState.Wait(5000);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Register(string host, int port, string password)
|
|
||||||
{
|
|
||||||
_logger.Debug("Registering Lidarr with Growl host: {0}:{1}", host, port);
|
|
||||||
|
|
||||||
var growlConnector = GetGrowlConnector(host, port, password);
|
|
||||||
|
|
||||||
var requestState = new GrowlRequestState();
|
|
||||||
growlConnector.Register(_growlApplication, _notificationTypes, requestState);
|
|
||||||
requestState.Wait(5000);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GrowlErrorResponse(Response response, object state)
|
|
||||||
{
|
|
||||||
var requestState = state as GrowlRequestState;
|
|
||||||
if (requestState != null)
|
|
||||||
{
|
|
||||||
requestState.Update(response.ErrorCode, response.ErrorDescription);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GrowlOKResponse(Response response, object state)
|
|
||||||
{
|
|
||||||
var requestState = state as GrowlRequestState;
|
|
||||||
if (requestState != null)
|
|
||||||
{
|
|
||||||
requestState.Update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private NotificationType[] GetNotificationTypes()
|
|
||||||
{
|
|
||||||
var notificationTypes = new List<NotificationType>();
|
|
||||||
notificationTypes.Add(new NotificationType("TEST", "Test"));
|
|
||||||
notificationTypes.Add(new NotificationType("GRAB", "Album Grabbed"));
|
|
||||||
notificationTypes.Add(new NotificationType("TRACKDOWNLOAD", "Track Complete"));
|
|
||||||
notificationTypes.Add(new NotificationType("ALBUMDOWNLOAD", "Album Complete"));
|
|
||||||
|
|
||||||
return notificationTypes.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValidationFailure Test(GrowlSettings settings)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Register(settings.Host, settings.Port, settings.Password);
|
|
||||||
|
|
||||||
const string title = "Test Notification";
|
|
||||||
const string body = "This is a test message from Lidarr";
|
|
||||||
|
|
||||||
SendNotification(title, body, "TEST", settings.Host, settings.Port, settings.Password);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.Error(ex, "Unable to send test message");
|
|
||||||
return new ValidationFailure("Host", "Unable to send test message");
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using FluentValidation.Results;
|
|
||||||
using NzbDrone.Common.Extensions;
|
|
||||||
using Prowlin;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Notifications.Prowl
|
|
||||||
{
|
|
||||||
public class Prowl : NotificationBase<ProwlSettings>
|
|
||||||
{
|
|
||||||
private readonly IProwlService _prowlService;
|
|
||||||
|
|
||||||
public Prowl(IProwlService prowlService)
|
|
||||||
{
|
|
||||||
_prowlService = prowlService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string Link => "https://www.prowlapp.com/";
|
|
||||||
public override string Name => "Prowl";
|
|
||||||
|
|
||||||
public override void OnGrab(GrabMessage grabMessage)
|
|
||||||
{
|
|
||||||
_prowlService.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnReleaseImport(AlbumDownloadMessage message)
|
|
||||||
{
|
|
||||||
_prowlService.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnHealthIssue(HealthCheck.HealthCheck message)
|
|
||||||
{
|
|
||||||
_prowlService.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override ValidationResult Test()
|
|
||||||
{
|
|
||||||
var failures = new List<ValidationFailure>();
|
|
||||||
|
|
||||||
failures.AddIfNotNull(_prowlService.Test(Settings));
|
|
||||||
|
|
||||||
return new ValidationResult(failures);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue