Check sab queue now takes quality into consideration

This commit is contained in:
kay.one 2012-01-19 21:37:08 -08:00
parent 2d1f506f93
commit 9acfb7330c
15 changed files with 202 additions and 287 deletions

View File

@ -31,7 +31,26 @@
"msgid":"4295398", "msgid":"4295398",
"verbosity":"", "verbosity":"",
"mb":"785.89", "mb":"785.89",
"filename":"30 Rock - 1x05 - Title [SDTV]", "filename":"30 Rock - 1x05 - Title [HDTV]",
"priority":"High",
"cat":"Apps",
"mbleft":"785.89",
"percentage":"0",
"nzo_id":"SABnzbd_nzo_wgmb1m",
"unpackopts":"3",
"size":"785.9 MB"
},
{
"status":"Queued",
"index":0,
"eta":"unknown",
"timeleft":"0:00:00",
"avg_age":"43d",
"script":"None",
"msgid":"4295397",
"verbosity":"",
"mb":"785.89",
"filename":"The Simpsons - 1x05 - Title [HDTV] [Proper]",
"priority":"High", "priority":"High",
"cat":"Apps", "cat":"Apps",
"mbleft":"785.89", "mbleft":"785.89",

View File

@ -135,16 +135,7 @@ namespace NzbDrone.Core.Test
foreach (var qualityEnum in qualityEnums) foreach (var qualityEnum in qualityEnums)
{ {
if (qualityEnum.ToString() == QualityTypes.Unknown.ToString()) continue; var fileName = String.Format("My series S01E01 [{0}]", qualityEnum);
var extention = "mkv";
if (qualityEnum.ToString() == QualityTypes.SDTV.ToString() || qualityEnum.ToString() == QualityTypes.DVD.ToString())
{
extention = "avi";
}
var fileName = String.Format("My series S01E01 [{0}].{1}", qualityEnum, extention);
var result = Parser.ParseQuality(fileName); var result = Parser.ParseQuality(fileName);
result.QualityType.Should().Be(qualityEnum); result.QualityType.Should().Be(qualityEnum);
} }

View File

@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test.ProviderTests
const string sabTitle = "My fake sab title"; const string sabTitle = "My fake sab title";
Mocker.GetMock<SabProvider>() Mocker.GetMock<SabProvider>()
.Setup(s => s.IsInQueue(It.IsAny<String>())) .Setup(s => s.IsInQueue(It.IsAny<EpisodeParseResult>()))
.Returns(false); .Returns(false);
Mocker.GetMock<SabProvider>() Mocker.GetMock<SabProvider>()

View File

@ -31,7 +31,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
{ {
parseResultMulti = new EpisodeParseResult parseResultMulti = new EpisodeParseResult
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.SDTV, true), Quality = new Quality(QualityTypes.SDTV, true),
EpisodeNumbers = new List<int> { 3, 4 }, EpisodeNumbers = new List<int> { 3, 4 },
@ -41,7 +41,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
parseResultSingle = new EpisodeParseResult parseResultSingle = new EpisodeParseResult
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.SDTV, true), Quality = new Quality(QualityTypes.SDTV, true),
EpisodeNumbers = new List<int> { 3 }, EpisodeNumbers = new List<int> { 3 },

View File

@ -32,7 +32,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
{ {
parseResultMulti = new EpisodeParseResult() parseResultMulti = new EpisodeParseResult()
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.Bluray720p, true), Quality = new Quality(QualityTypes.Bluray720p, true),
EpisodeNumbers = new List<int> { 3, 4 }, EpisodeNumbers = new List<int> { 3, 4 },
@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
parseResultSingle = new EpisodeParseResult() parseResultSingle = new EpisodeParseResult()
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.Bluray720p, true), Quality = new Quality(QualityTypes.Bluray720p, true),
EpisodeNumbers = new List<int> { 3 }, EpisodeNumbers = new List<int> { 3 },
@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
parseResultDaily = new EpisodeParseResult() parseResultDaily = new EpisodeParseResult()
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.Bluray720p, true), Quality = new Quality(QualityTypes.Bluray720p, true),
AirDate = DateTime.Now.AddDays(-12).Date, AirDate = DateTime.Now.AddDays(-12).Date,

View File

