DownloadClient added to the UI, it still will only download via Sabnzbd.

This commit is contained in:
Mark McDowall 2012-01-28 13:43:44 -08:00
parent 68e1a0bc4d
commit af0532d959
10 changed files with 234 additions and 127 deletions

View File

@ -0,0 +1,8 @@
namespace NzbDrone.Core.Model
{
public enum DownloadClientType
{
Sabnzbd = 0,
Blackhole = 1
}
}

View File

@ -227,6 +227,7 @@
<Compile Include="Helpers\FileSizeFormatHelper.cs" /> <Compile Include="Helpers\FileSizeFormatHelper.cs" />
<Compile Include="Helpers\SortHelper.cs" /> <Compile Include="Helpers\SortHelper.cs" />
<Compile Include="Jobs\CheckpointJob.cs" /> <Compile Include="Jobs\CheckpointJob.cs" />
<Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Providers\AnalyticsProvider.cs" /> <Compile Include="Providers\AnalyticsProvider.cs" />
<Compile Include="Instrumentation\LogDbContext.cs" /> <Compile Include="Instrumentation\LogDbContext.cs" />
<Compile Include="Instrumentation\LogProvider.cs" /> <Compile Include="Instrumentation\LogProvider.cs" />

View File

@ -409,6 +409,13 @@ namespace NzbDrone.Core.Providers.Core
set { SetValue("AutoIgnorePreviouslyDownloadedEpisodes", value); } set { SetValue("AutoIgnorePreviouslyDownloadedEpisodes", value); }
} }
public virtual DownloadClientType DownloadClient
{
get { return (DownloadClientType)GetValueInt("DownloadClient"); }
set { SetValue("DownloadClient", (int)value); }
}
public string UGuid public string UGuid
{ {
get { return GetValue("UGuid", Guid.NewGuid().ToString(), persist: true); } get { return GetValue("UGuid", Guid.NewGuid().ToString(), persist: true); }

View File

@ -6,6 +6,7 @@ using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Common.Model; using NzbDrone.Common.Model;
using NzbDrone.Core.Helpers; using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.ExternalNotification;
@ -90,12 +91,17 @@ namespace NzbDrone.Web.Controllers
}); });
} }
public ActionResult Sabnzbd() public ActionResult DownloadClient()
{ {
var tvCategory = _configProvider.SabTvCategory; var tvCategory = _configProvider.SabTvCategory;
var tvCategorySelectList = new SelectList(new[] { tvCategory }); var tvCategorySelectList = new SelectList(new[] { tvCategory });
var model = new SabnzbdSettingsModel var downloadClientTypes = new List<KeyValuePair<int, string>>();
foreach (DownloadClientType downloadClientType in Enum.GetValues(typeof(DownloadClientType)))
downloadClientTypes.Add(new KeyValuePair<int, string>((int)downloadClientType, downloadClientType.ToString()));
var model = new DownloadClientSettingsModel
{ {
SabHost = _configProvider.SabHost, SabHost = _configProvider.SabHost,
SabPort = _configProvider.SabPort, SabPort = _configProvider.SabPort,
@ -104,8 +110,10 @@ namespace NzbDrone.Web.Controllers
SabPassword = _configProvider.SabPassword, SabPassword = _configProvider.SabPassword,
SabTvCategory = tvCategory, SabTvCategory = tvCategory,
SabTvPriority = _configProvider.SabTvPriority, SabTvPriority = _configProvider.SabTvPriority,
SabDropDirectory = _configProvider.SabDropDirectory, DownloadClientDropDirectory = _configProvider.SabDropDirectory,
SabTvCategorySelectList = tvCategorySelectList SabTvCategorySelectList = tvCategorySelectList,
DownloadClient = (int)_configProvider.DownloadClient,
DownloadClientSelectList = new SelectList(downloadClientTypes, "Key", "Value")
}; };
return View(model); return View(model);
@ -373,11 +381,10 @@ namespace NzbDrone.Web.Controllers
} }
[HttpPost] [HttpPost]
public JsonResult SaveSabnzbd(SabnzbdSettingsModel data) public JsonResult SaveDownloadClient(DownloadClientSettingsModel data)
{ {
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
_configProvider.SabHost = data.SabHost; _configProvider.SabHost = data.SabHost;
_configProvider.SabPort = data.SabPort; _configProvider.SabPort = data.SabPort;
_configProvider.SabApiKey = data.SabApiKey; _configProvider.SabApiKey = data.SabApiKey;
@ -385,8 +392,8 @@ namespace NzbDrone.Web.Controllers
_configProvider.SabTvCategory = data.SabTvCategory; _configProvider.SabTvCategory = data.SabTvCategory;
_configProvider.SabUsername = data.SabUsername; _configProvider.SabUsername = data.SabUsername;
_configProvider.SabTvPriority = data.SabTvPriority; _configProvider.SabTvPriority = data.SabTvPriority;
_configProvider.SabDropDirectory = data.SabDropDirectory; _configProvider.SabDropDirectory = data.DownloadClientDropDirectory;
_configProvider.DownloadClient = (DownloadClientType)data.DownloadClient;
return GetSuccessResult(); return GetSuccessResult();
} }

