diff --git a/src/NzbDrone.Api/Notifications/NotificationResource.cs b/src/NzbDrone.Api/Notifications/NotificationResource.cs index 1c4bb34c5..e54f4cfa6 100644 --- a/src/NzbDrone.Api/Notifications/NotificationResource.cs +++ b/src/NzbDrone.Api/Notifications/NotificationResource.cs @@ -5,11 +5,11 @@ namespace NzbDrone.Api.Notifications { public class NotificationResource : ProviderResource { - public String Link { get; set; } - public Boolean OnGrab { get; set; } - public Boolean OnDownload { get; set; } - public Boolean OnUpgrade { get; set; } - public String TestCommand { get; set; } - public HashSet Tags { get; set; } + public string Link { get; set; } + public bool OnGrab { get; set; } + public bool OnDownload { get; set; } + public bool OnUpgrade { get; set; } + public string TestCommand { get; set; } + public HashSet Tags { get; set; } } } \ No newline at end of file diff --git a/src/NzbDrone.Api/ProviderModuleBase.cs b/src/NzbDrone.Api/ProviderModuleBase.cs index a9bc6131a..aa96c753b 100644 --- a/src/NzbDrone.Api/ProviderModuleBase.cs +++ b/src/NzbDrone.Api/ProviderModuleBase.cs @@ -55,9 +55,9 @@ namespace NzbDrone.Api private List GetAll() { - var providerDefinitions = _providerFactory.All(); + var providerDefinitions = _providerFactory.All().OrderBy(p => p.ImplementationName); - var result = new List(providerDefinitions.Count); + var result = new List(providerDefinitions.Count()); foreach (var definition in providerDefinitions) { @@ -124,7 +124,7 @@ namespace NzbDrone.Api private Response GetTemplates() { - var defaultDefinitions = _providerFactory.GetDefaultDefinitions().ToList(); + var defaultDefinitions = _providerFactory.GetDefaultDefinitions().OrderBy(p => p.ImplementationName).ToList(); var result = new List(defaultDefinitions.Count()); diff --git a/src/NzbDrone.Api/ProviderResource.cs b/src/NzbDrone.Api/ProviderResource.cs index 60c5ad78d..d26320701 100644 --- a/src/NzbDrone.Api/ProviderResource.cs +++ b/src/NzbDrone.Api/ProviderResource.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using NzbDrone.Api.ClientSchema; using NzbDrone.Api.REST; @@ -7,11 +6,12 @@ namespace NzbDrone.Api { public class ProviderResource : RestResource { - public String Name { get; set; } + public string Name { get; set; } public List Fields { get; set; } - public String Implementation { get; set; } - public String ConfigContract { get; set; } - public String InfoLink { get; set; } + public string ImplementationName { get; set; } + public string Implementation { get; set; } + public string ConfigContract { get; set; } + public string InfoLink { get; set; } public List Presets { get; set; } } diff --git a/src/NzbDrone.Core/Datastore/Extensions/MappingExtensions.cs b/src/NzbDrone.Core/Datastore/Extensions/MappingExtensions.cs index 090c2560c..87a10fd98 100644 --- a/src/NzbDrone.Core/Datastore/Extensions/MappingExtensions.cs +++ b/src/NzbDrone.Core/Datastore/Extensions/MappingExtensions.cs @@ -3,6 +3,7 @@ using System.Reflection; using Marr.Data; using Marr.Data.Mapping; using NzbDrone.Common.Reflection; +using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Datastore.Extensions { @@ -16,7 +17,11 @@ namespace NzbDrone.Core.Datastore.Extensions .AutoMapPropertiesWhere(IsMappableProperty); } - + public static ColumnMapBuilder RegisterDefinition(this FluentMappings.MappingsFluentEntity mapBuilder, string tableName = null) where T : ProviderDefinition, new() + { + return RegisterModel(mapBuilder, tableName).Ignore(c => c.ImplementationName); + } + public static ColumnMapBuilder RegisterModel(this FluentMappings.MappingsFluentEntity mapBuilder, string tableName = null) where T : ModelBase, new() { return mapBuilder.Table.MapTable(tableName) @@ -55,7 +60,5 @@ namespace NzbDrone.Core.Datastore.Extensions return false; } - - } } \ No newline at end of file diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index 4aba8c6d4..d769a9a41 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -45,18 +45,18 @@ namespace NzbDrone.Core.Datastore Mapper.Entity().RegisterModel("Config"); Mapper.Entity().RegisterModel("RootFolders").Ignore(r => r.FreeSpace); + Mapper.Entity().RegisterModel("ScheduledTasks"); - Mapper.Entity().RegisterModel("Indexers") + Mapper.Entity().RegisterDefinition("Indexers") .Ignore(i => i.Enable) .Ignore(i => i.Protocol) .Ignore(i => i.SupportsRss) .Ignore(i => i.SupportsSearch); - Mapper.Entity().RegisterModel("ScheduledTasks"); - Mapper.Entity().RegisterModel("Notifications"); - Mapper.Entity().RegisterModel("Metadata"); + Mapper.Entity().RegisterDefinition("Notifications"); + Mapper.Entity().RegisterDefinition("Metadata"); - Mapper.Entity().RegisterModel("DownloadClients") + Mapper.Entity().RegisterDefinition("DownloadClients") .Ignore(d => d.Protocol); Mapper.Entity().RegisterModel("SceneMappings"); diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs index 89c70c585..ef04defa5 100644 --- a/src/NzbDrone.Core/Download/DownloadClientBase.cs +++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Collections.Generic; using NzbDrone.Common.Disk; using NzbDrone.Core.Indexers; @@ -21,6 +20,14 @@ namespace NzbDrone.Core.Download protected readonly IRemotePathMappingService _remotePathMappingService; protected readonly Logger _logger; + public string Name + { + get + { + return GetType().Name; + } + } + public Type ConfigContract { get diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 7de3d24ac..79125d8a8 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -19,6 +19,14 @@ namespace NzbDrone.Core.Indexers protected readonly IParsingService _parsingService; protected readonly Logger _logger; + public string Name + { + get + { + return GetType().Name; + } + } + public abstract DownloadProtocol Protocol { get; } public abstract Boolean SupportsRss { get; } diff --git a/src/NzbDrone.Core/Metadata/MetadataBase.cs b/src/NzbDrone.Core/Metadata/MetadataBase.cs index e6b8c5a29..b2f47b1c2 100644 --- a/src/NzbDrone.Core/Metadata/MetadataBase.cs +++ b/src/NzbDrone.Core/Metadata/MetadataBase.cs @@ -10,6 +10,14 @@ namespace NzbDrone.Core.Metadata { public abstract class MetadataBase : IMetadata where TSettings : IProviderConfig, new() { + public string Name + { + get + { + return GetType().Name; + } + } + public Type ConfigContract { get diff --git a/src/NzbDrone.Core/Notifications/Email/Email.cs b/src/NzbDrone.Core/Notifications/Email/Email.cs index eeca1885e..cad241f6c 100644 --- a/src/NzbDrone.Core/Notifications/Email/Email.cs +++ b/src/NzbDrone.Core/Notifications/Email/Email.cs @@ -40,6 +40,14 @@ namespace NzbDrone.Core.Notifications.Email { } + public override string Name + { + get + { + return "Email"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Growl/Growl.cs b/src/NzbDrone.Core/Notifications/Growl/Growl.cs index ab745b7df..9d71bcd20 100644 --- a/src/NzbDrone.Core/Notifications/Growl/Growl.cs +++ b/src/NzbDrone.Core/Notifications/Growl/Growl.cs @@ -37,6 +37,14 @@ namespace NzbDrone.Core.Notifications.Growl { } + public override string Name + { + get + { + return "Growl"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs index a63c2a8ba..613216eef 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs @@ -53,6 +53,14 @@ namespace NzbDrone.Core.Notifications.MediaBrowser } } + public override string Name + { + get + { + return "Emby (Media Browser)"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/NotificationBase.cs b/src/NzbDrone.Core/Notifications/NotificationBase.cs index e6a1f73b5..b8d078f67 100644 --- a/src/NzbDrone.Core/Notifications/NotificationBase.cs +++ b/src/NzbDrone.Core/Notifications/NotificationBase.cs @@ -8,6 +8,8 @@ namespace NzbDrone.Core.Notifications { public abstract class NotificationBase : INotification where TSettings : IProviderConfig, new() { + public abstract string Name { get; } + public Type ConfigContract { get diff --git a/src/NzbDrone.Core/Notifications/NotifyMyAndroid/NotifyMyAndroid.cs b/src/NzbDrone.Core/Notifications/NotifyMyAndroid/NotifyMyAndroid.cs index c27fe52b4..38cb7463d 100644 --- a/src/NzbDrone.Core/Notifications/NotifyMyAndroid/NotifyMyAndroid.cs +++ b/src/NzbDrone.Core/Notifications/NotifyMyAndroid/NotifyMyAndroid.cs @@ -38,6 +38,14 @@ namespace NzbDrone.Core.Notifications.NotifyMyAndroid { } + public override string Name + { + get + { + return "Notify My Android"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs b/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs index 5255365a4..d329e6577 100644 --- a/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs +++ b/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs @@ -35,6 +35,14 @@ namespace NzbDrone.Core.Notifications.Plex { } + public override string Name + { + get + { + return "Plex Media Center"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs new file mode 100644 index 000000000..3e20df536 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using FluentValidation.Results; +using NLog; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Notifications.Xbmc; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.Notifications.Plex +{ + public class PlexHomeTheater : NotificationBase + { + private readonly IXbmcService _xbmcService; + private readonly Logger _logger; + + public PlexHomeTheater(IXbmcService xbmcService, Logger logger) + { + _xbmcService = xbmcService; + _logger = logger; + } + + public override string Link + { + get { return "https://plex.tv/"; } + } + + public override void OnGrab(string message) + { + const string header = "Sonarr - Grabbed"; + + Notify(Settings, header, message); + } + + public override void OnDownload(DownloadMessage message) + { + const string header = "Sonarr - Downloaded"; + + Notify(Settings, header, message.Message); + } + + public override void AfterRename(Series series) + { + + } + + public override string Name + { + get + { + return "Plex Home Theater"; + } + } + + public override ValidationResult Test() + { + var failures = new List(); + + failures.AddIfNotNull(_xbmcService.Test(Settings, "Success! PHT has been successfully configured!")); + + return new ValidationResult(failures); + } + + private void Notify(XbmcSettings settings, string header, string message) + { + try + { + if (Settings.Notify) + { + _xbmcService.Notify(Settings, header, message); + } + } + catch (SocketException ex) + { + var logMessage = String.Format("Unable to connect to PHT Host: {0}:{1}", Settings.Host, Settings.Port); + _logger.DebugException(logMessage, ex); + } + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheaterSettings.cs b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheaterSettings.cs new file mode 100644 index 000000000..07df9288c --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheaterSettings.cs @@ -0,0 +1,13 @@ +using NzbDrone.Core.Notifications.Xbmc; + +namespace NzbDrone.Core.Notifications.Plex +{ + public class PlexHomeTheaterSettings : XbmcSettings + { + public PlexHomeTheaterSettings() + { + DisplayTime = 5; + Port = 3005; + } + } +} diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexServer.cs b/src/NzbDrone.Core/Notifications/Plex/PlexServer.cs index e58bd6229..6949be6e0 100644 --- a/src/NzbDrone.Core/Notifications/Plex/PlexServer.cs +++ b/src/NzbDrone.Core/Notifications/Plex/PlexServer.cs @@ -41,6 +41,14 @@ namespace NzbDrone.Core.Notifications.Plex } } + public override string Name + { + get + { + return "Plex Media Server"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs b/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs index b9afc17e9..d4f26fabf 100644 --- a/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs +++ b/src/NzbDrone.Core/Notifications/Prowl/Prowl.cs @@ -38,6 +38,14 @@ namespace NzbDrone.Core.Notifications.Prowl { } + public override string Name + { + get + { + return "Prowl"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs b/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs index 3a22673cc..f1341c99a 100644 --- a/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs +++ b/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs @@ -37,6 +37,14 @@ namespace NzbDrone.Core.Notifications.PushBullet { } + public override string Name + { + get + { + return "Pushbullet"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Pushalot/Pushalot.cs b/src/NzbDrone.Core/Notifications/Pushalot/Pushalot.cs index 971033cff..d21e1d011 100644 --- a/src/NzbDrone.Core/Notifications/Pushalot/Pushalot.cs +++ b/src/NzbDrone.Core/Notifications/Pushalot/Pushalot.cs @@ -38,6 +38,14 @@ namespace NzbDrone.Core.Notifications.Pushalot { } + public override string Name + { + get + { + return "Pushalot"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Pushover/Pushover.cs b/src/NzbDrone.Core/Notifications/Pushover/Pushover.cs index e469a99ee..3fcf7d489 100644 --- a/src/NzbDrone.Core/Notifications/Pushover/Pushover.cs +++ b/src/NzbDrone.Core/Notifications/Pushover/Pushover.cs @@ -37,6 +37,14 @@ namespace NzbDrone.Core.Notifications.Pushover { } + public override string Name + { + get + { + return "Pushover"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs b/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs index 0f8ada22e..12d5424b0 100644 --- a/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs +++ b/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs @@ -53,6 +53,14 @@ namespace NzbDrone.Core.Notifications.Synology } } + public override string Name + { + get + { + return "Synology Indexer"; + } + } + public override ValidationResult Test() { var failures = new List(); diff --git a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs index 2b27ea6fb..e17de97c3 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs @@ -45,11 +45,19 @@ namespace NzbDrone.Core.Notifications.Xbmc UpdateAndClean(series); } + public override string Name + { + get + { + return "Kodi (XBMC)"; + } + } + public override ValidationResult Test() { var failures = new List(); - failures.AddIfNotNull(_xbmcService.Test(Settings)); + failures.AddIfNotNull(_xbmcService.Test(Settings, "Success! XBMC has been successfully configured!")); return new ValidationResult(failures); } diff --git a/src/NzbDrone.Core/Notifications/Xbmc/XbmcService.cs b/src/NzbDrone.Core/Notifications/Xbmc/XbmcService.cs index bd340ef7d..783cd16a8 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/XbmcService.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/XbmcService.cs @@ -16,7 +16,7 @@ namespace NzbDrone.Core.Notifications.Xbmc void Notify(XbmcSettings settings, string title, string message); void Update(XbmcSettings settings, Series series); void Clean(XbmcSettings settings); - ValidationFailure Test(XbmcSettings settings); + ValidationFailure Test(XbmcSettings settings, string message); } public class XbmcService : IXbmcService @@ -101,13 +101,13 @@ namespace NzbDrone.Core.Notifications.Xbmc return apiProvider; } - public ValidationFailure Test(XbmcSettings settings) + public ValidationFailure Test(XbmcSettings settings, string message) { _xbmcVersionCache.Clear(); try { - _logger.Debug("Determining version of XBMC Host: {0}", settings.Address); + _logger.Debug("Determining version of Host: {0}", settings.Address); var version = GetJsonVersion(settings); _logger.Debug("Version is: {0}", version); @@ -116,7 +116,7 @@ namespace NzbDrone.Core.Notifications.Xbmc throw new InvalidXbmcVersionException("Version received from XBMC is invalid, please correct your settings."); } - Notify(settings, "Test Notification", "Success! XBMC has been successfully configured!"); + Notify(settings, "Test Notification", message); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index f8ffa5b29..1cf927c50 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -665,6 +665,8 @@ + + diff --git a/src/NzbDrone.Core/ThingiProvider/IProvider.cs b/src/NzbDrone.Core/ThingiProvider/IProvider.cs index bd30c0ab7..80a27503b 100644 --- a/src/NzbDrone.Core/ThingiProvider/IProvider.cs +++ b/src/NzbDrone.Core/ThingiProvider/IProvider.cs @@ -6,6 +6,7 @@ namespace NzbDrone.Core.ThingiProvider { public interface IProvider { + string Name { get; } Type ConfigContract { get; } IEnumerable DefaultDefinitions { get; } diff --git a/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs b/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs index 4ed723e4f..8e0065ff4 100644 --- a/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs +++ b/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs @@ -1,5 +1,4 @@ -using System; -using NzbDrone.Core.Datastore; +using NzbDrone.Core.Datastore; namespace NzbDrone.Core.ThingiProvider { @@ -7,10 +6,11 @@ namespace NzbDrone.Core.ThingiProvider { private IProviderConfig _settings; - public String Name { get; set; } - public String Implementation { get; set; } - public String ConfigContract { get; set; } - public virtual Boolean Enable { get; set; } + public string Name { get; set; } + public string ImplementationName { get; set; } + public string Implementation { get; set; } + public string ConfigContract { get; set; } + public virtual bool Enable { get; set; } public IProviderConfig Settings { diff --git a/src/NzbDrone.Core/ThingiProvider/ProviderFactory.cs b/src/NzbDrone.Core/ThingiProvider/ProviderFactory.cs index db45e747a..d6670619f 100644 --- a/src/NzbDrone.Core/ThingiProvider/ProviderFactory.cs +++ b/src/NzbDrone.Core/ThingiProvider/ProviderFactory.cs @@ -140,6 +140,8 @@ namespace NzbDrone.Core.ThingiProvider public virtual TProviderDefinition GetProviderCharacteristics(TProvider provider, TProviderDefinition definition) { + definition.ImplementationName = provider.Name; + return definition; } diff --git a/src/UI/Settings/Notifications/Add/NotificationAddItemViewTemplate.hbs b/src/UI/Settings/Notifications/Add/NotificationAddItemViewTemplate.hbs index 0d8352625..40bcb4391 100644 --- a/src/UI/Settings/Notifications/Add/NotificationAddItemViewTemplate.hbs +++ b/src/UI/Settings/Notifications/Add/NotificationAddItemViewTemplate.hbs @@ -1,6 +1,6 @@
- {{implementation}} + {{implementationName}}
{{#if_gt presets.length compare=0}}