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",
"verbosity":"",
"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",
"cat":"Apps",
"mbleft":"785.89",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
// ReSharper disable RedundantUsingDirective
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@ -24,7 +25,8 @@ namespace NzbDrone.Core.Test.ProviderTests
// ReSharper disable InconsistentNaming
public class SabProviderTest : CoreTest
{
private void WithSabConfigValues()
[SetUp]
private void Setup()
{
//Setup
string sabHost = "192.168.5.55";
@ -32,56 +34,36 @@ namespace NzbDrone.Core.Test.ProviderTests
string apikey = "5c770e3197e4fe763423ee7c392c25d1";
string username = "admin";
string password = "pass";
string cat = "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.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.SabTvCategory).Returns(cat);
}
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]
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)
.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"))
.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"))
.Returns("ok");
//Act
@ -94,41 +76,10 @@ namespace NzbDrone.Core.Test.ProviderTests
[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)
.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"))
.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"))
.Returns("ok");
//Act
@ -140,37 +91,9 @@ namespace NzbDrone.Core.Test.ProviderTests
}
[Test]
public void AddByUrlError()
public void add_by_url_should_detect_and_handle_sab_errors()
{
//Setup
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");
WithFailResponse();
//Act
var sabProvider = Mocker.Resolve<SabProvider>();
@ -181,14 +104,14 @@ namespace NzbDrone.Core.Test.ProviderTests
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, 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, 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 }, "", 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()
.With(c => c.Title = "My Series Name")
@ -201,7 +124,7 @@ namespace NzbDrone.Core.Test.ProviderTests
Quality = new Quality(quality, proper),
SeasonNumber = seasons,
Series = series,
EpisodeTitle = title
EpisodeTitle = title
};
//Act
@ -213,9 +136,9 @@ namespace NzbDrone.Core.Test.ProviderTests
[TestCase(true, "My Series Name - Season 1 [Bluray720p] [Proper]")]
[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)
{
var series = Builder<Series>.CreateNew()
.With(c => c.Title = "My Series Name")
@ -240,7 +163,7 @@ namespace NzbDrone.Core.Test.ProviderTests
[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]")]
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()
.With(c => c.IsDaily = true)
@ -249,7 +172,7 @@ namespace NzbDrone.Core.Test.ProviderTests
var parsResult = new EpisodeParseResult
{
AirDate = new DateTime(2011, 12,1),
AirDate = new DateTime(2011, 12, 1),
Quality = new Quality(QualityTypes.Bluray720p, proper),
Series = series,
EpisodeTitle = "My Episode Title",
@ -263,50 +186,7 @@ namespace NzbDrone.Core.Test.ProviderTests
}
[Test]
[Explicit]
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()
public void should_be_able_to_get_categories_when_config_is_passed_in()
{
//Setup
const string host = "192.168.5.55";
@ -315,7 +195,7 @@ namespace NzbDrone.Core.Test.ProviderTests
const string username = "admin";
const string password = "pass";
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"))
@ -330,32 +210,11 @@ namespace NzbDrone.Core.Test.ProviderTests
}
[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)
.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"));
.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();
@ -368,8 +227,6 @@ namespace NzbDrone.Core.Test.ProviderTests
[Test]
public void GetQueue_should_return_an_empty_list_when_the_queue_is_empty()
{
WithSabConfigValues();
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\QueueEmpty.txt"));
@ -382,43 +239,30 @@ namespace NzbDrone.Core.Test.ProviderTests
}
[Test]
[ExpectedException(typeof(ApplicationException), ExpectedMessage = "API Key Incorrect")]
public void GetQueue_should_return_an_empty_list_when_there_is_an_error_getting_the_queue()
{
WithSabConfigValues();
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\JsonError.txt"));
//Act
var result = Mocker.Resolve<SabProvider>().GetQueue();
//Assert
result.Should().BeEmpty();
Assert.Throws<ApplicationException>(() => Mocker.Resolve<SabProvider>().GetQueue(), "API Key Incorrect");
}
[Test]
public void GetQueue_should_return_a_list_with_items_when_the_queue_has_items()
{
WithSabConfigValues();
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"));
WithFullQueue();
//Act
var result = Mocker.Resolve<SabProvider>().GetQueue();
//Assert
result.Should().HaveCount(2);
result.Should().HaveCount(3);
}
[Test]
public void GetHistory_should_return_a_list_with_items_when_the_history_has_items()
{
WithSabConfigValues();
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"))
.Returns(File.ReadAllText(@".\Files\History.txt"));
@ -433,8 +277,6 @@ namespace NzbDrone.Core.Test.ProviderTests
[Test]
public void GetHistory_should_return_an_empty_list_when_the_queue_is_empty()
{
WithSabConfigValues();
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"))
.Returns(File.ReadAllText(@".\Files\HistoryEmpty.txt"));
@ -447,20 +289,82 @@ namespace NzbDrone.Core.Test.ProviderTests
}
[Test]
[ExpectedException(typeof(ApplicationException), ExpectedMessage = "API Key Incorrect")]
public void GetHistory_should_return_an_empty_list_when_there_is_an_error_getting_the_queue()
{
WithSabConfigValues();
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"))
.Returns(File.ReadAllText(@".\Files\JsonError.txt"));
//Act
var result = Mocker.Resolve<SabProvider>().GetHistory();
//Assert
result.Should().BeEmpty();
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();
}
}
}