View File

@ -7,7 +7,7 @@ using NzbDrone.Core.Model.Sabnzbd;
namespace NzbDrone.Web.Models namespace NzbDrone.Web.Models
{ {
public class SabnzbdSettingsModel public class DownloadClientSettingsModel
{ {
public SelectList PrioritySelectList = public SelectList PrioritySelectList =
new SelectList(new[] {"Default", "Paused", "Low", "Normal", "High", "Top"}); new SelectList(new[] {"Default", "Paused", "Low", "Normal", "High", "Top"});
@ -53,11 +53,21 @@ namespace NzbDrone.Web.Models
[Description("Priority to use when sending NZBs to SABnzbd")] [Description("Priority to use when sending NZBs to SABnzbd")]
public SabPriorityType SabTvPriority { get; set; } public SabPriorityType SabTvPriority { get; set; }
[DisplayName("SABnzbd TV Directory")] [DisplayName("Download Client TV Directory")]
[Description("The directory where SABnzbd downloads TV shows to (NzbDrone will sort them for you)")] [Description("The directory where your download client downloads TV shows to (NzbDrone will sort them for you)")]
[DisplayFormat(ConvertEmptyStringToNull = false)] [DisplayFormat(ConvertEmptyStringToNull = false)]
public string SabDropDirectory { get; set; } public string DownloadClientDropDirectory { get; set; }
[DisplayName("Blackhole Directory")]
[Description("The directory where your download client will pickup NZB files")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string BlackholeDirectory { get; set; }
[DisplayName("Download Client")]
[Description("What method do you download NZBs with?")]
public int DownloadClient { get; set; }
public SelectList SabTvCategorySelectList { get; set; } public SelectList SabTvCategorySelectList { get; set; }
public SelectList DownloadClientSelectList { get; set; }
} }
} }

View File

@ -235,7 +235,7 @@
<Compile Include="Models\JsonNotificationResult.cs" /> <Compile Include="Models\JsonNotificationResult.cs" />
<Compile Include="Models\PendingProcessingModel.cs" /> <Compile Include="Models\PendingProcessingModel.cs" />
<Compile Include="Models\ProwlPrioritySelectListModel.cs" /> <Compile Include="Models\ProwlPrioritySelectListModel.cs" />
<Compile Include="Models\SabnzbdSettingsModel.cs" /> <Compile Include="Models\DownloadClientSettingsModel.cs" />
<Compile Include="Models\EpisodeNamingModel.cs" /> <Compile Include="Models\EpisodeNamingModel.cs" />
<Compile Include="Models\HistoryModel.cs" /> <Compile Include="Models\HistoryModel.cs" />
<Compile Include="Models\IndexerSettingsModel.cs" /> <Compile Include="Models\IndexerSettingsModel.cs" />
@ -530,6 +530,12 @@
<ItemGroup> <ItemGroup>
<Content Include="Views\Series\SeriesItem.cshtml" /> <Content Include="Views\Series\SeriesItem.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="Views\Settings\DownloadClient.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Settings\Blackhole.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@ -0,0 +1,13 @@
@using NzbDrone.Web.Helpers;
@model NzbDrone.Web.Models.DownloadClientSettingsModel
@{
Layout = null;
}
<div class="downloadClient">
<label class="labelClass">@Html.LabelFor(m => m.BlackholeDirectory)
<span class="small">@Html.DescriptionFor(m => m.BlackholeDirectory)</span>
</label>
@Html.TextBoxFor(m => m.BlackholeDirectory, new { @class = "inputClass folderLookup" })
</div>

View File

@ -0,0 +1,127 @@
@using NzbDrone.Web.Helpers;
@model NzbDrone.Web.Models.DownloadClientSettingsModel
@{ Layout = "~/Views/Shared/_ReferenceLayout.cshtml"; }
@section HeaderContent{
@Html.IncludeCss("Settings.css")
<style>
.downloadClient
{
overflow: auto;
}
.downloadClient h4
{
font-weight: bold;
margin-bottom: 0px;
padding-left: 5px;
padding-top: 3px;
}
#save_button
{
margin-top: 10px;
}
#downloadClient-top
{
overflow: auto;
}
</style>
}
<div id="stylized">
@using (Html.BeginForm("SaveDownloadClient", "Settings", FormMethod.Post, new { id = "DownloadClientForm", name = "DownloadClientForm", @class = "settingsForm" }))
{
<div id="downloadClient-top" class="settingsForm">
<label class="labelClass">@Html.LabelFor(m => m.DownloadClient)
<span class="small">@Html.DescriptionFor(m => m.DownloadClient)</span>
</label>
@Html.DropDownListFor(m => m.DownloadClient, Model.DownloadClientSelectList, new { @class = "inputClass selectClass" })
<label class="labelClass">@Html.LabelFor(m => m.DownloadClientDropDirectory)
<span class="small">@Html.DescriptionFor(m => m.DownloadClientDropDirectory)</span>
</label>
@Html.TextBoxFor(m => m.DownloadClientDropDirectory, new { @class = "inputClass folderLookup" })
</div>
<div class="jquery-accordion" id="downloadClientAccordion">
<h3>
<a href="#">Sabnzbd</a></h3>
@{Html.RenderPartial("Sabnzbd", Model);}
<h3>
<a href="#">Blackhole</a></h3>
@{Html.RenderPartial("Blackhole", Model);}
</div>
<button type="submit" class="save_button" disabled="disabled">
Save</button>
}
</div>
<div id="result" class="hiddenResult">
</div>
@section Scripts{
<script type="text/javascript">
$(document).ready(function () {
$('#downloadClientAccordion').accordion("activate", false);
});
</script>
<script type="text/javascript">
var autoConfigureSabUrl = '@Url.Action("AutoConfigureSab", "Settings")';
function autoConfigureSab() {
$.ajax({
type: "GET",
url: autoConfigureSabUrl,
error: function (req, status, error) {
alert("Sorry! We could not autoconfigure SABnzbd for you");
},
success: autoConfigureSuccess
});
function autoConfigureSuccess(data) {
$('#SabHost').val(data.Host);
$('#SabPort').val(data.Port);
$('#SabApiKey').val(data.ApiKey);
}
}
var sabCategoryUrl = '../Command/GetSabnzbdCategories';
$('#SabTvCategory').focus(function () {
var host = $('#SabHost').val();
var port = $('#SabPort').val();
var apiKey = $('#SabApiKey').val();
var username = $('#SabUsername').val();
var password = $('#SabPassword').val();
$.ajax({
type: "POST",
url: sabCategoryUrl,
data: jQuery.param({ host: host, port: port, apiKey: apiKey, username: username, password: password }),
error: function (req, status, error) {
$.each($('#SabTvCategory option'), function () {
$(this).remove();
});
$('#SabTvCategory').append($('<option />').val('tv').text('Please check your SABnzbd Settings'));
},
success: function (data, textStatus, jqXHR) {
//Get the current value
var currentlySelected = $('#SabTvCategory').val();
//Remove all existing options
$.each($('#SabTvCategory option'), function () {
$(this).remove();
});
//Add the new ones
$.each(data.categories, function () {
$('#SabTvCategory').append($('<option />').val(this.toString()).text(this.toString()));
});
//Attempt to reset to the preiously selected value (change to lower-case)
$("#SabTvCategory").val(currentlySelected.toLowerCase());
}
});
});
</script>
}

View File

@ -6,7 +6,7 @@
<li>@Html.ActionLink("Naming", "Naming", "Settings")</li> <li>@Html.ActionLink("Naming", "Naming", "Settings")</li>
<li>@Html.ActionLink("Indexers", "Indexers", "Settings")</li> <li>@Html.ActionLink("Indexers", "Indexers", "Settings")</li>
<li>@Html.ActionLink("Quality", "Quality", "Settings")</li> <li>@Html.ActionLink("Quality", "Quality", "Settings")</li>
<li>@Html.ActionLink("SABnzbd", "Sabnzbd", "Settings")</li> <li>@Html.ActionLink("Download Client", "DownloadClient", "Settings")</li>
<li>@Html.ActionLink("Notifications", "Notifications", "Settings")</li> <li>@Html.ActionLink("Notifications", "Notifications", "Settings")</li>
<li>@Html.ActionLink("System", "System", "Settings")</li> <li>@Html.ActionLink("System", "System", "Settings")</li>
<li>@Html.ActionLink("Misc", "Misc", "Settings")</li> <li>@Html.ActionLink("Misc", "Misc", "Settings")</li>

View File

@ -1,124 +1,52 @@
@using NzbDrone.Web.Helpers; @using NzbDrone.Web.Helpers;
@model NzbDrone.Web.Models.SabnzbdSettingsModel @model NzbDrone.Web.Models.DownloadClientSettingsModel
@{ Layout = "~/Views/Shared/_ReferenceLayout.cshtml"; }
@section HeaderContent{ @{
@Html.IncludeCss("Settings.css") Layout = null;
} }
<div id="stylized">
@using (Html.BeginForm("SaveSabnzbd", "Settings", FormMethod.Post, new { id = "SabForm", name = "SabForm", @class = "settingsForm" }))
{
<label class="labelClass">
Auto-Configure <span class="small">If access to SABnzbd doesn't require a username +
password and is on the same system as NzbDrone, you can auto-configure it</span>
</label>
<input type="button" onclick="autoConfigureSab(); return false;" value="Auto-Configure"
class="inputClass" />
<label class="labelClass">@Html.LabelFor(m => m.SabHost) <div class="downloadClient">
<span class="small">@Html.DescriptionFor(m => m.SabHost)</span> <label class="labelClass">
</label> Auto-Configure <span class="small">If access to SABnzbd doesn't require a username +
@Html.TextBoxFor(m => m.SabHost, new { @class = "inputClass" }) password and is on the same system as NzbDrone, you can auto-configure it</span>
</label>
<input type="button" onclick="autoConfigureSab(); return false;" value="Auto-Configure"
class="inputClass" />
<label class="labelClass">@Html.LabelFor(m => m.SabPort) <label class="labelClass">@Html.LabelFor(m => m.SabHost)
<span class="small">@Html.DescriptionFor(m => m.SabPort)</span> <span class="small">@Html.DescriptionFor(m => m.SabHost)</span>
</label> </label>
@Html.TextBoxFor(m => m.SabPort, new { @class = "inputClass" }) @Html.TextBoxFor(m => m.SabHost, new { @class = "inputClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabApiKey) <label class="labelClass">@Html.LabelFor(m => m.SabPort)
<span class="small">@Html.DescriptionFor(m => m.SabApiKey)</span> <span class="small">@Html.DescriptionFor(m => m.SabPort)</span>
</label> </label>
@Html.TextBoxFor(m => m.SabApiKey, new { @class = "inputClass" }) @Html.TextBoxFor(m => m.SabPort, new { @class = "inputClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabUsername) <label class="labelClass">@Html.LabelFor(m => m.SabApiKey)
<span class="small">@Html.DescriptionFor(m => m.SabUsername)</span> <span class="small">@Html.DescriptionFor(m => m.SabApiKey)</span>
</label> </label>
@Html.TextBoxFor(m => m.SabUsername, new { @class = "inputClass" }) @Html.TextBoxFor(m => m.SabApiKey, new { @class = "inputClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabPassword) <label class="labelClass">@Html.LabelFor(m => m.SabUsername)
<span class="small">@Html.DescriptionFor(m => m.SabPassword)</span> <span class="small">@Html.DescriptionFor(m => m.SabUsername)</span>
</label> </label>
@Html.TextBoxFor(m => m.SabPassword, new { @class = "inputClass", type = "password" }) @Html.TextBoxFor(m => m.SabUsername, new { @class = "inputClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabTvCategory) <label class="labelClass">@Html.LabelFor(m => m.SabPassword)
<span class="small">@Html.DescriptionFor(m => m.SabTvCategory)</span> <span class="small">@Html.DescriptionFor(m => m.SabPassword)</span>
</label> </label>
@Html.DropDownListFor(m => m.SabTvCategory, Model.SabTvCategorySelectList, new { @class = "inputClass selectClass" }) @Html.TextBoxFor(m => m.SabPassword, new { @class = "inputClass", type = "password" })
<label class="labelClass">@Html.LabelFor(m => m.SabTvPriority) <label class="labelClass">@Html.LabelFor(m => m.SabTvCategory)
<span class="small">@Html.DescriptionFor(m => m.SabTvPriority)</span> <span class="small">@Html.DescriptionFor(m => m.SabTvCategory)</span>
</label> </label>
@Html.DropDownListFor(m => m.SabTvPriority, Model.PrioritySelectList, new { @class = "inputClass selectClass" }) @Html.DropDownListFor(m => m.SabTvCategory, Model.SabTvCategorySelectList, new { @class = "inputClass selectClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabTvPriority)
<span class="small">@Html.DescriptionFor(m => m.SabTvPriority)</span>
</label>
@Html.DropDownListFor(m => m.SabTvPriority, Model.PrioritySelectList, new { @class = "inputClass selectClass" })
<label class="labelClass">@Html.LabelFor(m => m.SabDropDirectory)
<span class="small">@Html.DescriptionFor(m => m.SabDropDirectory)</span>
</label>
@Html.TextBoxFor(m => m.SabDropDirectory, new { @class = "inputClass folderLookup" })
<button type="submit" class="save_button" disabled="disabled">
Save</button>
}
</div> </div>
<div id="result" class="hiddenResult">
</div>
@section Scripts{
<script type="text/javascript">
var autoConfigureSabUrl = '@Url.Action("AutoConfigureSab", "Settings")';
function autoConfigureSab() {
$.ajax({
type: "GET",
url: autoConfigureSabUrl,
error: function (req, status, error) {
alert("Sorry! We could not autoconfigure SABnzbd for you");
},
success: autoConfigureSuccess
});
function autoConfigureSuccess(data) {
$('#SabHost').val(data.Host);
$('#SabPort').val(data.Port);
$('#SabApiKey').val(data.ApiKey);
}
}
var sabCategoryUrl = '../Command/GetSabnzbdCategories';
$('#SabTvCategory').focus(function () {
var host = $('#SabHost').val();
var port = $('#SabPort').val();
var apiKey = $('#SabApiKey').val();
var username = $('#SabUsername').val();
var password = $('#SabPassword').val();
$.ajax({
type: "POST",
url: sabCategoryUrl,
data: jQuery.param({ host: host, port: port, apiKey: apiKey, username: username, password: password }),
error: function (req, status, error) {
$.each($('#SabTvCategory option'), function () {
$(this).remove();
});
$('#SabTvCategory').append($('<option />').val('tv').text('Please check your SABnzbd Settings'));
},
success: function (data, textStatus, jqXHR) {
//Get the current value
var currentlySelected = $('#SabTvCategory').val();
//Remove all existing options
$.each($('#SabTvCategory option'), function () {
$(this).remove();
});
//Add the new ones
$.each(data.categories, function () {
$('#SabTvCategory').append($('<option />').val(this.toString()).text(this.toString()));
});
//Attempt to reset to the preiously selected value (change to lower-case)
$("#SabTvCategory").val(currentlySelected.toLowerCase());
}
});
});
</script>
}