diff --git a/NzbDrone.Core.Test/SabControllerTest.cs b/NzbDrone.Core.Test/SabControllerTest.cs index bb88eaa8b..65a908ead 100644 --- a/NzbDrone.Core.Test/SabControllerTest.cs +++ b/NzbDrone.Core.Test/SabControllerTest.cs @@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test config.Setup(c => c.GetValue("SabUsername", String.Empty, false)).Returns(username); config.Setup(c => c.GetValue("SabPassword", String.Empty, false)).Returns(password); config.Setup(c => c.GetValue("SabPriority", String.Empty, false)).Returns(priority); - config.Setup(c => c.GetValue("SabCategory", String.Empty, false)).Returns(category); + config.Setup(c => c.GetValue("SabTvCategory", String.Empty, false)).Returns(category); var http = new Mock<IHttpProvider>(); http.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("ok"); @@ -67,7 +67,7 @@ namespace NzbDrone.Core.Test config.Setup(c => c.GetValue("SabUsername", String.Empty, false)).Returns(username); config.Setup(c => c.GetValue("SabPassword", String.Empty, false)).Returns(password); config.Setup(c => c.GetValue("SabPriority", String.Empty, false)).Returns(priority); - config.Setup(c => c.GetValue("SabCategory", String.Empty, false)).Returns(category); + config.Setup(c => c.GetValue("SabTvCategory", String.Empty, false)).Returns(category); var http = new Mock<IHttpProvider>(); http.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")).Returns("error"); diff --git a/NzbDrone.Core/Providers/SabProvider.cs b/NzbDrone.Core/Providers/SabProvider.cs index c3df84cd6..08ec288e1 100644 --- a/NzbDrone.Core/Providers/SabProvider.cs +++ b/NzbDrone.Core/Providers/SabProvider.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Core.Providers public bool AddByUrl(string url, string title) { const string mode = "addurl"; - //string cat = _config.GetValue("SabCategory", String.Empty, true); + //string cat = _config.GetValue("SabTvCategory", String.Empty, true); string cat = "tv"; string priority = _config.GetValue("SabPriority", String.Empty, false); string name = url.Replace("&", "%26"); diff --git a/NzbDrone.PostProcessor/NzbDrone.PostProcessor.csproj b/NzbDrone.PostProcessor/NzbDrone.PostProcessor.csproj index c2dd7425d..6fd62ee74 100644 --- a/NzbDrone.PostProcessor/NzbDrone.PostProcessor.csproj +++ b/NzbDrone.PostProcessor/NzbDrone.PostProcessor.csproj @@ -10,8 +10,9 @@ <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>NzbDrone.PostProcessor</RootNamespace> <AssemblyName>NzbDrone.PostProcessor</AssemblyName> - <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> + <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> + <TargetFrameworkProfile /> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <PlatformTarget>x86</PlatformTarget> @@ -36,11 +37,15 @@ <Reference Include="System" /> <Reference Include="System.Data" /> <Reference Include="System.Xml" /> + <Reference Include="System.Xml.Linq" /> </ItemGroup> <ItemGroup> <Compile Include="Program.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> + <ItemGroup> + <Content Include="PostProcessor.xml" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/NzbDrone.PostProcessor/PostProcessor.xml b/NzbDrone.PostProcessor/PostProcessor.xml new file mode 100644 index 000000000..fc481481c --- /dev/null +++ b/NzbDrone.PostProcessor/PostProcessor.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<Configuration> + <Host>localhost</Host> + <Port>8989</Port> + <ApiKey>Not-An-API-KEY</ApiKey> +</Configuration> \ No newline at end of file diff --git a/NzbDrone.PostProcessor/Program.cs b/NzbDrone.PostProcessor/Program.cs index ee194c402..e425832c8 100644 --- a/NzbDrone.PostProcessor/Program.cs +++ b/NzbDrone.PostProcessor/Program.cs @@ -1,13 +1,84 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; using System.Text; +using System.Xml; +using System.Xml.Linq; namespace NzbDrone.PostProcessor { class Program { + private static string _host = "localhost"; + private static int _port = 8989; + private static string _apiKey = String.Empty; + static void Main(string[] args) { + try + { + if (args.Count() < 5) + { + Console.WriteLine("Did this come from SAB? Missing Arguments.."); + return; + } + + //Load the ConfigFile + if (!LoadConfig()) + return; + + string dir = args[0]; //Get dir from first CMD Line Argument + string nzbName = args[2]; //Get nzbName from third CMD Line Argument + string category = args[4]; //Get category from third CMD Line Argument + + var hostString = _host + ":" + _port; + + var url = String.Format("http://{0}/?apiKey={1}&dir={2}&nzbName={3}&category={4}", hostString, _apiKey, dir, nzbName, category); + + var webClient = new WebClient(); + webClient.DownloadString(url); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + static bool LoadConfig() + { + var configFile = "PostProcessor.xml"; + if (!File.Exists(configFile)) + { + Console.WriteLine("Configuration File does not exist, please create"); + return false; + } + + var xDoc = XDocument.Load(configFile); + var config = (from c in xDoc.Descendants("Configuration") select c).FirstOrDefault(); + + if (config == null) + { + Console.WriteLine("Invalid Configuration File"); + return false; + } + + var hostNode = config.Descendants("Host").FirstOrDefault(); + var portNode = config.Descendants("Port").FirstOrDefault(); ; + var apiKeyNode = config.Descendants("ApiKey").FirstOrDefault(); ; + + if (hostNode == null || portNode == null || apiKeyNode == null) + { + Console.WriteLine("Invalid Configuration File"); + return false; + } + + _host = hostNode.Value; + Int32.TryParse(portNode.Value, out _port); + _apiKey = apiKeyNode.Value; + + return true; } } } diff --git a/NzbDrone.Web/Controllers/ApiController.cs b/NzbDrone.Web/Controllers/ApiController.cs index f49290087..0f0f4880d 100644 --- a/NzbDrone.Web/Controllers/ApiController.cs +++ b/NzbDrone.Web/Controllers/ApiController.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Web; using System.Web.Mvc; using System.Xml.Linq; +using NLog; using NzbDrone.Core; using NzbDrone.Core.Providers; @@ -12,16 +13,31 @@ namespace NzbDrone.Web.Controllers public class ApiController : Controller { private readonly IPostProcessingProvider _postProcessingProvider; + private readonly IConfigProvider _configProvider; - public ApiController(IPostProcessingProvider postProcessingProvider) + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public ApiController(IPostProcessingProvider postProcessingProvider, IConfigProvider configProvider) { _postProcessingProvider = postProcessingProvider; + _configProvider = configProvider; } - public ActionResult ProcessEpisode(string dir, string nzbName) + public ActionResult ProcessEpisode(string apiKey, string dir, string nzbName, string category) { - _postProcessingProvider.ProcessEpisode(dir, nzbName); - return Content("ok"); + if (apiKey != _configProvider.GetValue("ApiKey", String.Empty, true)) + { + Logger.Warn("API Key from Post Processing Script is Invalid"); + return Content("Invalid API Key"); + } + + if (_configProvider.GetValue("SabTvCategory", String.Empty, true) == category) + { + _postProcessingProvider.ProcessEpisode(dir, nzbName); + return Content("ok"); + } + + return Content("Category doesn't match what was configured for SAB TV Category..."); } } } diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index 597343f16..9fb3ecded 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -60,12 +60,12 @@ namespace NzbDrone.Web.Controllers ViewData["viewName"] = "Indexers"; return View("Index", new IndexerSettingsModel { - NzbMatrixUsername = _configProvider.GetValue("NzbMatrixUsername", String.Empty, false), - NzbMatrixApiKey = _configProvider.GetValue("NzbMatrixApiKey", String.Empty, false), - NzbsOrgUId = _configProvider.GetValue("NzbsOrgUId", String.Empty, false), - NzbsOrgHash = _configProvider.GetValue("NzbsOrgHash", String.Empty, false), - NzbsrusUId = _configProvider.GetValue("NzbsrusUId", String.Empty, false), - NzbsrusHash = _configProvider.GetValue("NzbsrusHash", String.Empty, false), + NzbMatrixUsername = _configProvider.GetValue("NzbMatrixUsername", String.Empty, true), + NzbMatrixApiKey = _configProvider.GetValue("NzbMatrixApiKey", String.Empty, true), + NzbsOrgUId = _configProvider.GetValue("NzbsOrgUId", String.Empty, true), + NzbsOrgHash = _configProvider.GetValue("NzbsOrgHash", String.Empty, true), + NzbsrusUId = _configProvider.GetValue("NzbsrusUId", String.Empty, true), + NzbsrusHash = _configProvider.GetValue("NzbsrusHash", String.Empty, true), Indexers = _indexerProvider.AllIndexers() }); } @@ -79,12 +79,12 @@ namespace NzbDrone.Web.Controllers SyncFrequency = Convert.ToInt32(_configProvider.GetValue("SyncFrequency", "15", true)), DownloadPropers = Convert.ToBoolean(_configProvider.GetValue("DownloadPropers", "false", true)), Retention = Convert.ToInt32(_configProvider.GetValue("Retention", "500", true)), - SabHost = _configProvider.GetValue("SabHost", "localhost", false), + SabHost = _configProvider.GetValue("SabHost", "localhost", true), SabPort = Convert.ToInt32(_configProvider.GetValue("SabPort", "8080", true)), - SabApiKey = _configProvider.GetValue("SabApiKey", String.Empty, false), - SabUsername = _configProvider.GetValue("SabUsername", String.Empty, false), - SabPassword = _configProvider.GetValue("SabPassword", String.Empty, false), - SabCategory = _configProvider.GetValue("SabCategory", String.Empty, false), + SabApiKey = _configProvider.GetValue("SabApiKey", String.Empty, true), + SabUsername = _configProvider.GetValue("SabUsername", String.Empty, true), + SabPassword = _configProvider.GetValue("SabPassword", String.Empty, true), + SabTvCategory = _configProvider.GetValue("SabTvCategory", String.Empty, true), SabPriority = (SabnzbdPriorityType)Enum.Parse(typeof(SabnzbdPriorityType), _configProvider.GetValue("SabPriority", "Normal", true)), }; @@ -221,7 +221,7 @@ namespace NzbDrone.Web.Controllers _configProvider.SetValue("SabApiKey", data.SabApiKey); _configProvider.SetValue("SabUsername", data.SabUsername); _configProvider.SetValue("SabPassword", data.SabPassword); - _configProvider.SetValue("SabCategory", data.SabCategory); + _configProvider.SetValue("SabTvCategory", data.SabTvCategory); _configProvider.SetValue("SabPriority", data.SabPriority.ToString()); return Content(_settingsSaved); diff --git a/NzbDrone.Web/Models/DownloadSettingsModel.cs b/NzbDrone.Web/Models/DownloadSettingsModel.cs index c17a7f1d5..91298e2fb 100644 --- a/NzbDrone.Web/Models/DownloadSettingsModel.cs +++ b/NzbDrone.Web/Models/DownloadSettingsModel.cs @@ -84,8 +84,8 @@ namespace NzbDrone.Web.Models [DataType(DataType.Text)] [DisplayFormat(ConvertEmptyStringToNull = false)] - [DisplayName("SABnzbd Category")] - public String SabCategory + [DisplayName("SABnzbd TV Category")] + public String SabTvCategory { get; set; diff --git a/NzbDrone.Web/Views/Settings/Downloads.ascx b/NzbDrone.Web/Views/Settings/Downloads.ascx index 0536a4fa5..a0999d93a 100644 --- a/NzbDrone.Web/Views/Settings/Downloads.ascx +++ b/NzbDrone.Web/Views/Settings/Downloads.ascx @@ -117,10 +117,10 @@ <div class="config-section"> <div class="config-group"> - <div class="config-title"><%= Html.LabelFor(m => m.SabCategory)%></div> - <div class="config-value"><%= Html.TextBoxFor(m => m.SabCategory)%></div> + <div class="config-title"><%= Html.LabelFor(m => m.SabTvCategory)%></div> + <div class="config-value"><%= Html.TextBoxFor(m => m.SabTvCategory)%></div> </div> - <div class="config-validation"><%= Html.ValidationMessageFor(m => m.SabCategory)%></div> + <div class="config-validation"><%= Html.ValidationMessageFor(m => m.SabTvCategory)%></div> </div> <div class="config-section"> @@ -128,7 +128,7 @@ <div class="config-title"><%= Html.LabelFor(m => m.SabPriority) %></div> <div class="config-value"><%= Html.DropDownListFor(m => m.SabPriority, Model.PrioritySelectList) %></div> </div> - <div class="config-validation"><%= Html.ValidationMessageFor(m => m.SabCategory)%></div> + <div class="config-validation"><%= Html.ValidationMessageFor(m => m.SabTvCategory)%></div> </div> </fieldset>