View File

@ -6,15 +6,22 @@ namespace NzbDrone.Core.Model
{
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; }
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; }
@ -35,10 +42,10 @@ namespace NzbDrone.Core.Model
public override string ToString()
{
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)
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);
return NzbTitle;

View File

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

View File

@ -15,8 +15,18 @@ namespace NzbDrone.Core.Model.Sabnzbd
[JsonProperty(PropertyName = "mb")]
public decimal Size { get; set; }
private string _title;
[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; }
@ -30,5 +40,7 @@ namespace NzbDrone.Core.Model.Sabnzbd
[JsonProperty(PropertyName = "nzo_id")]
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)
{
var seriesName = NormalizeTitle(matchCollection[0].Groups["title"].Value);
var seriesName = matchCollection[0].Groups["title"].Value;
int 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);
@ -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;
return result;

View File

@ -115,7 +115,7 @@ namespace NzbDrone.Core.Providers
if (parseResult == 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;
var episodes = _episodeProvider.GetEpisodesByParseResult(parseResult);

View File

@ -31,14 +31,13 @@ namespace NzbDrone.Core.Providers
public virtual bool DownloadReport(EpisodeParseResult parseResult)
{
var sabTitle = _sabProvider.GetSabTitle(parseResult);
if (_sabProvider.IsInQueue(sabTitle))
if (_sabProvider.IsInQueue(parseResult))
{
Logger.Warn("Episode {0} is already in sab's queue. skipping.", parseResult);
return false;
}
var sabTitle = _sabProvider.GetSabTitle(parseResult);
var addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle);
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)
//If no episode file exists on disk, then an upgrade is possible
if (episode.EpisodeFileId == 0)
return true;
//Get the quality profile for the series
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)
return false;

View File

@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Script.Serialization;
using System.Xml.Linq;
using Newtonsoft.Json;
using Ninject;
@ -12,7 +10,6 @@ using NLog;
using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Sabnzbd;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository.Quality;
namespace NzbDrone.Core.Providers
{
@ -75,35 +72,14 @@ namespace NzbDrone.Core.Providers
return urlString.Replace("&", "%26");
}
public virtual bool IsInQueue(string title)
public virtual bool IsInQueue(EpisodeParseResult newParseResult)
{
const string action = "mode=queue&output=xml";
string request = GetSabRequest(action);
string response = _httpProvider.DownloadString(request);
var queue = GetQueue();
XDocument xDoc = XDocument.Parse(response);
//If an Error Occurred, return)
if (xDoc.Descendants("error").Count() != 0)
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
return queue.Any(c => String.Equals(c.ParseResult.SeriesTitle, newParseResult.Series.Title, StringComparison.InvariantCultureIgnoreCase) &&
c.ParseResult.EpisodeNumbers.SequenceEqual(newParseResult.EpisodeNumbers) &&
c.ParseResult.SeasonNumber == newParseResult.SeasonNumber &&
c.ParseResult.Quality >= newParseResult.Quality);
}
public virtual List<SabQueueItem> GetQueue(int start = 0, int limit = 0)
@ -133,7 +109,7 @@ namespace NzbDrone.Core.Providers
//Handle Full Naming
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);
if (parseResult.Quality.Proper)
@ -144,7 +120,7 @@ namespace NzbDrone.Core.Providers
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);
if (parseResult.Quality.Proper)
@ -164,7 +140,7 @@ namespace NzbDrone.Core.Providers
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)
{
@ -174,6 +150,11 @@ namespace NzbDrone.Core.Providers
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)
{
//Get saved values if any of these are defaults
@ -200,11 +181,11 @@ namespace NzbDrone.Core.Providers
var response = _httpProvider.DownloadString(command);
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)
@ -221,7 +202,7 @@ namespace NzbDrone.Core.Providers
private void CheckForError(string response)
{
var result = JsonConvert.DeserializeObject<SabJsonError>(response);
if (result.Status.Equals("false", StringComparison.InvariantCultureIgnoreCase))
throw new ApplicationException(result.Error);
}