mirror of
https://github.com/Sonarr/Sonarr.git
synced 2024-12-12 11:15:43 +02:00
SABnzbd settings will now dynamically get the categories available from SABnzbd when the category drop-box gets focus, it will use values on the page so there is no need to save your settings first.
This commit is contained in:
parent
d554e9ec83
commit
1d983801e8
1
NzbDrone.Core.Test/Files/Categories_json.txt
Normal file
1
NzbDrone.Core.Test/Files/Categories_json.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"categories":["*","anime","apps","books","consoles","ds-games","emulation","games","misc","movies","music","pda","resources","test","tv","tv-dvd","unknown","wii-games","xbox-dlc","xbox-xbla","xxx"]}
|
@ -147,6 +147,9 @@
|
|||||||
<Content Include="Files\RSS\newbin_none_english.xml">
|
<Content Include="Files\RSS\newbin_none_english.xml">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Files\Categories_json.txt">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="Framework\AutoMoq\License.txt" />
|
<Content Include="Framework\AutoMoq\License.txt" />
|
||||||
<Content Include="Files\Feed.nzbmatrix.com.xml">
|
<Content Include="Files\Feed.nzbmatrix.com.xml">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
@ -292,7 +292,6 @@ public void sab_title(int seasons, int[] episodes, string title, QualityTypes qu
|
|||||||
Assert.AreEqual(excpected, actual);
|
Assert.AreEqual(excpected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Explicit]
|
[Explicit]
|
||||||
public void AddNewzbingByUrlSuccess()
|
public void AddNewzbingByUrlSuccess()
|
||||||
@ -335,5 +334,67 @@ public void AddNewzbingByUrlSuccess()
|
|||||||
//Assert
|
//Assert
|
||||||
result.Should().BeTrue();
|
result.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Get_Categories_Success_Passed_Values()
|
||||||
|
{
|
||||||
|
//Setup
|
||||||
|
const string host = "192.168.5.55";
|
||||||
|
const int port = 2222;
|
||||||
|
const string apikey = "5c770e3197e4fe763423ee7c392c25d1";
|
||||||
|
const string username = "admin";
|
||||||
|
const string password = "pass";
|
||||||
|
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
mocker.GetMock<HttpProvider>(MockBehavior.Strict)
|
||||||
|
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=get_cats&output=json&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
|
||||||
|
.Returns(File.ReadAllText(@".\Files\Categories_json.txt"));
|
||||||
|
|
||||||
|
//Act
|
||||||
|
var result = mocker.Resolve<SabProvider>().GetCategories(host, port, apikey, username, password);
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
result.Should().NotBeNull();
|
||||||
|
result.categories.Should().HaveCount(c => c > 0);
|
||||||
|
result.categories.Should().NotContain("*");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Get_Categories_Success_Config_Values()
|
||||||
|
{
|
||||||
|
//Setup
|
||||||
|
const string host = "192.168.5.55";
|
||||||
|
const int port = 2222;
|
||||||
|
const string apikey = "5c770e3197e4fe763423ee7c392c25d1";
|
||||||
|
const string username = "admin";
|
||||||
|
const string password = "pass";
|
||||||
|
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
var fakeConfig = mocker.GetMock<ConfigProvider>();
|
||||||
|
fakeConfig.SetupGet(c => c.SabHost)
|
||||||
|
.Returns(host);
|
||||||
|
fakeConfig.SetupGet(c => c.SabPort)
|
||||||
|
.Returns(port);
|
||||||
|
fakeConfig.SetupGet(c => c.SabApiKey)
|
||||||
|
.Returns(apikey);
|
||||||
|
fakeConfig.SetupGet(c => c.SabUsername)
|
||||||
|
.Returns(username);
|
||||||
|
fakeConfig.SetupGet(c => c.SabPassword)
|
||||||
|
.Returns(password);
|
||||||
|
|
||||||
|
mocker.GetMock<HttpProvider>(MockBehavior.Strict)
|
||||||
|
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=get_cats&output=json&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
|
||||||
|
.Returns(File.ReadAllText(@".\Files\Categories_json.txt"));
|
||||||
|
|
||||||
|
//Act
|
||||||
|
var result = mocker.Resolve<SabProvider>().GetCategories();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
result.Should().NotBeNull();
|
||||||
|
result.categories.Should().HaveCount(c => c > 0);
|
||||||
|
result.categories.Should().NotContain("*");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
12
NzbDrone.Core/Model/SabnzbdCategoryModel.cs
Normal file
12
NzbDrone.Core/Model/SabnzbdCategoryModel.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Model
|
||||||
|
{
|
||||||
|
public class SabnzbdCategoryModel
|
||||||
|
{
|
||||||
|
public List<string> categories { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -191,6 +191,7 @@
|
|||||||
<Compile Include="Model\JobQueueItem.cs" />
|
<Compile Include="Model\JobQueueItem.cs" />
|
||||||
<Compile Include="Model\LanguageType.cs" />
|
<Compile Include="Model\LanguageType.cs" />
|
||||||
<Compile Include="Model\Quality.cs" />
|
<Compile Include="Model\Quality.cs" />
|
||||||
|
<Compile Include="Model\SabnzbdCategoryModel.cs" />
|
||||||
<Compile Include="Model\SabnzbdInfoModel.cs" />
|
<Compile Include="Model\SabnzbdInfoModel.cs" />
|
||||||
<Compile Include="Model\Xbmc\ActionType.cs" />
|
<Compile Include="Model\Xbmc\ActionType.cs" />
|
||||||
<Compile Include="Model\Xbmc\ActivePlayersResult.cs" />
|
<Compile Include="Model\Xbmc\ActivePlayersResult.cs" />
|
||||||
|
@ -157,7 +157,7 @@ public virtual String SabPassword
|
|||||||
|
|
||||||
public virtual String SabTvCategory
|
public virtual String SabTvCategory
|
||||||
{
|
{
|
||||||
get { return GetValue("SabTvCategory", "TV"); }
|
get { return GetValue("SabTvCategory", "tv"); }
|
||||||
|
|
||||||
set { SetValue("SabTvCategory", value); }
|
set { SetValue("SabTvCategory", value); }
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using System.Web.Script.Serialization;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
using NLog;
|
using NLog;
|
||||||
@ -102,17 +103,6 @@ public virtual bool IsInQueue(string title)
|
|||||||
return false; //Not in Queue
|
return false; //Not in Queue
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetSabRequest(string action)
|
|
||||||
{
|
|
||||||
return string.Format(@"http://{0}:{1}/api?{2}&apikey={3}&ma_username={4}&ma_password={5}",
|
|
||||||
_configProvider.SabHost,
|
|
||||||
_configProvider.SabPort,
|
|
||||||
action,
|
|
||||||
_configProvider.SabApiKey,
|
|
||||||
_configProvider.SabUsername,
|
|
||||||
_configProvider.SabPassword);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual String GetSabTitle(EpisodeParseResult parseResult)
|
public virtual String GetSabTitle(EpisodeParseResult parseResult)
|
||||||
{
|
{
|
||||||
//Show Name - 1x01-1x02 - Episode Name
|
//Show Name - 1x01-1x02 - Episode Name
|
||||||
@ -135,5 +125,51 @@ public virtual String GetSabTitle(EpisodeParseResult parseResult)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual SabnzbdCategoryModel GetCategories(string host = null, int port = 0, string apiKey = null, string username = null, string password = null)
|
||||||
|
{
|
||||||
|
//Get saved values if any of these are defaults
|
||||||
|
if (host == null)
|
||||||
|
host = _configProvider.SabHost;
|
||||||
|
|
||||||
|
if (port == 0)
|
||||||
|
port = _configProvider.SabPort;
|
||||||
|
|
||||||
|
if (apiKey == null)
|
||||||
|
apiKey = _configProvider.SabApiKey;
|
||||||
|
|
||||||
|
if (username == null)
|
||||||
|
username = _configProvider.SabUsername;
|
||||||
|
|
||||||
|
if (password == null)
|
||||||
|
password = _configProvider.SabPassword;
|
||||||
|
|
||||||
|
const string action = "mode=get_cats&output=json";
|
||||||
|
|
||||||
|
var command = string.Format(@"http://{0}:{1}/api?{2}&apikey={3}&ma_username={4}&ma_password={5}",
|
||||||
|
host, port, action, apiKey, username, password);
|
||||||
|
|
||||||
|
var response = _httpProvider.DownloadString(command);
|
||||||
|
|
||||||
|
if (String.IsNullOrWhiteSpace(response))
|
||||||
|
return new SabnzbdCategoryModel{categories = new List<string>()};
|
||||||
|
|
||||||
|
var deserialized = new JavaScriptSerializer().Deserialize<SabnzbdCategoryModel>(response);
|
||||||
|
|
||||||
|
deserialized.categories.Remove("*");
|
||||||
|
|
||||||
|
return deserialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetSabRequest(string action)
|
||||||
|
{
|
||||||
|
return string.Format(@"http://{0}:{1}/api?{2}&apikey={3}&ma_username={4}&ma_password={5}",
|
||||||
|
_configProvider.SabHost,
|
||||||
|
_configProvider.SabPort,
|
||||||
|
action,
|
||||||
|
_configProvider.SabApiKey,
|
||||||
|
_configProvider.SabUsername,
|
||||||
|
_configProvider.SabPassword);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,17 +3,22 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
|
using NzbDrone.Core.Model;
|
||||||
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Providers.Jobs;
|
using NzbDrone.Core.Providers.Jobs;
|
||||||
|
using NzbDrone.Web.Models;
|
||||||
|
|
||||||
namespace NzbDrone.Web.Controllers
|
namespace NzbDrone.Web.Controllers
|
||||||
{
|
{
|
||||||
public class CommandController : Controller
|
public class CommandController : Controller
|
||||||
{
|
{
|
||||||
private readonly JobProvider _jobProvider;
|
private readonly JobProvider _jobProvider;
|
||||||
|
private readonly SabProvider _sabProvider;
|
||||||
|
|
||||||
public CommandController(JobProvider jobProvider)
|
public CommandController(JobProvider jobProvider, SabProvider sabProvider)
|
||||||
{
|
{
|
||||||
_jobProvider = jobProvider;
|
_jobProvider = jobProvider;
|
||||||
|
_sabProvider = sabProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonResult RssSync()
|
public JsonResult RssSync()
|
||||||
@ -37,5 +42,20 @@ public JsonResult UpdateInfo(int seriesId)
|
|||||||
|
|
||||||
return new JsonResult { Data = "ok", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
|
return new JsonResult { Data = "ok", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public JsonResult GetSabnzbdCategories(string host, int port, string apiKey, string username, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return new JsonResult {Data = _sabProvider.GetCategories(host, port, apiKey, username, password)};
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//Todo: Log the error
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,8 +80,8 @@ public ActionResult Indexers()
|
|||||||
|
|
||||||
public ActionResult Sabnzbd()
|
public ActionResult Sabnzbd()
|
||||||
{
|
{
|
||||||
var sabDropDir = _configProvider.SabDropDirectory;
|
var tvCategory = _configProvider.SabTvCategory;
|
||||||
var selectList = new SelectList(new List<string> { sabDropDir }, sabDropDir);
|
var tvCategorySelectList = new SelectList(new[] { tvCategory });
|
||||||
|
|
||||||
var model = new SabnzbdSettingsModel
|
var model = new SabnzbdSettingsModel
|
||||||
{
|
{
|
||||||
@ -92,8 +92,8 @@ public ActionResult Sabnzbd()
|
|||||||
SabPassword = _configProvider.SabPassword,
|
SabPassword = _configProvider.SabPassword,
|
||||||
SabTvCategory = _configProvider.SabTvCategory,
|
SabTvCategory = _configProvider.SabTvCategory,
|
||||||
SabTvPriority = _configProvider.SabTvPriority,
|
SabTvPriority = _configProvider.SabTvPriority,
|
||||||
SabDropDirectory = sabDropDir,
|
SabDropDirectory = _configProvider.SabDropDirectory,
|
||||||
SabDropDirectorySelectList = selectList
|
SabTvCategorySelectList = tvCategorySelectList
|
||||||
};
|
};
|
||||||
|
|
||||||
return View(model);
|
return View(model);
|
||||||
|
@ -57,6 +57,6 @@ public class SabnzbdSettingsModel
|
|||||||
[DisplayFormat(ConvertEmptyStringToNull = false)]
|
[DisplayFormat(ConvertEmptyStringToNull = false)]
|
||||||
public string SabDropDirectory { get; set; }
|
public string SabDropDirectory { get; set; }
|
||||||
|
|
||||||
public SelectList SabDropDirectorySelectList { get; set; }
|
public SelectList SabTvCategorySelectList { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -54,7 +54,7 @@
|
|||||||
<label class="labelClass">@Html.LabelFor(m => m.SabTvCategory)
|
<label class="labelClass">@Html.LabelFor(m => m.SabTvCategory)
|
||||||
<span class="small">@Html.DescriptionFor(m => m.SabTvCategory)</span>
|
<span class="small">@Html.DescriptionFor(m => m.SabTvCategory)</span>
|
||||||
</label>
|
</label>
|
||||||
@Html.TextBoxFor(m => m.SabTvCategory, new { @class = "inputClass" })
|
@Html.DropDownListFor(m => m.SabTvCategory, Model.SabTvCategorySelectList, new { @class = "inputClass selectClass" })
|
||||||
|
|
||||||
<label class="labelClass">@Html.LabelFor(m => m.SabTvPriority)
|
<label class="labelClass">@Html.LabelFor(m => m.SabTvPriority)
|
||||||
<span class="small">@Html.DescriptionFor(m => m.SabTvPriority)</span>
|
<span class="small">@Html.DescriptionFor(m => m.SabTvPriority)</span>
|
||||||
@ -96,5 +96,44 @@
|
|||||||
$('#SabApiKey').val(data.ApiKey);
|
$('#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>
|
</script>
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,38 @@
|
|||||||
<img src='../../Content/Images/ignoredNeutral.png' class='ignoredEpisodesMaster ignoreEpisode' id='master' value='10'/>
|
@Html.DropDownList("SabTvCategory", new SelectList(new List<string> { "TV" }))
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(".ignoreEpisode").live("click", function () {
|
var sabCategoryUrl = '../Command/GetSabnzbdCategories';
|
||||||
var toggle = $(this);
|
|
||||||
var value = $(this).attr('value');
|
$('#SabTvCategory').focus(function () {
|
||||||
var test = 0;
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: sabCategoryUrl,
|
||||||
|
data: jQuery.param({ host: '192.168.5.55', port: 2222, apiKey: '5c770e3197e4fe763423ee7c392c25d1', username: 'admin', password: 'pass' }),
|
||||||
|
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>
|
</script>
|
Loading…
Reference in New Issue
Block a user