From ee4b6c94427c61c0716df288b12068b67f904f39 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 28 Jul 2011 00:21:49 -0700 Subject: [PATCH] ExternalNotifications enabled (Xbmc only right now). - Grab, Download, Rename Notification Settings for Xbmc uses definitions. --- NzbDrone.Core/CentralDispatch.cs | 7 +- .../Datastore/Migrations/Migration20110726.cs | 30 ++++++ NzbDrone.Core/NzbDrone.Core.csproj | 7 +- NzbDrone.Core/Providers/DiskScanProvider.cs | 22 ++++- NzbDrone.Core/Providers/DownloadProvider.cs | 8 +- ...derBase.cs => ExternalNotificationBase.cs} | 35 +------ .../Providers/ExternalNotification/Xbmc.cs | 66 +++++++++++++ .../XbmcNotificationProvider.cs | 92 ------------------- .../Providers/ExternalNotificationProvider.cs | 68 ++++++++++---- .../Providers/Jobs/PostDownloadScanJob.cs | 2 +- .../ExternalNotificationDefinition.cs | 17 ++++ .../Repository/ExternalNotificationSetting.cs | 17 ---- .../Controllers/SettingsController.cs | 15 ++- 13 files changed, 211 insertions(+), 175 deletions(-) create mode 100644 NzbDrone.Core/Datastore/Migrations/Migration20110726.cs rename NzbDrone.Core/Providers/ExternalNotification/{ExternalNotificationProviderBase.cs => ExternalNotificationBase.cs} (53%) create mode 100644 NzbDrone.Core/Providers/ExternalNotification/Xbmc.cs delete mode 100644 NzbDrone.Core/Providers/ExternalNotification/XbmcNotificationProvider.cs create mode 100644 NzbDrone.Core/Repository/ExternalNotificationDefinition.cs delete mode 100644 NzbDrone.Core/Repository/ExternalNotificationSetting.cs diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 6d9f15f4b..5ac60dd4e 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -62,9 +62,9 @@ namespace NzbDrone.Core _kernel.Get().SetupDefaultProfiles(); + BindExternalNotifications(); BindIndexers(); BindJobs(); - BindExternalNotifications(); } private static void BindKernel() @@ -111,8 +111,9 @@ namespace NzbDrone.Core private static void BindExternalNotifications() { - _kernel.Bind().To().InSingletonScope(); - var notifiers = _kernel.GetAll(); + _kernel.Bind().To(); + + var notifiers = _kernel.GetAll(); _kernel.Get().InitializeNotifiers(notifiers.ToList()); } diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs new file mode 100644 index 000000000..c0ed06601 --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs @@ -0,0 +1,30 @@ +using System; +using System.Data; +using Migrator.Framework; + +namespace NzbDrone.Core.Datastore.Migrations +{ + + [Migration(20110726)] + public class Migration20110726 : Migration + { + public override void Up() + { + Database.RemoveTable("ExternalNotificationSettings"); + + Database.AddTable("ExternalNotificationDefinitions", new[] + { + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), + new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), + new Column("ExternalNotificationProviderType", DbType.String, ColumnProperty.NotNull), + new Column("Name", DbType.String, ColumnProperty.NotNull) + }); + } + + + public override void Down() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 31072b292..0eb47a119 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -176,6 +176,7 @@ + @@ -203,8 +204,8 @@ - - + + @@ -224,7 +225,7 @@ - + diff --git a/NzbDrone.Core/Providers/DiskScanProvider.cs b/NzbDrone.Core/Providers/DiskScanProvider.cs index 7c04d7eb4..49dd9bc8f 100644 --- a/NzbDrone.Core/Providers/DiskScanProvider.cs +++ b/NzbDrone.Core/Providers/DiskScanProvider.cs @@ -18,18 +18,22 @@ namespace NzbDrone.Core.Providers private readonly EpisodeProvider _episodeProvider; private readonly MediaFileProvider _mediaFileProvider; private readonly SeriesProvider _seriesProvider; + private readonly ExternalNotificationProvider _externalNotificationProvider; + private readonly SabProvider _sabProvider; [Inject] public DiskScanProvider(DiskProvider diskProvider, EpisodeProvider episodeProvider, - SeriesProvider seriesProvider, MediaFileProvider mediaFileProvider) + SeriesProvider seriesProvider, MediaFileProvider mediaFileProvider, + ExternalNotificationProvider externalNotificationProvider, SabProvider sabProvider) { _diskProvider = diskProvider; _episodeProvider = episodeProvider; _seriesProvider = seriesProvider; _mediaFileProvider = mediaFileProvider; + _externalNotificationProvider = externalNotificationProvider; + _sabProvider = sabProvider; } - public DiskScanProvider() { } @@ -142,7 +146,7 @@ namespace NzbDrone.Core.Providers return episodeFile; } - public virtual bool MoveEpisodeFile(EpisodeFile episodeFile) + public virtual bool MoveEpisodeFile(EpisodeFile episodeFile, bool newDownload = false) { if (episodeFile == null) throw new ArgumentNullException("episodeFile"); @@ -163,6 +167,18 @@ namespace NzbDrone.Core.Providers episodeFile.Path = newFile.FullName; _mediaFileProvider.Update(episodeFile); + //ExternalNotification + var parseResult = Parser.ParsePath(episodeFile.Path); + parseResult.Series = series; + + var message = _sabProvider.GetSabTitle(parseResult); + + if (newDownload) + _externalNotificationProvider.OnDownload(message, series); + + else + _externalNotificationProvider.OnRename(message, series); + return true; } diff --git a/NzbDrone.Core/Providers/DownloadProvider.cs b/NzbDrone.Core/Providers/DownloadProvider.cs index 9a32b609f..e4abe5342 100644 --- a/NzbDrone.Core/Providers/DownloadProvider.cs +++ b/NzbDrone.Core/Providers/DownloadProvider.cs @@ -11,14 +11,18 @@ namespace NzbDrone.Core.Providers private readonly SabProvider _sabProvider; private readonly HistoryProvider _historyProvider; private readonly EpisodeProvider _episodeProvider; + private readonly ExternalNotificationProvider _externalNotificationProvider; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [Inject] - public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider, EpisodeProvider episodeProvider) + public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider, + EpisodeProvider episodeProvider, ExternalNotificationProvider externalNotificationProvider) { _sabProvider = sabProvider; _historyProvider = historyProvider; _episodeProvider = episodeProvider; + _externalNotificationProvider = externalNotificationProvider; } public DownloadProvider() @@ -55,6 +59,8 @@ namespace NzbDrone.Core.Providers } } + _externalNotificationProvider.OnGrab(sabTitle); + return addSuccess; } } diff --git a/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs b/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationBase.cs similarity index 53% rename from NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs rename to NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationBase.cs index d21d8bf35..811713e22 100644 --- a/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs +++ b/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationBase.cs @@ -6,16 +6,14 @@ using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers.ExternalNotification { - public abstract class ExternalNotificationProviderBase + public abstract class ExternalNotificationBase { protected readonly Logger _logger; protected readonly ConfigProvider _configProvider; - protected readonly ExternalNotificationProvider _externalNotificationProvider; - protected ExternalNotificationProviderBase(ConfigProvider configProvider, ExternalNotificationProvider externalNotificationProvider) + protected ExternalNotificationBase(ConfigProvider configProvider) { _configProvider = configProvider; - _externalNotificationProvider = externalNotificationProvider; _logger = LogManager.GetLogger(GetType().ToString()); } @@ -24,35 +22,6 @@ namespace NzbDrone.Core.Providers.ExternalNotification /// public abstract string Name { get; } - public ExternalNotificationSetting Settings - { - get - { - return _externalNotificationProvider.GetSettings(GetType()); - } - } - - public virtual void Notify(ExternalNotificationType type, string message, int seriesId = 0) - { - if (type == ExternalNotificationType.Grab) - OnGrab(message); - - else if (type == ExternalNotificationType.Download) - { - throw new NotImplementedException(); - var series = new Series(); - OnDownload(message, series); - } - - - else if (type == ExternalNotificationType.Rename) - { - throw new NotImplementedException(); - var series = new Series(); - OnRename(message, series); - } - } - /// /// Performs the on grab action /// diff --git a/NzbDrone.Core/Providers/ExternalNotification/Xbmc.cs b/NzbDrone.Core/Providers/ExternalNotification/Xbmc.cs new file mode 100644 index 000000000..2533fc54e --- /dev/null +++ b/NzbDrone.Core/Providers/ExternalNotification/Xbmc.cs @@ -0,0 +1,66 @@ +using System; +using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers.ExternalNotification +{ + public class Xbmc : ExternalNotificationBase + { + private readonly XbmcProvider _xbmcProvider; + + public Xbmc(ConfigProvider configProvider, XbmcProvider xbmcProvider) + : base(configProvider) + { + _xbmcProvider = xbmcProvider; + } + + public override string Name + { + get { return "XBMC"; } + } + + public override void OnGrab(string message) + { + const string header = "NzbDrone [TV] - Grabbed"; + + if (_configProvider.XbmcNotifyOnGrab) + { + _logger.Trace("Sending Notification to XBMC"); + _xbmcProvider.Notify(header, message); + } + } + + public override void OnDownload(string message, Series series) + { + const string header = "NzbDrone [TV] - Downloaded"; + + if (_configProvider.XbmcNotifyOnDownload) + { + _logger.Trace("Sending Notification to XBMC"); + _xbmcProvider.Notify(header, message); + } + + UpdateAndClean(series); + } + + public override void OnRename(string message, Series series) + { + UpdateAndClean(series); + } + + private void UpdateAndClean(Series series) + { + if (_configProvider.XbmcUpdateLibrary) + { + _logger.Trace("Sending Update Request to XBMC"); + _xbmcProvider.Update(series); + } + + if (_configProvider.XbmcCleanLibrary) + { + _logger.Trace("Sending Clean DB Request to XBMC"); + _xbmcProvider.Clean(); + } + } + } +} diff --git a/NzbDrone.Core/Providers/ExternalNotification/XbmcNotificationProvider.cs b/NzbDrone.Core/Providers/ExternalNotification/XbmcNotificationProvider.cs deleted file mode 100644 index 458efcec3..000000000 --- a/NzbDrone.Core/Providers/ExternalNotification/XbmcNotificationProvider.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Repository; - -namespace NzbDrone.Core.Providers.ExternalNotification -{ - public class XbmcNotificationProvider : ExternalNotificationProviderBase - { - private readonly XbmcProvider _xbmcProvider; - - public XbmcNotificationProvider(ConfigProvider configProvider, XbmcProvider xbmcProvider, - ExternalNotificationProvider externalNotificationProvider) - : base(configProvider, externalNotificationProvider) - { - _xbmcProvider = xbmcProvider; - } - - public override string Name - { - get { return "XBMC"; } - } - - public override void OnGrab(string message) - { - const string header = "NzbDrone [TV] - Grabbed"; - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcEnabled", false))) - { - if (Convert.ToBoolean(_configProvider.GetValue("XbmcNotifyOnGrab", false))) - { - _logger.Trace("Sending Notification to XBMC"); - _xbmcProvider.Notify(header, message); - return; - } - _logger.Trace("XBMC NotifyOnGrab is not enabled"); - } - - _logger.Trace("XBMC Notifier is not enabled"); - } - - public override void OnDownload(string message, Series series) - { - const string header = "NzbDrone [TV] - Downloaded"; - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcEnabled", false))) - { - if (Convert.ToBoolean(_configProvider.GetValue("XbmcNotifyOnDownload", false))) - { - _logger.Trace("Sending Notification to XBMC"); - _xbmcProvider.Notify(header, message); - } - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcUpdateOnDownload", false))) - { - _logger.Trace("Sending Update Request to XBMC"); - _xbmcProvider.Update(series); - } - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcCleanOnDownload", false))) - { - _logger.Trace("Sending Clean DB Request to XBMC"); - _xbmcProvider.Clean(); - } - } - - _logger.Trace("XBMC Notifier is not enabled"); - } - - public override void OnRename(string message, Series series) - { - const string header = "NzbDrone [TV] - Renamed"; - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcNotifyOnRename", false))) - { - _logger.Trace("Sending Notification to XBMC"); - _xbmcProvider.Notify(header, message); - } - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcUpdateOnRename", false))) - { - _logger.Trace("Sending Update Request to XBMC"); - _xbmcProvider.Update(series); - } - - if (Convert.ToBoolean(_configProvider.GetValue("XbmcCleanOnRename", false))) - { - _logger.Trace("Sending Clean DB Request to XBMC"); - _xbmcProvider.Clean(); - } - } - } -} diff --git a/NzbDrone.Core/Providers/ExternalNotificationProvider.cs b/NzbDrone.Core/Providers/ExternalNotificationProvider.cs index 4cba27051..749c12875 100644 --- a/NzbDrone.Core/Providers/ExternalNotificationProvider.cs +++ b/NzbDrone.Core/Providers/ExternalNotificationProvider.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Linq; using Ninject; using NLog; +using NzbDrone.Core.Model; using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Repository; using PetaPoco; @@ -13,10 +15,13 @@ namespace NzbDrone.Core.Providers private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly IDatabase _database; - [Inject] - public ExternalNotificationProvider(IDatabase database) + private IEnumerable _notifiers; + + [Inject] + public ExternalNotificationProvider(IDatabase database, IEnumerable notifiers) { _database = database; + _notifiers = notifiers; } public ExternalNotificationProvider() @@ -24,51 +29,54 @@ namespace NzbDrone.Core.Providers } - public virtual List All() + public virtual List All() { - return _database.Fetch(); + return _database.Fetch(); } - public virtual void SaveSettings(ExternalNotificationSetting settings) + public virtual void SaveSettings(ExternalNotificationDefinition settings) { if (settings.Id == 0) { - Logger.Debug("Adding External Notification settings for {0}", settings.Name); + Logger.Debug("Adding External Notification definition for {0}", settings.Name); _database.Insert(settings); } else { - Logger.Debug("Updating External Notification settings for {0}", settings.Name); + Logger.Debug("Updating External Notification definition for {0}", settings.Name); _database.Update(settings); } } - public virtual ExternalNotificationSetting GetSettings(Type type) + public virtual ExternalNotificationDefinition GetSettings(Type type) { - return _database.SingleOrDefault("WHERE NotifierName = @0", type.ToString()); + return _database.SingleOrDefault("WHERE ExternalNotificationProviderType = @0", type.ToString()); } - public virtual ExternalNotificationSetting GetSettings(int id) + public virtual IList GetEnabledExternalNotifiers() { - return _database.SingleOrDefault(id); + var all = All(); + return _notifiers.Where(i => all.Exists(c => c.ExternalNotificationProviderType == i.GetType().ToString() && c.Enable)).ToList(); } - public virtual void InitializeNotifiers(IList notifiers) + public virtual void InitializeNotifiers(IList notifiers) { Logger.Info("Initializing notifiers. Count {0}", notifiers.Count); + _notifiers = notifiers; + var currentNotifiers = All(); - foreach (var feedProvider in notifiers) + foreach (var notificationProvider in notifiers) { - ExternalNotificationProviderBase externalNotificationProviderLocal = feedProvider; - if (!currentNotifiers.Exists(c => c.NotifierName == externalNotificationProviderLocal.GetType().ToString())) + ExternalNotificationBase externalNotificationProviderLocal = notificationProvider; + if (!currentNotifiers.Exists(c => c.ExternalNotificationProviderType == externalNotificationProviderLocal.GetType().ToString())) { - var settings = new ExternalNotificationSetting() + var settings = new ExternalNotificationDefinition { - Enabled = false, - NotifierName = externalNotificationProviderLocal.GetType().ToString(), + Enable = false, + ExternalNotificationProviderType = externalNotificationProviderLocal.GetType().ToString(), Name = externalNotificationProviderLocal.Name }; @@ -76,5 +84,29 @@ namespace NzbDrone.Core.Providers } } } + + public virtual void OnGrab(string message) + { + foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) + { + notifier.OnGrab(message); + } + } + + public virtual void OnDownload(string message, Series series) + { + foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) + { + notifier.OnDownload(message, series); + } + } + + public virtual void OnRename(string message, Series series) + { + foreach (var notifier in _notifiers.Where(i => GetSettings(i.GetType()).Enable)) + { + notifier.OnRename(message, series); + } + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs index dbf84db30..509c9bea5 100644 --- a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs +++ b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs @@ -84,7 +84,7 @@ namespace NzbDrone.Core.Providers.Jobs } var importedFiles = _diskScanProvider.Scan(series, subfolder); - importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file)); + importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); //Delete the folder only if folder is small enough if (_diskProvider.GetDirectorySize(subfolder) < 10.Megabytes()) diff --git a/NzbDrone.Core/Repository/ExternalNotificationDefinition.cs b/NzbDrone.Core/Repository/ExternalNotificationDefinition.cs new file mode 100644 index 000000000..64a3abba1 --- /dev/null +++ b/NzbDrone.Core/Repository/ExternalNotificationDefinition.cs @@ -0,0 +1,17 @@ +using PetaPoco; + +namespace NzbDrone.Core.Repository +{ + [TableName("ExternalNotificationDefinitions")] + [PrimaryKey("Id", autoIncrement = true)] + public class ExternalNotificationDefinition + { + public int Id { get; set; } + + public bool Enable { get; set; } + + public string ExternalNotificationProviderType { get; set; } + + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Repository/ExternalNotificationSetting.cs b/NzbDrone.Core/Repository/ExternalNotificationSetting.cs deleted file mode 100644 index b6d946b69..000000000 --- a/NzbDrone.Core/Repository/ExternalNotificationSetting.cs +++ /dev/null @@ -1,17 +0,0 @@ -using PetaPoco; - -namespace NzbDrone.Core.Repository -{ - [TableName("ExternalNotificationSettings")] - [PrimaryKey("Id", autoIncrement = true)] - public class ExternalNotificationSetting - { - public int Id { get; set; } - - public bool Enabled { get; set; } - - public string NotifierName { get; set; } - - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index 5223e4945..5c2a36436 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -9,6 +9,7 @@ using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; @@ -30,12 +31,15 @@ namespace NzbDrone.Web.Controllers private readonly NotificationProvider _notificationProvider; private readonly DiskProvider _diskProvider; private readonly SeriesProvider _seriesProvider; + private readonly ExternalNotificationProvider _externalNotificationProvider; public SettingsController(ConfigProvider configProvider, IndexerProvider indexerProvider, QualityProvider qualityProvider, RootDirProvider rootDirProvider, AutoConfigureProvider autoConfigureProvider, NotificationProvider notificationProvider, - DiskProvider diskProvider, SeriesProvider seriesProvider) + DiskProvider diskProvider, SeriesProvider seriesProvider, + ExternalNotificationProvider externalNotificationProvider) { + _externalNotificationProvider = externalNotificationProvider; _configProvider = configProvider; _indexerProvider = indexerProvider; _qualityProvider = qualityProvider; @@ -140,7 +144,7 @@ namespace NzbDrone.Web.Controllers { var model = new NotificationSettingsModel { - XbmcEnabled = _configProvider.XbmcEnabled, + XbmcEnabled = _externalNotificationProvider.GetSettings(typeof(Xbmc)).Enable, XbmcNotifyOnGrab = _configProvider.XbmcNotifyOnGrab, XbmcNotifyOnDownload = _configProvider.XbmcNotifyOnDownload, XbmcUpdateLibrary = _configProvider.XbmcUpdateLibrary, @@ -262,7 +266,6 @@ namespace NzbDrone.Web.Controllers return new JsonResult { Data = "failed" }; } } - [HttpPost] public ActionResult SaveIndexers(IndexerSettingsModel data) @@ -395,7 +398,11 @@ namespace NzbDrone.Web.Controllers if (ModelState.IsValid) { - _configProvider.XbmcEnabled = data.XbmcEnabled; + //XBMC Enabled + var xbmcSettings = _externalNotificationProvider.GetSettings(typeof(Xbmc)); + xbmcSettings.Enable = data.XbmcEnabled; + _externalNotificationProvider.SaveSettings(xbmcSettings); + _configProvider.XbmcNotifyOnGrab = data.XbmcNotifyOnGrab; _configProvider.XbmcNotifyOnDownload = data.XbmcNotifyOnDownload; _configProvider.XbmcUpdateLibrary = data.XbmcUpdateLibrary;