@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
{ {
parseResultMulti = new EpisodeParseResult parseResultMulti = new EpisodeParseResult
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.Bluray720p, true), Quality = new Quality(QualityTypes.Bluray720p, true),
EpisodeNumbers = new List<int> { 3, 4 }, EpisodeNumbers = new List<int> { 3, 4 },
@ -44,7 +44,7 @@ namespace NzbDrone.Core.Test.ProviderTests.InventoryProviderTests
parseResultSingle = new EpisodeParseResult parseResultSingle = new EpisodeParseResult
{ {
CleanTitle = "Title", SeriesTitle = "Title",
Language = LanguageType.English, Language = LanguageType.English,
Quality = new Quality(QualityTypes.Bluray720p, true), Quality = new Quality(QualityTypes.Bluray720p, true),
EpisodeNumbers = new List<int> { 3 }, EpisodeNumbers = new List<int> { 3 },

View File

@ -1,6 +1,7 @@
// ReSharper disable RedundantUsingDirective // ReSharper disable RedundantUsingDirective
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -24,7 +25,8 @@ namespace NzbDrone.Core.Test.ProviderTests
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
public class SabProviderTest : CoreTest public class SabProviderTest : CoreTest
{ {
private void WithSabConfigValues() [SetUp]
private void Setup()
{ {
//Setup //Setup
string sabHost = "192.168.5.55"; string sabHost = "192.168.5.55";
@ -32,56 +34,36 @@ namespace NzbDrone.Core.Test.ProviderTests
string apikey = "5c770e3197e4fe763423ee7c392c25d1"; string apikey = "5c770e3197e4fe763423ee7c392c25d1";
string username = "admin"; string username = "admin";
string password = "pass"; string password = "pass";
string cat = "tv";
var fakeConfig = Mocker.GetMock<ConfigProvider>(); var fakeConfig = Mocker.GetMock<ConfigProvider>();
fakeConfig.SetupGet(c => c.SabHost) fakeConfig.SetupGet(c => c.SabHost).Returns(sabHost);
.Returns(sabHost); fakeConfig.SetupGet(c => c.SabPort).Returns(sabPort);
fakeConfig.SetupGet(c => c.SabPort) fakeConfig.SetupGet(c => c.SabApiKey).Returns(apikey);
.Returns(sabPort); fakeConfig.SetupGet(c => c.SabUsername).Returns(username);
fakeConfig.SetupGet(c => c.SabApiKey) fakeConfig.SetupGet(c => c.SabPassword).Returns(password);
.Returns(apikey); fakeConfig.SetupGet(c => c.SabTvCategory).Returns(cat);
fakeConfig.SetupGet(c => c.SabUsername) }
.Returns(username);
fakeConfig.SetupGet(c => c.SabPassword)
.Returns(password); private void WithFullQueue()
{
Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\Queue.txt"));
}
private void WithFailResponse()
{
Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString(It.IsAny<String>())).Returns("failed");
} }
[Test] [Test]
public void AddByUrlSuccess() public void add_url_should_format_request_properly()
{ {
//Setup
const string sabHost = "192.168.5.55";
const int sabPort = 2222;
const string apikey = "5c770e3197e4fe763423ee7c392c25d1";
const string username = "admin";
const string password = "pass";
const SabPriorityType priority = SabPriorityType.Normal;
const string category = "tv";
var fakeConfig = Mocker.GetMock<ConfigProvider>();
fakeConfig.SetupGet(c => c.SabHost)
.Returns(sabHost);
fakeConfig.SetupGet(c => c.SabPort)
.Returns(sabPort);
fakeConfig.SetupGet(c => c.SabApiKey)
.Returns(apikey);
fakeConfig.SetupGet(c => c.SabUsername)
.Returns(username);
fakeConfig.SetupGet(c => c.SabPassword)
.Returns(password);
fakeConfig.SetupGet(c => c.SabTvPriority)
.Returns(priority);
fakeConfig.SetupGet(c => c.SabTvCategory)
.Returns(category);
Mocker.GetMock<HttpProvider>(MockBehavior.Strict) Mocker.GetMock<HttpProvider>(MockBehavior.Strict)
.Setup( .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&pp=3&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
s =>
s.DownloadString(
"http://192.168.5.55:2222/api?mode=addurl&name=http://www.nzbclub.com/nzb_download.aspx?mid=1950232&priority=0&pp=3&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns("ok"); .Returns("ok");
//Act //Act
@ -94,41 +76,10 @@ namespace NzbDrone.Core.Test.ProviderTests
[Test] [Test]
public void AddByUrlNewzbin() public void newzbing_add_url_should_format_request_properly()
{ {
//Setup
const string sabHost = "192.168.5.55";
const int sabPort = 2222;
const string apikey = "5c770e3197e4fe763423ee7c392c25d1";
const string username = "admin";
const string password = "pass";
const SabPriorityType priority = SabPriorityType.Normal;
const string category = "tv";
var fakeConfig = Mocker.GetMock<ConfigProvider>();
fakeConfig.SetupGet(c => c.SabHost)
.Returns(sabHost);
fakeConfig.SetupGet(c => c.SabPort)
.Returns(sabPort);
fakeConfig.SetupGet(c => c.SabApiKey)
.Returns(apikey);
fakeConfig.SetupGet(c => c.SabUsername)
.Returns(username);
fakeConfig.SetupGet(c => c.SabPassword)
.Returns(password);
fakeConfig.SetupGet(c => c.SabTvPriority)
.Returns(priority);
fakeConfig.SetupGet(c => c.SabTvCategory)
.Returns(category);
Mocker.GetMock<HttpProvider>(MockBehavior.Strict) Mocker.GetMock<HttpProvider>(MockBehavior.Strict)
.Setup( .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=addid&name=6107863&priority=0&pp=3&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
s =>
s.DownloadString(
"http://192.168.5.55:2222/api?mode=addid&name=6107863&priority=0&pp=3&cat=tv&nzbname=This+is+an+Nzb&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns("ok"); .Returns("ok");
//Act //Act
@ -140,37 +91,9 @@ namespace NzbDrone.Core.Test.ProviderTests
} }
[Test] [Test]
public void AddByUrlError() public void add_by_url_should_detect_and_handle_sab_errors()
{ {
//Setup WithFailResponse();
string sabHost = "192.168.5.55";
int sabPort = 2222;
string apikey = "5c770e3197e4fe763423ee7c392c25d1";
string username = "admin";
string password = "pass";
var priority = SabPriorityType.Normal;
string category = "tv";
var fakeConfig = Mocker.GetMock<ConfigProvider>();
fakeConfig.SetupGet(c => c.SabHost)
.Returns(sabHost);
fakeConfig.SetupGet(c => c.SabPort)
.Returns(sabPort);
fakeConfig.SetupGet(c => c.SabApiKey)
.Returns(apikey);
fakeConfig.SetupGet(c => c.SabUsername)
.Returns(username);
fakeConfig.SetupGet(c => c.SabPassword)
.Returns(password);
fakeConfig.SetupGet(c => c.SabTvPriority)
.Returns(priority);
fakeConfig.SetupGet(c => c.SabTvCategory)
.Returns(category);
Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString(It.IsAny<String>()))
.Returns("error");
//Act //Act
var sabProvider = Mocker.Resolve<SabProvider>(); var sabProvider = Mocker.Resolve<SabProvider>();
@ -181,14 +104,14 @@ namespace NzbDrone.Core.Test.ProviderTests
ExceptionVerification.ExpectedWarns(1); ExceptionVerification.ExpectedWarns(1);
} }
[Test]
[TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, false, "My Series Name - 1x2 - My Episode Title [DVD]")] [TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, false, "My Series Name - 1x2 - My Episode Title [DVD]")]
[TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, true, "My Series Name - 1x2 - My Episode Title [DVD] [Proper]")] [TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, true, "My Series Name - 1x2 - My Episode Title [DVD] [Proper]")]
[TestCase(1, new[] { 2 }, "", QualityTypes.DVD, true, "My Series Name - 1x2 - [DVD] [Proper]")] [TestCase(1, new[] { 2 }, "", QualityTypes.DVD, true, "My Series Name - 1x2 - [DVD] [Proper]")]
[TestCase(1, new[] { 2, 4 }, "My Episode Title", QualityTypes.HDTV, false, "My Series Name - 1x2-1x4 - My Episode Title [HDTV]")] [TestCase(1, new[] { 2, 4 }, "My Episode Title", QualityTypes.HDTV, false, "My Series Name - 1x2-1x4 - My Episode Title [HDTV]")]
[TestCase(1, new[] { 2, 4 }, "My Episode Title", QualityTypes.HDTV, true, "My Series Name - 1x2-1x4 - My Episode Title [HDTV] [Proper]")] [TestCase(1, new[] { 2, 4 }, "My Episode Title", QualityTypes.HDTV, true, "My Series Name - 1x2-1x4 - My Episode Title [HDTV] [Proper]")]
[TestCase(1, new[] { 2, 4 }, "", QualityTypes.HDTV, true, "My Series Name - 1x2-1x4 - [HDTV] [Proper]")] [TestCase(1, new[] { 2, 4 }, "", QualityTypes.HDTV, true, "My Series Name - 1x2-1x4 - [HDTV] [Proper]")]
public void sab_title(int seasons, int[] episodes, string title, QualityTypes quality, bool proper, string expected) public void create_proper_sab_titles(int seasons, int[] episodes, string title, QualityTypes quality, bool proper, string expected)
{ {
var series = Builder<Series>.CreateNew() var series = Builder<Series>.CreateNew()
.With(c => c.Title = "My Series Name") .With(c => c.Title = "My Series Name")
@ -213,7 +136,7 @@ namespace NzbDrone.Core.Test.ProviderTests
[TestCase(true, "My Series Name - Season 1 [Bluray720p] [Proper]")] [TestCase(true, "My Series Name - Season 1 [Bluray720p] [Proper]")]
[TestCase(false, "My Series Name - Season 1 [Bluray720p]")] [TestCase(false, "My Series Name - Season 1 [Bluray720p]")]
public void sab_season_title(bool proper, string expected) public void create_proper_sab_season_title(bool proper, string expected)
{ {
@ -240,7 +163,7 @@ namespace NzbDrone.Core.Test.ProviderTests
[TestCase(true, "My Series Name - 2011-12-01 - My Episode Title [Bluray720p] [Proper]")] [TestCase(true, "My Series Name - 2011-12-01 - My Episode Title [Bluray720p] [Proper]")]
[TestCase(false, "My Series Name - 2011-12-01 - My Episode Title [Bluray720p]")] [TestCase(false, "My Series Name - 2011-12-01 - My Episode Title [Bluray720p]")]
public void sab_daily_series_title(bool proper, string expected) public void create_proper_sab_daily_titles(bool proper, string expected)
{ {
var series = Builder<Series>.CreateNew() var series = Builder<Series>.CreateNew()
.With(c => c.IsDaily = true) .With(c => c.IsDaily = true)
@ -263,50 +186,7 @@ namespace NzbDrone.Core.Test.ProviderTests
} }
[Test] [Test]
[Explicit] public void should_be_able_to_get_categories_when_config_is_passed_in()
public void AddNewzbingByUrlSuccess()
{
//Setup
const string sabHost = "192.168.1.50";
const int sabPort = 8080;
const string apikey = "f37dc33baec2e5566f5aec666287870d";
const string username = "root";
const string password = "*************";
const SabPriorityType priority = SabPriorityType.Normal;
const string category = "tv";
var fakeConfig = Mocker.GetMock<ConfigProvider>();
fakeConfig.SetupGet(c => c.SabHost)
.Returns(sabHost);
fakeConfig.SetupGet(c => c.SabPort)
.Returns(sabPort);
fakeConfig.SetupGet(c => c.SabApiKey)
.Returns(apikey);
fakeConfig.SetupGet(c => c.SabUsername)
.Returns(username);
fakeConfig.SetupGet(c => c.SabPassword)
.Returns(password);
fakeConfig.SetupGet(c => c.SabTvPriority)
.Returns(priority);
fakeConfig.SetupGet(c => c.SabTvCategory)
.Returns(category);
Mocker.SetConstant(new HttpProvider());
//Act
bool result = Mocker.Resolve<SabProvider>().AddByUrl(
"http://www.newzbin.com/browse/post/6107863/nzb", "Added by unit tests.");
//Assert
result.Should().BeTrue();
}
[Test]
public void Get_Categories_Success_Passed_Values()
{ {
//Setup //Setup
const string host = "192.168.5.55"; const string host = "192.168.5.55";
@ -330,29 +210,8 @@ namespace NzbDrone.Core.Test.ProviderTests
} }
[Test] [Test]
public void Get_Categories_Success_Config_Values() public void should_be_able_to_get_categories_using_config()
{ {
//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 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) 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")) .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")); .Returns(File.ReadAllText(@".\Files\Categories_json.txt"));
@ -368,8 +227,6 @@ namespace NzbDrone.Core.Test.ProviderTests
[Test] [Test]
public void GetQueue_should_return_an_empty_list_when_the_queue_is_empty() public void GetQueue_should_return_an_empty_list_when_the_queue_is_empty()
{ {
WithSabConfigValues();
Mocker.GetMock<HttpProvider>() Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\QueueEmpty.txt")); .Returns(File.ReadAllText(@".\Files\QueueEmpty.txt"));
@ -382,43 +239,30 @@ namespace NzbDrone.Core.Test.ProviderTests
} }
[Test] [Test]
[ExpectedException(typeof(ApplicationException), ExpectedMessage = "API Key Incorrect")]
public void GetQueue_should_return_an_empty_list_when_there_is_an_error_getting_the_queue() public void GetQueue_should_return_an_empty_list_when_there_is_an_error_getting_the_queue()
{ {
WithSabConfigValues();
Mocker.GetMock<HttpProvider>() Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\JsonError.txt")); .Returns(File.ReadAllText(@".\Files\JsonError.txt"));
//Act //Act
var result = Mocker.Resolve<SabProvider>().GetQueue(); Assert.Throws<ApplicationException>(() => Mocker.Resolve<SabProvider>().GetQueue(), "API Key Incorrect");
//Assert
result.Should().BeEmpty();
} }
[Test] [Test]
public void GetQueue_should_return_a_list_with_items_when_the_queue_has_items() public void GetQueue_should_return_a_list_with_items_when_the_queue_has_items()
{ {
WithSabConfigValues(); WithFullQueue();
Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=queue&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\Queue.txt"));
//Act //Act
var result = Mocker.Resolve<SabProvider>().GetQueue(); var result = Mocker.Resolve<SabProvider>().GetQueue();
//Assert //Assert
result.Should().HaveCount(2); result.Should().HaveCount(3);
} }
[Test] [Test]
public void GetHistory_should_return_a_list_with_items_when_the_history_has_items() public void GetHistory_should_return_a_list_with_items_when_the_history_has_items()
{ {
WithSabConfigValues();
Mocker.GetMock<HttpProvider>() Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\History.txt")); .Returns(File.ReadAllText(@".\Files\History.txt"));
@ -433,8 +277,6 @@ namespace NzbDrone.Core.Test.ProviderTests
[Test] [Test]
public void GetHistory_should_return_an_empty_list_when_the_queue_is_empty() public void GetHistory_should_return_an_empty_list_when_the_queue_is_empty()
{ {
WithSabConfigValues();
Mocker.GetMock<HttpProvider>() Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\HistoryEmpty.txt")); .Returns(File.ReadAllText(@".\Files\HistoryEmpty.txt"));
@ -447,20 +289,82 @@ namespace NzbDrone.Core.Test.ProviderTests
} }
[Test] [Test]
[ExpectedException(typeof(ApplicationException), ExpectedMessage = "API Key Incorrect")]
public void GetHistory_should_return_an_empty_list_when_there_is_an_error_getting_the_queue() public void GetHistory_should_return_an_empty_list_when_there_is_an_error_getting_the_queue()
{ {
WithSabConfigValues();
Mocker.GetMock<HttpProvider>() Mocker.GetMock<HttpProvider>()
.Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass")) .Setup(s => s.DownloadString("http://192.168.5.55:2222/api?mode=history&output=json&start=0&limit=0&apikey=5c770e3197e4fe763423ee7c392c25d1&ma_username=admin&ma_password=pass"))
.Returns(File.ReadAllText(@".\Files\JsonError.txt")); .Returns(File.ReadAllText(@".\Files\JsonError.txt"));
//Act //Act
var result = Mocker.Resolve<SabProvider>().GetHistory(); Assert.Throws<ApplicationException>(() => Mocker.Resolve<SabProvider>().GetHistory(), "API Key Incorrect");
}
[Test]
public void is_in_queue_should_find_if_exact_episode_is_in_queue()
{
WithFullQueue();
var parseResult = new EpisodeParseResult
{
EpisodeTitle = "Title",
EpisodeNumbers = new List<int> { 5 },
SeasonNumber = 1,
Quality = new Quality { QualityType = QualityTypes.SDTV, Proper = false },
Series = new Series { Title = "30 Rock" },
};
var result = Mocker.Resolve<SabProvider>().IsInQueue(parseResult);
result.Should().BeTrue();
}
[TestCase(2, 5, "30 Rock", QualityTypes.Bluray1080p, true, Description = "Same Series, Diffrent Season, Episode")]
[TestCase(1, 6, "30 Rock", QualityTypes.Bluray1080p, true, Description = "Same series, diffrent episode")]
[TestCase(1, 6, "Some other show", QualityTypes.Bluray1080p, true, Description = "Diffrent series, same season, episdoe")]
[TestCase(1, 5, "Rock", QualityTypes.Bluray1080p, true, Description = "Similar series, same season, episode")]
[TestCase(1, 5, "30 Rock", QualityTypes.Bluray720p, false, Description = "Same series, higher quality")]
[TestCase(1, 5, "30 Rock", QualityTypes.HDTV, true, Description = "Same series, higher quality")]
public void IsInQueue_should_not_find_diffrent_episode_queue(int season, int episode, string title, QualityTypes qualityType, bool proper)
{
WithFullQueue();
var parseResult = new EpisodeParseResult
{
EpisodeTitle = "Title",
EpisodeNumbers = new List<int> { episode },
SeasonNumber = season,
Quality = new Quality { QualityType = qualityType, Proper = proper },
Series = new Series { Title = title },
};
var result = Mocker.Resolve<SabProvider>().IsInQueue(parseResult);
result.Should().BeFalse();
}
[TestCase(1, 5, "30 Rock", QualityTypes.SDTV, false, Description = "Same Series, lower quality")]
[TestCase(1, 5, "30 rocK", QualityTypes.SDTV, false, Description = "Same Series, diffrent casing")]
[TestCase(1, 5, "30 RocK", QualityTypes.HDTV, false, Description = "Same Series, same quality")]
public void IsInQueue_should_find_same_or_lower_quality_episode_queue(int season, int episode, string title, QualityTypes qualityType, bool proper)
{
WithFullQueue();
var parseResult = new EpisodeParseResult
{
EpisodeTitle = "Title",
EpisodeNumbers = new List<int> { episode },
SeasonNumber = season,
Quality = new Quality { QualityType = qualityType, Proper = proper },
Series = new Series { Title = title },
};
var result = Mocker.Resolve<SabProvider>().IsInQueue(parseResult);
result.Should().BeTrue();
}
//Assert
result.Should().BeEmpty();
}
} }
} }

View File

@ -6,15 +6,22 @@ namespace NzbDrone.Core.Model
{ {
public class EpisodeParseResult public class EpisodeParseResult
{ {
internal string CleanTitle { get; set; } public string SeriesTitle { get; set; }
public string CleanTitle
{
get
{
return Parser.NormalizeTitle(SeriesTitle);
}
}
public string EpisodeTitle { get; set; } public string EpisodeTitle { get; set; }
internal int SeasonNumber { get; set; } public int SeasonNumber { get; set; }
internal List<int> EpisodeNumbers { get; set; } public List<int> EpisodeNumbers { get; set; }
internal DateTime? AirDate { get; set; } public DateTime? AirDate { get; set; }
public Quality Quality { get; set; } public Quality Quality { get; set; }
@ -35,10 +42,10 @@ namespace NzbDrone.Core.Model
public override string ToString() public override string ToString()
{ {
if (AirDate != null && EpisodeNumbers == null) if (AirDate != null && EpisodeNumbers == null)
return string.Format("{0} - {1} {2}", CleanTitle, AirDate.Value.ToShortDateString(), Quality); return string.Format("{0} - {1} {2}", SeriesTitle, AirDate.Value.ToShortDateString(), Quality);
if (EpisodeNumbers != null) if (EpisodeNumbers != null)
return string.Format("{0} - S{1:00}E{2} {3}", CleanTitle, SeasonNumber, return string.Format("{0} - S{1:00}E{2} {3}", SeriesTitle, SeasonNumber,
String.Join("-", EpisodeNumbers), Quality); String.Join("-", EpisodeNumbers), Quality);
return NzbTitle; return NzbTitle;

View File

@ -1,7 +1,4 @@
using System; using System.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace NzbDrone.Core.Model.Sabnzbd namespace NzbDrone.Core.Model.Sabnzbd

View File

@ -15,8 +15,18 @@ namespace NzbDrone.Core.Model.Sabnzbd
[JsonProperty(PropertyName = "mb")] [JsonProperty(PropertyName = "mb")]
public decimal Size { get; set; } public decimal Size { get; set; }
private string _title;
[JsonProperty(PropertyName = "filename")] [JsonProperty(PropertyName = "filename")]
public string Title { get; set; } public string Title
{
get { return _title; }
set
{
_title = value;
ParseResult = Parser.ParseTitle(value);
}
}
public SabPriorityType Priority { get; set; } public SabPriorityType Priority { get; set; }
@ -30,5 +40,7 @@ namespace NzbDrone.Core.Model.Sabnzbd
[JsonProperty(PropertyName = "nzo_id")] [JsonProperty(PropertyName = "nzo_id")]
public string Id { get; set; } public string Id { get; set; }
public EpisodeParseResult ParseResult { private set; get; }
} }
} }

View File

@ -117,7 +117,7 @@ namespace NzbDrone.Core
private static EpisodeParseResult ParseMatchCollection(MatchCollection matchCollection) private static EpisodeParseResult ParseMatchCollection(MatchCollection matchCollection)
{ {
var seriesName = NormalizeTitle(matchCollection[0].Groups["title"].Value); var seriesName = matchCollection[0].Groups["title"].Value;
int airyear; int airyear;
Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out airyear); Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out airyear);
@ -184,7 +184,7 @@ namespace NzbDrone.Core
}; };
} }
parsedEpisode.CleanTitle = seriesName; parsedEpisode.SeriesTitle = seriesName;
Logger.Trace("Episode Parsed. {0}", parsedEpisode); Logger.Trace("Episode Parsed. {0}", parsedEpisode);
@ -307,7 +307,15 @@ namespace NzbDrone.Core
} }
} }
if ((normalizedName.Contains("sdtv") || (result.QualityType == QualityTypes.Unknown && normalizedName.Contains("hdtv"))) && !normalizedName.Contains("mpeg")) if (name.Contains("[HDTV]"))
{
result.QualityType = QualityTypes.HDTV;
return result;
}
if ((normalizedName.Contains("sdtv") ||
(result.QualityType == QualityTypes.Unknown && normalizedName.Contains("hdtv"))) &&
!normalizedName.Contains("mpeg"))
{ {
result.QualityType = QualityTypes.SDTV; result.QualityType = QualityTypes.SDTV;
return result; return result;

View File

@ -115,7 +115,7 @@ namespace NzbDrone.Core.Providers
if (parseResult == null) if (parseResult == null)
return null; return null;
parseResult.CleanTitle = series.Title; //replaces the nasty path as title to help with logging parseResult.SeriesTitle = series.Title; //replaces the nasty path as title to help with logging
parseResult.Series = series; parseResult.Series = series;
var episodes = _episodeProvider.GetEpisodesByParseResult(parseResult); var episodes = _episodeProvider.GetEpisodesByParseResult(parseResult);

View File

@ -31,14 +31,13 @@ namespace NzbDrone.Core.Providers
public virtual bool DownloadReport(EpisodeParseResult parseResult) public virtual bool DownloadReport(EpisodeParseResult parseResult)
{ {
var sabTitle = _sabProvider.GetSabTitle(parseResult); if (_sabProvider.IsInQueue(parseResult))
if (_sabProvider.IsInQueue(sabTitle))
{ {
Logger.Warn("Episode {0} is already in sab's queue. skipping.", parseResult); Logger.Warn("Episode {0} is already in sab's queue. skipping.", parseResult);
return false; return false;
} }
var sabTitle = _sabProvider.GetSabTitle(parseResult);
var addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle); var addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle);
if (addSuccess) if (addSuccess)

View File

@ -187,14 +187,11 @@ namespace NzbDrone.Core.Providers
{ {
//Used to check if the existing episode can be upgraded by searching (Before we search) //Used to check if the existing episode can be upgraded by searching (Before we search)
//If no episode file exists on disk, then an upgrade is possible
if (episode.EpisodeFileId == 0) if (episode.EpisodeFileId == 0)
return true; return true;
//Get the quality profile for the series
var profile = _qualityProvider.Get(episode.Series.QualityProfileId); var profile = _qualityProvider.Get(episode.Series.QualityProfileId);
//If the current episode file meets or exceeds the cutoff, do not attempt upgrade
if (episode.EpisodeFile.Quality >= profile.Cutoff) if (episode.EpisodeFile.Quality >= profile.Cutoff)
return false; return false;

View File

@ -1,10 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
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 Newtonsoft.Json; using Newtonsoft.Json;
using Ninject; using Ninject;
@ -12,7 +10,6 @@ using NLog;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Sabnzbd; using NzbDrone.Core.Model.Sabnzbd;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository.Quality;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers
{ {
@ -75,35 +72,14 @@ namespace NzbDrone.Core.Providers
return urlString.Replace("&", "%26"); return urlString.Replace("&", "%26");
} }
public virtual bool IsInQueue(string title) public virtual bool IsInQueue(EpisodeParseResult newParseResult)
{ {
const string action = "mode=queue&output=xml"; var queue = GetQueue();
string request = GetSabRequest(action);
string response = _httpProvider.DownloadString(request);
XDocument xDoc = XDocument.Parse(response); return queue.Any(c => String.Equals(c.ParseResult.SeriesTitle, newParseResult.Series.Title, StringComparison.InvariantCultureIgnoreCase) &&
c.ParseResult.EpisodeNumbers.SequenceEqual(newParseResult.EpisodeNumbers) &&
//If an Error Occurred, return) c.ParseResult.SeasonNumber == newParseResult.SeasonNumber &&
if (xDoc.Descendants("error").Count() != 0) c.ParseResult.Quality >= newParseResult.Quality);
throw new ApplicationException(xDoc.Descendants("error").FirstOrDefault().Value);
if (xDoc.Descendants("queue").Count() == 0)
{
Logger.Debug("SAB Queue is empty. retiring false");
return false;
}
//Get the Count of Items in Queue where 'filename' is Equal to goodName, if not zero, return true (isInQueue)))
if (
(xDoc.Descendants("slot").Where(
s => s.Element("filename").Value.Equals(title, StringComparison.InvariantCultureIgnoreCase))).Count() !=
0)
{
Logger.Debug("Episode in queue - '{0}'", title);
return true;
}
return false; //Not in Queue
} }
public virtual List<SabQueueItem> GetQueue(int start = 0, int limit = 0) public virtual List<SabQueueItem> GetQueue(int start = 0, int limit = 0)
@ -133,7 +109,7 @@ namespace NzbDrone.Core.Providers
//Handle Full Naming //Handle Full Naming
if (parseResult.FullSeason) if (parseResult.FullSeason)
{ {
var seasonResult = String.Format("{0} - Season {1} [{2}]", MediaFileProvider.CleanFilename(parseResult.Series.Title), var seasonResult = String.Format("{0} - Season {1} [{2}]", GetSabSeriesName(parseResult),
parseResult.SeasonNumber, parseResult.Quality.QualityType); parseResult.SeasonNumber, parseResult.Quality.QualityType);
if (parseResult.Quality.Proper) if (parseResult.Quality.Proper)
@ -144,7 +120,7 @@ namespace NzbDrone.Core.Providers
if (parseResult.Series.IsDaily) if (parseResult.Series.IsDaily)
{ {
var dailyResult = String.Format("{0} - {1:yyyy-MM-dd} - {2} [{3}]", MediaFileProvider.CleanFilename(parseResult.Series.Title), var dailyResult = String.Format("{0} - {1:yyyy-MM-dd} - {2} [{3}]", GetSabSeriesName(parseResult),
parseResult.AirDate, parseResult.EpisodeTitle, parseResult.Quality.QualityType); parseResult.AirDate, parseResult.EpisodeTitle, parseResult.Quality.QualityType);
if (parseResult.Quality.Proper) if (parseResult.Quality.Proper)
@ -164,7 +140,7 @@ namespace NzbDrone.Core.Providers
var epNumberString = String.Join("-", episodeString); var epNumberString = String.Join("-", episodeString);
var result = String.Format("{0} - {1} - {2} [{3}]", MediaFileProvider.CleanFilename(parseResult.Series.Title), epNumberString, parseResult.EpisodeTitle, parseResult.Quality.QualityType); var result = String.Format("{0} - {1} - {2} [{3}]", GetSabSeriesName(parseResult), epNumberString, parseResult.EpisodeTitle, parseResult.Quality.QualityType);
if (parseResult.Quality.Proper) if (parseResult.Quality.Proper)
{ {
@ -174,6 +150,11 @@ namespace NzbDrone.Core.Providers
return result; return result;
} }
private static string GetSabSeriesName(EpisodeParseResult parseResult)
{
return MediaFileProvider.CleanFilename(parseResult.Series.Title);
}
public virtual SabCategoryModel GetCategories(string host = null, int port = 0, string apiKey = null, string username = null, string password = null) public virtual SabCategoryModel 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 //Get saved values if any of these are defaults
@ -202,9 +183,9 @@ namespace NzbDrone.Core.Providers
if (String.IsNullOrWhiteSpace(response)) if (String.IsNullOrWhiteSpace(response))
return new SabCategoryModel { categories = new List<string>() }; return new SabCategoryModel { categories = new List<string>() };
var deserialized = JsonConvert.DeserializeObject<SabCategoryModel>(response); var categories = JsonConvert.DeserializeObject<SabCategoryModel>(response);
return deserialized; return categories;
} }
private string GetSabRequest(string action) private string GetSabRequest(string action)