mirror of
https://github.com/Radarr/Radarr.git
synced 2024-11-04 10:02:40 +01:00
broke episodeparseresult into filenameparseresult and indexerparseresult
This commit is contained in:
parent
89f261eddf
commit
7c1e81a70e
@ -21,8 +21,8 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
|
||||
public class AcceptableSizeSpecificationFixture : CoreTest
|
||||
{
|
||||
private EpisodeParseResult parseResultMulti;
|
||||
private EpisodeParseResult parseResultSingle;
|
||||
private IndexerParseResult parseResultMulti;
|
||||
private IndexerParseResult parseResultSingle;
|
||||
private Series series30minutes;
|
||||
private Series series60minutes;
|
||||
private QualitySize qualityType;
|
||||
@ -30,7 +30,7 @@ public class AcceptableSizeSpecificationFixture : CoreTest
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
parseResultMulti = new EpisodeParseResult
|
||||
parseResultMulti = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Language = LanguageType.English,
|
||||
@ -40,7 +40,7 @@ public void Setup()
|
||||
AirDate = DateTime.Now.AddDays(-12).Date
|
||||
};
|
||||
|
||||
parseResultSingle = new EpisodeParseResult
|
||||
parseResultSingle = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Language = LanguageType.English,
|
||||
@ -392,7 +392,7 @@ public void IsAcceptableSize_should_treat_daily_series_as_single_episode()
|
||||
[Test]
|
||||
public void should_return_true_if_RAWHD()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
Quality = new QualityModel(Quality.RAWHD, false)
|
||||
};
|
||||
|
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
[TestFixture]
|
||||
public class AllowedDownloadSpecificationFixture : CoreTest<DownloadDecisionMaker>
|
||||
{
|
||||
private List<EpisodeParseResult> _parseResults;
|
||||
private List<IndexerParseResult> _parseResults;
|
||||
|
||||
private Mock<IDecisionEngineSpecification> _pass1;
|
||||
private Mock<IDecisionEngineSpecification> _pass2;
|
||||
@ -33,15 +33,15 @@ public void Setup()
|
||||
_fail2 = new Mock<IDecisionEngineSpecification>();
|
||||
_fail3 = new Mock<IDecisionEngineSpecification>();
|
||||
|
||||
_pass1.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(true);
|
||||
_pass2.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(true);
|
||||
_pass3.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(true);
|
||||
_pass1.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(true);
|
||||
_pass2.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(true);
|
||||
_pass3.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(true);
|
||||
|
||||
_fail1.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(false);
|
||||
_fail2.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(false);
|
||||
_fail3.Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())).Returns(false);
|
||||
_fail1.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(false);
|
||||
_fail2.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(false);
|
||||
_fail3.Setup(c => c.IsSatisfiedBy(It.IsAny<IndexerParseResult>())).Returns(false);
|
||||
|
||||
_parseResults = new List<EpisodeParseResult>() { new EpisodeParseResult() };
|
||||
_parseResults = new List<IndexerParseResult>() { new IndexerParseResult() };
|
||||
|
||||
}
|
||||
|
||||
|
@ -14,12 +14,12 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
|
||||
public class AllowedReleaseGroupSpecificationFixture : CoreTest<AllowedReleaseGroupSpecification>
|
||||
{
|
||||
private EpisodeParseResult parseResult;
|
||||
private IndexerParseResult parseResult;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
parseResult = new EpisodeParseResult
|
||||
parseResult = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Language = LanguageType.English,
|
||||
|
@ -23,8 +23,8 @@ public class CustomStartDateSpecificationFixture : CoreTest
|
||||
{
|
||||
private CustomStartDateSpecification _customStartDateSpecification;
|
||||
|
||||
private EpisodeParseResult parseResultMulti;
|
||||
private EpisodeParseResult parseResultSingle;
|
||||
private IndexerParseResult parseResultMulti;
|
||||
private IndexerParseResult parseResultSingle;
|
||||
private Series fakeSeries;
|
||||
private Episode firstEpisode;
|
||||
private Episode secondEpisode;
|
||||
@ -42,7 +42,7 @@ public void Setup()
|
||||
.With(c => c.CustomStartDate = null)
|
||||
.Build();
|
||||
|
||||
parseResultMulti = new EpisodeParseResult
|
||||
parseResultMulti = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Series = fakeSeries,
|
||||
@ -51,7 +51,7 @@ public void Setup()
|
||||
Episodes = new List<Episode> { firstEpisode, secondEpisode }
|
||||
};
|
||||
|
||||
parseResultSingle = new EpisodeParseResult
|
||||
parseResultSingle = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Series = fakeSeries,
|
||||
|
@ -20,11 +20,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
|
||||
public class LanguageSpecificationFixture : CoreTest
|
||||
{
|
||||
private EpisodeParseResult parseResult;
|
||||
private IndexerParseResult parseResult;
|
||||
|
||||
private void WithEnglishRelease()
|
||||
{
|
||||
parseResult = Builder<EpisodeParseResult>
|
||||
parseResult = Builder<IndexerParseResult>
|
||||
.CreateNew()
|
||||
.With(p => p.Language = LanguageType.English)
|
||||
.Build();
|
||||
@ -32,7 +32,7 @@ private void WithEnglishRelease()
|
||||
|
||||
private void WithGermanRelease()
|
||||
{
|
||||
parseResult = Builder<EpisodeParseResult>
|
||||
parseResult = Builder<IndexerParseResult>
|
||||
.CreateNew()
|
||||
.With(p => p.Language = LanguageType.German)
|
||||
.Build();
|
||||
|
@ -23,8 +23,8 @@ public class MonitoredEpisodeSpecificationFixture : CoreTest
|
||||
{
|
||||
private MonitoredEpisodeSpecification monitoredEpisodeSpecification;
|
||||
|
||||
private EpisodeParseResult parseResultMulti;
|
||||
private EpisodeParseResult parseResultSingle;
|
||||
private IndexerParseResult parseResultMulti;
|
||||
private IndexerParseResult parseResultSingle;
|
||||
private Series fakeSeries;
|
||||
private Episode firstEpisode;
|
||||
private Episode secondEpisode;
|
||||
@ -38,7 +38,7 @@ public void Setup()
|
||||
.With(c => c.Monitored = true)
|
||||
.Build();
|
||||
|
||||
parseResultMulti = new EpisodeParseResult
|
||||
parseResultMulti = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Series = fakeSeries,
|
||||
@ -46,7 +46,7 @@ public void Setup()
|
||||
SeasonNumber = 12,
|
||||
};
|
||||
|
||||
parseResultSingle = new EpisodeParseResult
|
||||
parseResultSingle = new IndexerParseResult
|
||||
{
|
||||
SeriesTitle = "Title",
|
||||
Series = fakeSeries,
|
||||
|
@ -20,7 +20,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
public class QualityAllowedByProfileSpecificationFixture : CoreTest
|
||||
{
|
||||
private QualityAllowedByProfileSpecification _qualityAllowedByProfile;
|
||||
private EpisodeParseResult parseResult;
|
||||
private IndexerParseResult parseResult;
|
||||
|
||||
public static object[] AllowedTestCases =
|
||||
{
|
||||
@ -45,7 +45,7 @@ public void Setup()
|
||||
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.Bluray1080p })
|
||||
.Build();
|
||||
|
||||
parseResult = new EpisodeParseResult
|
||||
parseResult = new IndexerParseResult
|
||||
{
|
||||
Series = fakeSeries,
|
||||
Quality = new QualityModel(Quality.DVD, true),
|
||||
|
@ -23,14 +23,14 @@ public class RetentionSpecificationFixture : CoreTest
|
||||
{
|
||||
private RetentionSpecification retentionSpecification;
|
||||
|
||||
private EpisodeParseResult parseResult;
|
||||
private IndexerParseResult parseResult;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
retentionSpecification = Mocker.Resolve<RetentionSpecification>();
|
||||
|
||||
parseResult = new EpisodeParseResult
|
||||
parseResult = new IndexerParseResult
|
||||
{
|
||||
Age = 100
|
||||
};
|
||||
|
@ -24,8 +24,8 @@ public class UpgradeDiskSpecificationFixture : CoreTest
|
||||
{
|
||||
private UpgradeDiskSpecification _upgradeDisk;
|
||||
|
||||
private EpisodeParseResult parseResultMulti;
|
||||
private EpisodeParseResult parseResultSingle;
|
||||
private IndexerParseResult parseResultMulti;
|
||||
private IndexerParseResult parseResultSingle;
|
||||
private EpisodeFile firstFile;
|
||||
private EpisodeFile secondFile;
|
||||
|
||||
@ -45,7 +45,7 @@ public void Setup()
|
||||
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.Bluray1080p })
|
||||
.Build();
|
||||
|
||||
parseResultMulti = new EpisodeParseResult
|
||||
parseResultMulti = new IndexerParseResult
|
||||
{
|
||||
Series = fakeSeries,
|
||||
Quality = new QualityModel(Quality.DVD, true),
|
||||
@ -54,7 +54,7 @@ public void Setup()
|
||||
Episodes = doubleEpisodeList
|
||||
};
|
||||
|
||||
parseResultSingle = new EpisodeParseResult
|
||||
parseResultSingle = new IndexerParseResult
|
||||
{
|
||||
Series = fakeSeries,
|
||||
Quality = new QualityModel(Quality.DVD, true),
|
||||
|
@ -22,8 +22,8 @@ public class UpgradeHistorySpecificationFixture : CoreTest
|
||||
{
|
||||
private UpgradeHistorySpecification _upgradeHistory;
|
||||
|
||||
private EpisodeParseResult _parseResultMulti;
|
||||
private EpisodeParseResult _parseResultSingle;
|
||||
private IndexerParseResult _parseResultMulti;
|
||||
private IndexerParseResult _parseResultSingle;
|
||||
private QualityModel _upgradableQuality;
|
||||
private QualityModel _notupgradableQuality;
|
||||
private Series _fakeSeries;
|
||||
@ -45,7 +45,7 @@ public void Setup()
|
||||
.With(c => c.QualityProfile = new QualityProfile { Cutoff = Quality.Bluray1080p })
|
||||
.Build();
|
||||
|
||||
_parseResultMulti = new EpisodeParseResult
|
||||
_parseResultMulti = new IndexerParseResult
|
||||
{
|
||||
Series = _fakeSeries,
|
||||
Quality = new QualityModel(Quality.DVD, true),
|
||||
@ -54,7 +54,7 @@ public void Setup()
|
||||
Episodes = doubleEpisodeList
|
||||
};
|
||||
|
||||
_parseResultSingle = new EpisodeParseResult
|
||||
_parseResultSingle = new IndexerParseResult
|
||||
{
|
||||
Series = _fakeSeries,
|
||||
Quality = new QualityModel(Quality.DVD, true),
|
||||
|
@ -116,7 +116,7 @@ public void is_in_queue_should_find_if_exact_episode_is_in_queue()
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int> { 5 },
|
||||
@ -136,7 +136,7 @@ public void is_in_queue_should_find_if_exact_daily_episode_is_in_queue()
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
Quality = new QualityModel { Quality = Quality.Bluray720p, Proper = false },
|
||||
AirDate = new DateTime(2011, 12, 01),
|
||||
@ -155,7 +155,7 @@ public void is_in_queue_should_find_if_exact_full_season_release_is_in_queue()
|
||||
WithFullQueue();
|
||||
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
Quality = new QualityModel { Quality = Quality.Bluray720p, Proper = false },
|
||||
FullSeason = true,
|
||||
@ -184,7 +184,7 @@ public void IsInQueue_should_not_find_diffrent_episode_queue(int season, int[] e
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int>(episodes),
|
||||
@ -213,7 +213,7 @@ public void IsInQueue_should_find_same_or_lower_quality_episode_queue(int season
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int>(episodes),
|
||||
@ -240,7 +240,7 @@ public void IsInQueue_should_find_items_marked_as_duplicate(int season, int[] ep
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int>(episodes),
|
||||
@ -267,7 +267,7 @@ public void IsInQueue_should_find_double_episodes_(int season, int[] episodes, s
|
||||
{
|
||||
WithFullQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int>(episodes),
|
||||
@ -286,7 +286,7 @@ public void IsInQueue_should_return_false_if_queue_is_empty()
|
||||
{
|
||||
WithEmptyQueue();
|
||||
|
||||
var parseResult = new EpisodeParseResult
|
||||
var parseResult = new IndexerParseResult
|
||||
{
|
||||
EpisodeTitle = "Title",
|
||||
EpisodeNumbers = new List<int> { 1 },
|
||||
|
@ -15,7 +15,7 @@ namespace NzbDrone.Core.Test.Download
|
||||
[TestFixture]
|
||||
public class DownloadServiceFixture : CoreTest<DownloadService>
|
||||
{
|
||||
private EpisodeParseResult _parseResult;
|
||||
private IndexerParseResult _parseResult;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
@ -29,7 +29,7 @@ public void Setup()
|
||||
.All().With(s => s.SeriesId = 5)
|
||||
.Build().ToList();
|
||||
|
||||
_parseResult = Builder<EpisodeParseResult>.CreateNew()
|
||||
_parseResult = Builder<IndexerParseResult>.CreateNew()
|
||||
.With(c => c.Quality = new QualityModel(Quality.DVD, false))
|
||||
.With(c => c.Series = Builder<Series>.CreateNew().Build())
|
||||
.With(c => c.EpisodeNumbers = new List<int> { 2 })
|
||||
|
@ -18,7 +18,7 @@ public class EpisodeParseResultTest : CoreTest
|
||||
[Test]
|
||||
public void tostring_single_season_episode()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.EpisodeNumbers = new List<int> { 3 };
|
||||
@ -33,7 +33,7 @@ public void tostring_single_season_episode()
|
||||
[Test]
|
||||
public void tostring_single_season_episode_proper()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.EpisodeNumbers = new List<int> { 3 };
|
||||
@ -48,7 +48,7 @@ public void tostring_single_season_episode_proper()
|
||||
[Test]
|
||||
public void tostring_multi_season_episode()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.EpisodeNumbers = new List<int> { 3, 4, 5 };
|
||||
@ -63,7 +63,7 @@ public void tostring_multi_season_episode()
|
||||
[Test]
|
||||
public void tostring_multi_season_episode_proper()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.EpisodeNumbers = new List<int> { 3, 4, 5 };
|
||||
@ -79,7 +79,7 @@ public void tostring_multi_season_episode_proper()
|
||||
[Test]
|
||||
public void tostring_full_season()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.FullSeason = true;
|
||||
@ -94,7 +94,7 @@ public void tostring_full_season()
|
||||
[Test]
|
||||
public void tostring_full_season_proper()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.FullSeason = true;
|
||||
@ -108,7 +108,7 @@ public void tostring_full_season_proper()
|
||||
[Test]
|
||||
public void tostring_daily_show()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.FullSeason = true;
|
||||
@ -122,7 +122,7 @@ public void tostring_daily_show()
|
||||
[Test]
|
||||
public void tostring_daily_show_proper()
|
||||
{
|
||||
var parseResult = new EpisodeParseResult();
|
||||
var parseResult = new IndexerParseResult();
|
||||
parseResult.SeriesTitle = "My Series";
|
||||
parseResult.SeasonNumber = 12;
|
||||
parseResult.FullSeason = true;
|
||||
@ -162,7 +162,7 @@ public void create_proper_sab_titles(int seasons, int[] episodes, string title,
|
||||
.With(e => e.Title = title)
|
||||
.Build());
|
||||
|
||||
var parsResult = new EpisodeParseResult()
|
||||
var parsResult = new IndexerParseResult()
|
||||
{
|
||||
AirDate = DateTime.Now,
|
||||
EpisodeNumbers = episodes.ToList(),
|
||||
@ -184,7 +184,7 @@ public string create_proper_sab_season_title(bool proper)
|
||||
.With(c => c.Title = "My Series Name")
|
||||
.Build();
|
||||
|
||||
var parsResult = new EpisodeParseResult()
|
||||
var parsResult = new IndexerParseResult()
|
||||
{
|
||||
AirDate = DateTime.Now,
|
||||
Quality = new QualityModel(Quality.Bluray720p, proper),
|
||||
@ -210,7 +210,7 @@ public string create_proper_sab_daily_titles(bool proper)
|
||||
.With(e => e.Title = "My Episode Title")
|
||||
.Build();
|
||||
|
||||
var parsResult = new EpisodeParseResult
|
||||
var parsResult = new IndexerParseResult
|
||||
{
|
||||
AirDate = new DateTime(2011, 12, 1),
|
||||
Quality = new QualityModel(Quality.Bluray720p, proper),
|
||||
@ -238,7 +238,7 @@ public void should_not_repeat_the_same_episode_title()
|
||||
.With(e => e.Title = "My Episode Title (2)")
|
||||
.Build();
|
||||
|
||||
var parsResult = new EpisodeParseResult
|
||||
var parsResult = new IndexerParseResult
|
||||
{
|
||||
AirDate = DateTime.Now,
|
||||
EpisodeNumbers = new List<int> { 10, 11 },
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
namespace NzbDrone.Core.Test.ParserTests
|
||||
{
|
||||
|
||||
|
||||
[TestFixture]
|
||||
public class ParserFixture : CoreTest
|
||||
{
|
||||
@ -78,7 +78,7 @@ public class ParserFixture : CoreTest
|
||||
[TestCase("Portlandia.S03E10.Alexandra.720p.WEB-DL.AAC2.0.H.264-CROM.mkv", "Portlandia", 3, 10)]
|
||||
public void ParseTitle_single(string postTitle, string title, int seasonNumber, int episodeNumber)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<IndexerParseResult>(postTitle);
|
||||
result.Should().NotBeNull();
|
||||
result.EpisodeNumbers.Should().HaveCount(1);
|
||||
result.SeasonNumber.Should().Be(seasonNumber);
|
||||
@ -113,7 +113,7 @@ public void PathParse_tests(string path, int season, int episode)
|
||||
public void unparsable_path_should_report_the_path()
|
||||
{
|
||||
Parser.ParsePath("C:\\").Should().BeNull();
|
||||
|
||||
|
||||
MockedRestProvider.Verify(c => c.PostData(It.IsAny<string>(), It.IsAny<ParseErrorReport>()), Times.Exactly(2));
|
||||
|
||||
ExceptionVerification.IgnoreWarns();
|
||||
@ -124,7 +124,7 @@ public void unparsable_title_should_report_title()
|
||||
{
|
||||
const string TITLE = "SOMETHING";
|
||||
|
||||
Parser.ParseTitle(TITLE).Should().BeNull();
|
||||
Parser.ParseTitle<ParseResult>(TITLE).Should().BeNull();
|
||||
|
||||
MockedRestProvider.Verify(c => c.PostData(It.IsAny<string>(), It.Is<ParseErrorReport>(r => r.Title == TITLE)), Times.Once());
|
||||
|
||||
@ -144,7 +144,7 @@ public void unparsable_title_should_report_title()
|
||||
[TestCase("S07E22 - 7x23 - And Lots of Security.. [HDTV-720p].mkv", "", 7, new[] { 22, 23 })]
|
||||
[TestCase("2x04x05.720p.BluRay-FUTV", "", 2, new[] { 4, 5 })]
|
||||
[TestCase("S02E04E05.720p.BluRay-FUTV", "", 2, new[] { 4, 5 })]
|
||||
[TestCase("S02E03-04-05.720p.BluRay-FUTV", "", 2, new[] { 3,4,5 })]
|
||||
[TestCase("S02E03-04-05.720p.BluRay-FUTV", "", 2, new[] { 3, 4, 5 })]
|
||||
[TestCase("Breakout.Kings.S02E09-E10.HDTV.x264-ASAP", "Breakout Kings", 2, new[] { 9, 10 })]
|
||||
[TestCase("Breakout Kings - 2x9-2x10 - Served Cold [SDTV] ", "Breakout Kings", 2, new[] { 9, 10 })]
|
||||
[TestCase("Breakout Kings - 2x09-2x10 - Served Cold [SDTV] ", "Breakout Kings", 2, new[] { 9, 10 })]
|
||||
@ -152,7 +152,7 @@ public void unparsable_title_should_report_title()
|
||||
[TestCase("Hell.on.Wheels.S02E09-E10.720p.HDTV.x264-EVOLVE", "Hell on Wheels", 2, new[] { 9, 10 })]
|
||||
public void TitleParse_multi(string postTitle, string title, int season, int[] episodes)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
result.SeasonNumber.Should().Be(season);
|
||||
result.EpisodeNumbers.Should().BeEquivalentTo(episodes);
|
||||
result.CleanTitle.Should().Be(Parser.NormalizeTitle(title));
|
||||
@ -167,12 +167,12 @@ public void TitleParse_multi(string postTitle, string title, int season, int[] e
|
||||
[TestCase("2011.01.10 - Denis Leary - HD TV.mkv", "", 2011, 1, 10)]
|
||||
[TestCase("2011.03.13 - Denis Leary - HD TV.mkv", "", 2011, 3, 13)]
|
||||
[TestCase("The Tonight Show with Jay Leno - 2011-06-16 - Larry David, \"Bachelorette\" Ashley Hebert, Pitbull with Ne-Yo", "The Tonight Show with Jay Leno", 2011, 6, 16)]
|
||||
[TestCase("2020.NZ.2012.16.02.PDTV.XviD-C4TV","2020nz", 2012,2, 16)]
|
||||
[TestCase("2020.NZ.2012.13.02.PDTV.XviD-C4TV","2020nz", 2012,2, 13)]
|
||||
[TestCase("2020.NZ.2011.12.02.PDTV.XviD-C4TV","2020nz", 2011,12, 2)]
|
||||
[TestCase("2020.NZ.2012.16.02.PDTV.XviD-C4TV", "2020nz", 2012, 2, 16)]
|
||||
[TestCase("2020.NZ.2012.13.02.PDTV.XviD-C4TV", "2020nz", 2012, 2, 13)]
|
||||
[TestCase("2020.NZ.2011.12.02.PDTV.XviD-C4TV", "2020nz", 2011, 12, 2)]
|
||||
public void parse_daily_episodes(string postTitle, string title, int year, int month, int day)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
var airDate = new DateTime(year, month, day);
|
||||
result.Should().NotBeNull();
|
||||
result.CleanTitle.Should().Be(Parser.NormalizeTitle(title));
|
||||
@ -186,7 +186,7 @@ public void parse_daily_should_fail_if_episode_is_far_in_future()
|
||||
{
|
||||
var title = string.Format("{0:yyyy.MM.dd} - Denis Leary - HD TV.mkv", DateTime.Now.AddDays(2));
|
||||
|
||||
Parser.ParseTitle(title).Should().BeNull();
|
||||
Parser.ParseTitle<ParseResult>(title).Should().BeNull();
|
||||
}
|
||||
|
||||
|
||||
@ -197,7 +197,7 @@ public void parse_daily_should_fail_if_episode_is_far_in_future()
|
||||
[TestCase("Adventure Time S02 720p HDTV x264 CRON", "Adventure Time", 2)]
|
||||
public void full_season_release_parse(string postTitle, string title, int season)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
result.SeasonNumber.Should().Be(season);
|
||||
result.CleanTitle.Should().Be(Parser.NormalizeTitle(title));
|
||||
result.EpisodeNumbers.Count.Should().Be(0);
|
||||
@ -338,7 +338,7 @@ public void parse_language(string postTitle, LanguageType language)
|
||||
[TestCase("Doctor Who Confidential Season 3", "Doctor Who Confidential", 3)]
|
||||
public void parse_season_info(string postTitle, string seriesName, int seasonNumber)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
|
||||
result.CleanTitle.Should().Be(Parser.NormalizeTitle(seriesName));
|
||||
result.SeasonNumber.Should().Be(seasonNumber);
|
||||
@ -364,7 +364,7 @@ public void parse_size(string sizeString, long expectedSize)
|
||||
[TestCase("Instant Star S03 EXTRAS DVDRip XviD OSiTV")]
|
||||
public void parse_season_extras(string postTitle)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
|
||||
result.Should().BeNull();
|
||||
}
|
||||
@ -374,7 +374,7 @@ public void parse_season_extras(string postTitle)
|
||||
[TestCase("CSI.S11.SUBPACK.DVDRip.XviD-REWARD")]
|
||||
public void parse_season_subpack(string postTitle)
|
||||
{
|
||||
var result = Parser.ParseTitle(postTitle);
|
||||
var result = Parser.ParseTitle<ParseResult>(postTitle);
|
||||
|
||||
result.Should().BeNull();
|
||||
}
|
||||
@ -382,22 +382,11 @@ public void parse_season_subpack(string postTitle)
|
||||
[TestCase("Fussball Bundesliga 10e2011e30 Spieltag FC Bayern Muenchen vs Bayer 04 Leverkusen German WS dTV XviD WoGS")]
|
||||
public void unparsable_should_log_error_but_not_throw(string title)
|
||||
{
|
||||
Parser.ParseTitle(title);
|
||||
Parser.ParseTitle<ParseResult>(title);
|
||||
ExceptionVerification.IgnoreWarns();
|
||||
ExceptionVerification.ExpectedErrors(1);
|
||||
}
|
||||
|
||||
[TestCase("Castle.2009.S01E14.English.HDTV.XviD-LOL", "LOL")]
|
||||
[TestCase("Castle 2009 S01E14 English HDTV XviD LOL", "LOL")]
|
||||
[TestCase("Acropolis Now S05 EXTRAS DVDRip XviD RUNNER", "RUNNER")]
|
||||
[TestCase("Punky.Brewster.S01.EXTRAS.DVDRip.XviD-RUNNER", "RUNNER")]
|
||||
[TestCase("2020.NZ.2011.12.02.PDTV.XviD-C4TV", "C4TV")]
|
||||
[TestCase("The.Office.S03E115.DVDRip.XviD-OSiTV", "OSiTV")]
|
||||
public void parse_releaseGroup(string title, string expected)
|
||||
{
|
||||
Parser.ParseReleaseGroup(title).Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("[112461]-[FULL]-[#a.b.teevee@EFNet]-[ 666.Park.Avenue.S01E03.720p.HDTV.X264-DIMENSION ]-[02/31] - \"the.devils.address.103.720p-dimension.par2\" yEnc", "666.Park.Avenue.S01E03.720p.HDTV.X264-DIMENSION")]
|
||||
[TestCase("[112438]-[FULL]-[#a.b.teevee@EFNet]-[ Downton_Abbey.3x05.HDTV_x264-FoV ]-[01/26] - \"downton_abbey.3x05.hdtv_x264-fov.nfo\" yEnc", "Downton_Abbey.3x05.HDTV_x264-FoV")]
|
||||
[TestCase("[ 21154 ] - [ TrollHD ] - [ 00/73 ] - \"MythBusters S03E20 Escape Slide Parachute 1080i HDTV-UPSCALE DD5.1 MPEG2-TrollHD.nzb\" yEnc", "MythBusters S03E20 Escape Slide Parachute 1080i HDTV-UPSCALE DD5.1 MPEG2-TrollHD.nzb")]
|
||||
@ -409,7 +398,7 @@ public void parse_header(string title, string expected)
|
||||
[TestCase("password - \"bdc435cb-93c4-4902-97ea-ca00568c3887.337\" yEnc")]
|
||||
public void should_not_parse_encypted_posts(string title)
|
||||
{
|
||||
Parser.ParseTitle(title).Should().BeNull();
|
||||
Parser.ParseTitle<ParseResult>(title).Should().BeNull();
|
||||
ExceptionVerification.IgnoreWarns();
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public void import_new_file_should_succeed()
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, newFile);
|
||||
@ -95,7 +95,7 @@ public void import_new_file_with_better_same_quality_should_succeed(Quality curr
|
||||
With80MBFile();
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, newFile);
|
||||
@ -125,7 +125,7 @@ public void import_new_file_episode_has_same_or_better_quality_should_skip(strin
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -195,7 +195,7 @@ public void import_file_with_no_episode_in_db_should_skip()
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(c => c.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>()))
|
||||
.Setup(c => c.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>()))
|
||||
.Returns(new List<Episode>());
|
||||
|
||||
|
||||
@ -226,7 +226,7 @@ public void import_new_file_episode_has_better_quality_than_existing(string file
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -258,7 +258,7 @@ public void import_new_multi_part_file_episode_has_equal_or_better_quality_than_
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(fakeEpisodes);
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(fakeEpisodes);
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -291,7 +291,7 @@ public void skip_import_new_multi_part_file_episode_existing_has_better_quality(
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(fakeEpisodes);
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(fakeEpisodes);
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -329,7 +329,7 @@ public void import_new_multi_part_file_episode_replace_two_files()
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode1, fakeEpisode2 });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode1, fakeEpisode2 });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -358,7 +358,7 @@ public void should_import_new_episode_no_existing_episode_file()
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(fakeSeries, fileName);
|
||||
@ -380,7 +380,7 @@ public void should_set_parseResult_SceneSource_if_not_in_series_Path()
|
||||
|
||||
With80MBFile();
|
||||
|
||||
Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>()))
|
||||
Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>()))
|
||||
.Returns(new List<Episode>());
|
||||
|
||||
Mocker.GetMock<DiskProvider>().Setup(s => s.IsChildOfPath(path, series.Path))
|
||||
@ -388,7 +388,7 @@ public void should_set_parseResult_SceneSource_if_not_in_series_Path()
|
||||
|
||||
Mocker.Resolve<DiskScanProvider>().ImportFile(series, path);
|
||||
|
||||
Mocker.Verify<IEpisodeService>(s => s.GetEpisodesByParseResult(It.Is<EpisodeParseResult>(p => p.SceneSource)), Times.Once());
|
||||
Mocker.Verify<IEpisodeService>(s => s.GetEpisodesByParseResult(It.Is<IndexerParseResult>(p => p.SceneSource)), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -403,7 +403,7 @@ public void should_not_set_parseResult_SceneSource_if_in_series_Path()
|
||||
|
||||
With80MBFile();
|
||||
|
||||
Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>()))
|
||||
Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>()))
|
||||
.Returns(new List<Episode>());
|
||||
|
||||
Mocker.GetMock<DiskProvider>().Setup(s => s.IsChildOfPath(path, series.Path))
|
||||
@ -411,7 +411,7 @@ public void should_not_set_parseResult_SceneSource_if_in_series_Path()
|
||||
|
||||
Mocker.Resolve<DiskScanProvider>().ImportFile(series, path);
|
||||
|
||||
Mocker.Verify<IEpisodeService>(s => s.GetEpisodesByParseResult(It.Is<EpisodeParseResult>(p => p.SceneSource == false)), Times.Once());
|
||||
Mocker.Verify<IEpisodeService>(s => s.GetEpisodesByParseResult(It.Is<IndexerParseResult>(p => p.SceneSource == false)), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@ -455,7 +455,7 @@ public void should_import_if_file_size_is_under_70MB_but_runTime_over_3_minutes(
|
||||
.Returns(600);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(_series, path);
|
||||
|
||||
@ -482,7 +482,7 @@ public void should_import_if_file_size_is_over_70MB_but_runTime_under_3_minutes(
|
||||
.Returns(60);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(_series, path);
|
||||
|
||||
@ -513,7 +513,7 @@ public void should_import_special_even_if_file_size_is_under_70MB_and_runTime_un
|
||||
.Returns(60);
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<EpisodeParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
.Setup(e => e.GetEpisodesByParseResult(It.IsAny<IndexerParseResult>())).Returns(new List<Episode> { fakeEpisode });
|
||||
|
||||
var result = Mocker.Resolve<DiskScanProvider>().ImportFile(_series, path);
|
||||
|
||||
|
@ -6,7 +6,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
{
|
||||
public class DownloadDecision
|
||||
{
|
||||
public EpisodeParseResult ParseResult { get; private set; }
|
||||
public IndexerParseResult ParseResult { get; private set; }
|
||||
public IEnumerable<string> Rejections { get; private set; }
|
||||
|
||||
public bool Approved
|
||||
@ -17,14 +17,14 @@ public bool Approved
|
||||
}
|
||||
}
|
||||
|
||||
public DownloadDecision(EpisodeParseResult parseResult, params string[] rejections)
|
||||
public DownloadDecision(IndexerParseResult parseResult, params string[] rejections)
|
||||
{
|
||||
ParseResult = parseResult;
|
||||
Rejections = rejections.ToList();
|
||||
}
|
||||
|
||||
|
||||
public static EpisodeParseResult PickBestReport(IEnumerable<DownloadDecision> downloadDecisions)
|
||||
public static IndexerParseResult PickBestReport(IEnumerable<DownloadDecision> downloadDecisions)
|
||||
{
|
||||
var reports = downloadDecisions
|
||||
.Where(c => c.Approved)
|
||||
|
@ -8,8 +8,8 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
{
|
||||
public interface IMakeDownloadDecision
|
||||
{
|
||||
IEnumerable<DownloadDecision> GetRssDecision(IEnumerable<EpisodeParseResult> episodeParseResults);
|
||||
IEnumerable<DownloadDecision> GetSearchDecision(IEnumerable<EpisodeParseResult> episodeParseResult, SearchDefinitionBase searchDefinitionBase);
|
||||
IEnumerable<DownloadDecision> GetRssDecision(IEnumerable<IndexerParseResult> episodeParseResults);
|
||||
IEnumerable<DownloadDecision> GetSearchDecision(IEnumerable<IndexerParseResult> episodeParseResult, SearchDefinitionBase searchDefinitionBase);
|
||||
}
|
||||
|
||||
public class DownloadDecisionMaker : IMakeDownloadDecision
|
||||
@ -21,7 +21,7 @@ public DownloadDecisionMaker(IEnumerable<IRejectWithReason> specifications)
|
||||
_specifications = specifications;
|
||||
}
|
||||
|
||||
public IEnumerable<DownloadDecision> GetRssDecision(IEnumerable<EpisodeParseResult> episodeParseResults)
|
||||
public IEnumerable<DownloadDecision> GetRssDecision(IEnumerable<IndexerParseResult> episodeParseResults)
|
||||
{
|
||||
foreach (var parseResult in episodeParseResults)
|
||||
{
|
||||
@ -31,7 +31,7 @@ public IEnumerable<DownloadDecision> GetRssDecision(IEnumerable<EpisodeParseResu
|
||||
|
||||
}
|
||||
|
||||
public IEnumerable<DownloadDecision> GetSearchDecision(IEnumerable<EpisodeParseResult> episodeParseResults, SearchDefinitionBase searchDefinitionBase)
|
||||
public IEnumerable<DownloadDecision> GetSearchDecision(IEnumerable<IndexerParseResult> episodeParseResults, SearchDefinitionBase searchDefinitionBase)
|
||||
{
|
||||
foreach (var parseResult in episodeParseResults)
|
||||
{
|
||||
@ -45,19 +45,19 @@ public IEnumerable<DownloadDecision> GetSearchDecision(IEnumerable<EpisodeParseR
|
||||
}
|
||||
|
||||
|
||||
private IEnumerable<string> GetGeneralRejectionReasons(EpisodeParseResult episodeParseResult)
|
||||
private IEnumerable<string> GetGeneralRejectionReasons(IndexerParseResult indexerParseResult)
|
||||
{
|
||||
return _specifications
|
||||
.OfType<IDecisionEngineSpecification>()
|
||||
.Where(spec => !spec.IsSatisfiedBy(episodeParseResult))
|
||||
.Where(spec => !spec.IsSatisfiedBy(indexerParseResult))
|
||||
.Select(spec => spec.RejectionReason);
|
||||
}
|
||||
|
||||
private IEnumerable<string> GetSearchRejectionReasons(EpisodeParseResult episodeParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
private IEnumerable<string> GetSearchRejectionReasons(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
{
|
||||
return _specifications
|
||||
.OfType<IDecisionEngineSearchSpecification>()
|
||||
.Where(spec => !spec.IsSatisfiedBy(episodeParseResult, searchDefinitionBase))
|
||||
.Where(spec => !spec.IsSatisfiedBy(indexerParseResult, searchDefinitionBase))
|
||||
.Select(spec => spec.RejectionReason);
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,6 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
{
|
||||
public interface IDecisionEngineSpecification : IRejectWithReason
|
||||
{
|
||||
bool IsSatisfiedBy(EpisodeParseResult subject);
|
||||
bool IsSatisfiedBy(IndexerParseResult subject);
|
||||
}
|
||||
}
|
@ -23,7 +23,7 @@ public string RejectionReason
|
||||
get { return "File size too big or small"; }
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
_logger.Trace("Beginning size check for: {0}", subject);
|
||||
|
||||
|
@ -25,7 +25,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
_logger.Trace("Beginning release group check for: {0}", subject);
|
||||
|
||||
|
@ -22,7 +22,7 @@ public string RejectionReason
|
||||
}
|
||||
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
if (!subject.Series.CustomStartDate.HasValue)
|
||||
{
|
||||
|
@ -20,7 +20,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
_logger.Trace("Checking if report meets language requirements. {0}", subject.Language);
|
||||
if (subject.Language != LanguageType.English)
|
||||
|
@ -26,7 +26,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
var series = _seriesRepository.GetByTitle(subject.CleanTitle);
|
||||
|
||||
|
@ -21,7 +21,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
return !_downloadClientProvider.GetDownloadClient().IsInQueue(subject);
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
_logger.Trace("Checking if report meets quality requirements. {0}", subject.Quality);
|
||||
if (!subject.Series.QualityProfile.Allowed.Contains(subject.Quality.Quality))
|
||||
|
@ -24,7 +24,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
_logger.Trace("Checking if report meets retention requirements. {0}", subject.Age);
|
||||
if (_configService.Retention > 0 && subject.Age > _configService.Retention)
|
||||
|
@ -23,7 +23,7 @@ public string RejectionReason
|
||||
return "Episode doesn't match";
|
||||
}
|
||||
}
|
||||
public bool IsSatisfiedBy(EpisodeParseResult episodeParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
public bool IsSatisfiedBy(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
{
|
||||
var dailySearchSpec = searchDefinitionBase as DailyEpisodeSearchDefinition;
|
||||
|
||||
@ -31,7 +31,7 @@ public bool IsSatisfiedBy(EpisodeParseResult episodeParseResult, SearchDefinitio
|
||||
|
||||
var episode = _episodeService.GetEpisode(dailySearchSpec.SeriesId, dailySearchSpec.Airtime);
|
||||
|
||||
if (!episodeParseResult.AirDate.HasValue || episodeParseResult.AirDate.Value != episode.AirDate.Value)
|
||||
if (!indexerParseResult.AirDate.HasValue || indexerParseResult.AirDate.Value != episode.AirDate.Value)
|
||||
{
|
||||
_logger.Trace("Episode AirDate does not match searched episode number, skipping.");
|
||||
return false;
|
||||
|
@ -6,6 +6,6 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.Search
|
||||
{
|
||||
public interface IDecisionEngineSearchSpecification : IRejectWithReason
|
||||
{
|
||||
bool IsSatisfiedBy(EpisodeParseResult subject, SearchDefinitionBase searchDefinitionBase);
|
||||
bool IsSatisfiedBy(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase);
|
||||
}
|
||||
}
|
@ -21,12 +21,12 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSatisfiedBy(EpisodeParseResult episodeParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
public bool IsSatisfiedBy(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
{
|
||||
var singleEpisodeSpec = searchDefinitionBase as SeasonSearchDefinition;
|
||||
if (singleEpisodeSpec == null) return true;
|
||||
|
||||
if (singleEpisodeSpec.SeasonNumber != episodeParseResult.SeasonNumber)
|
||||
if (singleEpisodeSpec.SeasonNumber != indexerParseResult.SeasonNumber)
|
||||
{
|
||||
_logger.Trace("Season number does not match searched season number, skipping.");
|
||||
return false;
|
||||
|
@ -21,18 +21,18 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSatisfiedBy(EpisodeParseResult episodeParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
public bool IsSatisfiedBy(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase)
|
||||
{
|
||||
var singleEpisodeSpec = searchDefinitionBase as SingleEpisodeSearchDefinition;
|
||||
if (singleEpisodeSpec == null) return true;
|
||||
|
||||
if (singleEpisodeSpec.SeasonNumber != episodeParseResult.SeasonNumber)
|
||||
if (singleEpisodeSpec.SeasonNumber != indexerParseResult.SeasonNumber)
|
||||
{
|
||||
_logger.Trace("Season number does not match searched season number, skipping.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!episodeParseResult.EpisodeNumbers.Contains(singleEpisodeSpec.EpisodeNumber))
|
||||
if (!indexerParseResult.EpisodeNumbers.Contains(singleEpisodeSpec.EpisodeNumber))
|
||||
{
|
||||
_logger.Trace("Episode number does not match searched episode number, skipping.");
|
||||
return false;
|
||||
|
@ -25,7 +25,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
foreach (var file in subject.Episodes.Select(c => c.EpisodeFile).Where(c => c != null))
|
||||
{
|
||||
|
@ -25,7 +25,7 @@ public string RejectionReason
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
|
||||
public virtual bool IsSatisfiedBy(IndexerParseResult subject)
|
||||
{
|
||||
foreach (var episode in subject.Episodes)
|
||||
{
|
||||
|
@ -59,7 +59,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
||||
public virtual bool IsInQueue(IndexerParseResult newParseResult)
|
||||
{
|
||||
return !_upgradeHistorySpecification.IsSatisfiedBy(newParseResult);
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ public NzbgetProvider()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
||||
public virtual bool IsInQueue(IndexerParseResult newParseResult)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -18,7 +18,7 @@ public string Title
|
||||
set
|
||||
{
|
||||
_title = value;
|
||||
ParseResult = Parser.ParseTitle(value.Replace("DUPLICATE / ", String.Empty));
|
||||
ParseResult = Parser.ParseTitle<ParseResult>(value.Replace("DUPLICATE / ", String.Empty));
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,6 +26,6 @@ public string Title
|
||||
public Int32 FileSizeMb { get; set; }
|
||||
public Int32 RemainingSizeMb { get; set; }
|
||||
|
||||
public EpisodeParseResult ParseResult { private set; get; }
|
||||
public ParseResult ParseResult { private set; get; }
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
|
||||
try
|
||||
{
|
||||
//Todo: Allow full season releases
|
||||
if (Parser.ParseTitle(title).FullSeason)
|
||||
if (Parser.ParseTitle<ParseResult>(title).FullSeason)
|
||||
{
|
||||
logger.Info("Skipping Full Season Release: {0}", title);
|
||||
return false;
|
||||
@ -58,7 +58,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
|
||||
|
||||
var contents = String.Format("plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb={0}&nzbname={1}", filename, title);
|
||||
_diskProvider.WriteAllText(Path.Combine(_configService.DownloadClientTvDirectory, title + ".strm"), contents);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -68,7 +68,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
|
||||
}
|
||||
}
|
||||
|
||||
public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
||||
public virtual bool IsInQueue(IndexerParseResult newParseResult)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ public SabProvider()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
||||
public virtual bool IsInQueue(IndexerParseResult newParseResult)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -1,8 +1,6 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using NzbDrone.Core.Download.Clients.Sabnzbd.JsonConverters;
|
||||
using NzbDrone.Core.Helpers;
|
||||
using NzbDrone.Core.Model;
|
||||
|
||||
namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||
@ -27,7 +25,7 @@ public string Title
|
||||
set
|
||||
{
|
||||
_title = value;
|
||||
ParseResult = Parser.ParseTitle(value.Replace("DUPLICATE / ", String.Empty));
|
||||
ParseResult = Parser.ParseTitle<ParseResult>(value.Replace("DUPLICATE / ", String.Empty));
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,6 +43,6 @@ public string Title
|
||||
[JsonProperty(PropertyName = "nzo_id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
public EpisodeParseResult ParseResult { private set; get; }
|
||||
public ParseResult ParseResult { private set; get; }
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
public interface IDownloadService
|
||||
{
|
||||
bool DownloadReport(EpisodeParseResult parseResult);
|
||||
bool DownloadReport(IndexerParseResult parseResult);
|
||||
}
|
||||
|
||||
public class DownloadService : IDownloadService
|
||||
@ -32,7 +32,7 @@ public DownloadService(IProvideDownloadClient downloadClientProvider, IConfigSer
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public bool DownloadReport(EpisodeParseResult parseResult)
|
||||
public bool DownloadReport(IndexerParseResult parseResult)
|
||||
{
|
||||
var downloadTitle = parseResult.OriginalString;
|
||||
if (!_configService.DownloadClientUseSceneName)
|
||||
@ -54,7 +54,7 @@ public bool DownloadReport(EpisodeParseResult parseResult)
|
||||
return success;
|
||||
}
|
||||
|
||||
private static bool ContainsRecentEpisode(EpisodeParseResult parseResult)
|
||||
private static bool ContainsRecentEpisode(IndexerParseResult parseResult)
|
||||
{
|
||||
return parseResult.Episodes.Any(e => e.AirDate >= DateTime.Today.AddDays(-7));
|
||||
}
|
||||
|
@ -5,9 +5,9 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
public class EpisodeGrabbedEvent : IEvent
|
||||
{
|
||||
public EpisodeParseResult ParseResult { get; private set; }
|
||||
public IndexerParseResult ParseResult { get; private set; }
|
||||
|
||||
public EpisodeGrabbedEvent(EpisodeParseResult parseResult)
|
||||
public EpisodeGrabbedEvent(IndexerParseResult parseResult)
|
||||
{
|
||||
ParseResult = parseResult;
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
public interface IDownloadClient
|
||||
{
|
||||
bool IsInQueue(EpisodeParseResult newParseResult);
|
||||
bool IsInQueue(IndexerParseResult newParseResult);
|
||||
bool DownloadNzb(string url, string title, bool recentlyAired);
|
||||
}
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ public void Handle(EpisodeDownloadedEvent message)
|
||||
try
|
||||
{
|
||||
_logger.Trace("Sending download notification to {0}", Name);
|
||||
OnDownload(message.ParseResult.GetDownloadTitle(), message.ParseResult.Series);
|
||||
OnDownload(message.ParseResult.ToString(), message.ParseResult.Series);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -105,10 +105,10 @@ private List<DownloadDecision> PartialSeasonSearch(SeasonSearchDefinition search
|
||||
return spec;
|
||||
}
|
||||
|
||||
private List<DownloadDecision> Dispatch(Func<IIndexerBase, IEnumerable<EpisodeParseResult>> searchAction, SearchDefinitionBase definitionBase)
|
||||
private List<DownloadDecision> Dispatch(Func<IIndexerBase, IEnumerable<IndexerParseResult>> searchAction, SearchDefinitionBase definitionBase)
|
||||
{
|
||||
var indexers = _indexerService.GetAvailableIndexers();
|
||||
var parseResults = new List<EpisodeParseResult>();
|
||||
var parseResults = new List<IndexerParseResult>();
|
||||
|
||||
Parallel.ForEach(indexers, indexer =>
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
public interface IParseFeed
|
||||
{
|
||||
IEnumerable<EpisodeParseResult> Process(Stream source);
|
||||
IEnumerable<IndexerParseResult> Process(Stream source);
|
||||
}
|
||||
|
||||
public class BasicRssParser : IParseFeed
|
||||
@ -21,12 +21,12 @@ public BasicRssParser()
|
||||
_logger = LogManager.GetCurrentClassLogger();
|
||||
}
|
||||
|
||||
public IEnumerable<EpisodeParseResult> Process(Stream source)
|
||||
public IEnumerable<IndexerParseResult> Process(Stream source)
|
||||
{
|
||||
var reader = new SyndicationFeedXmlReader(source);
|
||||
var feed = SyndicationFeed.Load(reader).Items;
|
||||
|
||||
var result = new List<EpisodeParseResult>();
|
||||
var result = new List<IndexerParseResult>();
|
||||
|
||||
foreach (var syndicationItem in feed)
|
||||
{
|
||||
@ -66,26 +66,46 @@ protected virtual string GetNzbInfoUrl(SyndicationItem item)
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
protected virtual EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected virtual IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
return currentResult;
|
||||
}
|
||||
|
||||
private EpisodeParseResult ParseFeed(SyndicationItem item)
|
||||
private IndexerParseResult ParseFeed(SyndicationItem item)
|
||||
{
|
||||
var title = GetTitle(item);
|
||||
|
||||
var episodeParseResult = Parser.ParseTitle(title);
|
||||
var episodeParseResult = Parser.ParseTitle<IndexerParseResult>(title);
|
||||
if (episodeParseResult != null)
|
||||
{
|
||||
episodeParseResult.Age = DateTime.Now.Date.Subtract(item.PublishDate.Date).Days;
|
||||
episodeParseResult.OriginalString = title;
|
||||
episodeParseResult.SceneSource = true;
|
||||
episodeParseResult.ReleaseGroup = ParseReleaseGroup(title);
|
||||
}
|
||||
|
||||
_logger.Trace("Parsed: {0} from: {1}", episodeParseResult, item.Title.Text);
|
||||
|
||||
return PostProcessor(item, episodeParseResult);
|
||||
}
|
||||
|
||||
private static string ParseReleaseGroup(string title)
|
||||
{
|
||||
title = title.Trim();
|
||||
var index = title.LastIndexOf('-');
|
||||
|
||||
if (index < 0)
|
||||
index = title.LastIndexOf(' ');
|
||||
|
||||
if (index < 0)
|
||||
return String.Empty;
|
||||
|
||||
var group = title.Substring(index + 1);
|
||||
|
||||
if (group.Length == title.Length)
|
||||
return String.Empty;
|
||||
|
||||
return group;
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@ protected override string GetNzbInfoUrl(SyndicationItem item)
|
||||
return item.Id;
|
||||
}
|
||||
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -10,12 +10,12 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
public interface IFetchFeedFromIndexers
|
||||
{
|
||||
IList<EpisodeParseResult> FetchRss(IIndexerBase indexer);
|
||||
IList<IndexerParseResult> FetchRss(IIndexerBase indexer);
|
||||
|
||||
IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SeasonSearchDefinition searchDefinition);
|
||||
IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SingleEpisodeSearchDefinition searchDefinition);
|
||||
IList<EpisodeParseResult> Fetch(IIndexerBase indexer, PartialSeasonSearchDefinition searchDefinition);
|
||||
IList<EpisodeParseResult> Fetch(IIndexerBase indexer, DailyEpisodeSearchDefinition searchDefinition);
|
||||
IList<IndexerParseResult> Fetch(IIndexerBase indexer, SeasonSearchDefinition searchDefinition);
|
||||
IList<IndexerParseResult> Fetch(IIndexerBase indexer, SingleEpisodeSearchDefinition searchDefinition);
|
||||
IList<IndexerParseResult> Fetch(IIndexerBase indexer, PartialSeasonSearchDefinition searchDefinition);
|
||||
IList<IndexerParseResult> Fetch(IIndexerBase indexer, DailyEpisodeSearchDefinition searchDefinition);
|
||||
}
|
||||
|
||||
public class FetchFeedService : IFetchFeedFromIndexers
|
||||
@ -31,7 +31,7 @@ protected FetchFeedService(HttpProvider httpProvider, Logger logger)
|
||||
}
|
||||
|
||||
|
||||
public virtual IList<EpisodeParseResult> FetchRss(IIndexerBase indexer)
|
||||
public virtual IList<IndexerParseResult> FetchRss(IIndexerBase indexer)
|
||||
{
|
||||
_logger.Debug("Fetching feeds from " + indexer.Name);
|
||||
|
||||
@ -42,7 +42,7 @@ public virtual IList<EpisodeParseResult> FetchRss(IIndexerBase indexer)
|
||||
return result;
|
||||
}
|
||||
|
||||
public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SeasonSearchDefinition searchDefinition)
|
||||
public IList<IndexerParseResult> Fetch(IIndexerBase indexer, SeasonSearchDefinition searchDefinition)
|
||||
{
|
||||
_logger.Debug("Searching for {0}", searchDefinition);
|
||||
|
||||
@ -54,7 +54,7 @@ public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SeasonSearchDefinit
|
||||
return result;
|
||||
}
|
||||
|
||||
public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SingleEpisodeSearchDefinition searchDefinition)
|
||||
public IList<IndexerParseResult> Fetch(IIndexerBase indexer, SingleEpisodeSearchDefinition searchDefinition)
|
||||
{
|
||||
_logger.Debug("Searching for {0}", searchDefinition);
|
||||
|
||||
@ -67,7 +67,7 @@ public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, SingleEpisodeSearch
|
||||
|
||||
}
|
||||
|
||||
public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, PartialSeasonSearchDefinition searchDefinition)
|
||||
public IList<IndexerParseResult> Fetch(IIndexerBase indexer, PartialSeasonSearchDefinition searchDefinition)
|
||||
{
|
||||
_logger.Debug("Searching for {0}", searchDefinition);
|
||||
|
||||
@ -79,7 +79,7 @@ public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, PartialSeasonSearch
|
||||
return result;
|
||||
}
|
||||
|
||||
public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, DailyEpisodeSearchDefinition searchDefinition)
|
||||
public IList<IndexerParseResult> Fetch(IIndexerBase indexer, DailyEpisodeSearchDefinition searchDefinition)
|
||||
{
|
||||
_logger.Debug("Searching for {0}", searchDefinition);
|
||||
|
||||
@ -90,9 +90,9 @@ public IList<EpisodeParseResult> Fetch(IIndexerBase indexer, DailyEpisodeSearchD
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<EpisodeParseResult> Fetch(IIndexerBase indexer, IEnumerable<string> urls)
|
||||
private List<IndexerParseResult> Fetch(IIndexerBase indexer, IEnumerable<string> urls)
|
||||
{
|
||||
var result = new List<EpisodeParseResult>();
|
||||
var result = new List<IndexerParseResult>();
|
||||
|
||||
foreach (var url in urls)
|
||||
{
|
||||
|
@ -18,7 +18,7 @@ protected override string GetNzbInfoUrl(SyndicationItem item)
|
||||
return item.Id;
|
||||
}
|
||||
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -7,7 +7,7 @@ namespace NzbDrone.Core.Indexers.NzbClub
|
||||
{
|
||||
public class NzbClubParser : BasicRssParser
|
||||
{
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -18,7 +18,7 @@ protected override string GetNzbInfoUrl(SyndicationItem item)
|
||||
return item.Links[0].Uri.ToString();
|
||||
}
|
||||
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -6,7 +6,7 @@ namespace NzbDrone.Core.Indexers.NzbsRUs
|
||||
{
|
||||
public class NzbsrusParser : BasicRssParser
|
||||
{
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -19,9 +19,9 @@ public NzbxParser(Logger logger)
|
||||
_serializer = new JsonSerializer();
|
||||
}
|
||||
|
||||
public IEnumerable<EpisodeParseResult> Process(Stream source)
|
||||
public IEnumerable<IndexerParseResult> Process(Stream source)
|
||||
{
|
||||
var result = new List<EpisodeParseResult>();
|
||||
var result = new List<IndexerParseResult>();
|
||||
var jsonReader = new JsonTextReader(new StreamReader(source));
|
||||
var feed = _serializer.Deserialize<List<NzbxRecentItem>>(jsonReader);
|
||||
|
||||
@ -29,7 +29,7 @@ public IEnumerable<EpisodeParseResult> Process(Stream source)
|
||||
{
|
||||
try
|
||||
{
|
||||
var episodeParseResult = Parser.ParseTitle(item.Name);
|
||||
var episodeParseResult = Parser.ParseTitle<IndexerParseResult>(item.Name);
|
||||
if (episodeParseResult != null)
|
||||
{
|
||||
episodeParseResult.Age = DateTime.Now.Date.Subtract(item.PostDate).Days;
|
||||
|
@ -26,7 +26,7 @@ protected override string GetNzbInfoUrl(SyndicationItem item)
|
||||
return String.Empty;
|
||||
}
|
||||
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -65,7 +65,7 @@ public void Sync()
|
||||
|
||||
public interface IFetchAndParseRss
|
||||
{
|
||||
List<EpisodeParseResult> Fetch();
|
||||
List<IndexerParseResult> Fetch();
|
||||
}
|
||||
|
||||
public class FetchAndParseRssService : IFetchAndParseRss
|
||||
@ -79,9 +79,9 @@ public FetchAndParseRssService(IIndexerService indexerService, IFetchFeedFromInd
|
||||
_feedFetcher = feedFetcher;
|
||||
}
|
||||
|
||||
public List<EpisodeParseResult> Fetch()
|
||||
public List<IndexerParseResult> Fetch()
|
||||
{
|
||||
var result = new List<EpisodeParseResult>();
|
||||
var result = new List<IndexerParseResult>();
|
||||
|
||||
var indexers = _indexerService.GetAvailableIndexers();
|
||||
|
||||
|
@ -15,7 +15,7 @@ protected override string GetNzbInfoUrl(SyndicationItem item)
|
||||
return null;
|
||||
}
|
||||
|
||||
protected override EpisodeParseResult PostProcessor(SyndicationItem item, EpisodeParseResult currentResult)
|
||||
protected override IndexerParseResult PostProcessor(SyndicationItem item, IndexerParseResult currentResult)
|
||||
{
|
||||
if (currentResult != null)
|
||||
{
|
||||
|
@ -4,7 +4,6 @@
|
||||
using NLog;
|
||||
using NzbDrone.Common;
|
||||
using NzbDrone.Common.Eventing;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.MediaFiles.Events;
|
||||
using NzbDrone.Core.Organizer;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
@ -5,9 +5,9 @@ namespace NzbDrone.Core.MediaFiles.Events
|
||||
{
|
||||
public class EpisodeDownloadedEvent : IEvent
|
||||
{
|
||||
public EpisodeParseResult ParseResult { get; private set; }
|
||||
public FileNameParseResult ParseResult { get; private set; }
|
||||
|
||||
public EpisodeDownloadedEvent(EpisodeParseResult parseResult)
|
||||
public EpisodeDownloadedEvent(FileNameParseResult parseResult)
|
||||
{
|
||||
ParseResult = parseResult;
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
namespace NzbDrone.Core.Model
|
||||
{
|
||||
public class EpisodeParseResult
|
||||
public class ParseResult
|
||||
{
|
||||
public string SeriesTitle { get; set; }
|
||||
|
||||
@ -19,7 +19,6 @@ public string CleanTitle
|
||||
}
|
||||
}
|
||||
|
||||
public DownloadDecision Decision { get; set; }
|
||||
|
||||
public string EpisodeTitle { get; set; }
|
||||
|
||||
@ -33,24 +32,14 @@ public string CleanTitle
|
||||
|
||||
public LanguageType Language { get; set; }
|
||||
|
||||
public string NzbUrl { get; set; }
|
||||
|
||||
public string NzbInfoUrl { get; set; }
|
||||
|
||||
public string OriginalString { get; set; }
|
||||
|
||||
public Series Series { get; set; }
|
||||
|
||||
public String Indexer { get; set; }
|
||||
|
||||
public bool FullSeason { get; set; }
|
||||
|
||||
public long Size { get; set; }
|
||||
|
||||
public int Age { get; set; }
|
||||
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
public bool SceneSource { get; set; }
|
||||
|
||||
public IList<Episode> Episodes { get; set; }
|
||||
@ -74,8 +63,23 @@ public override string ToString()
|
||||
|
||||
return string.Format("{0} - {1} {2}", SeriesTitle, episodeString, Quality);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class IndexerParseResult : ParseResult
|
||||
{
|
||||
public DownloadDecision Decision { get; set; }
|
||||
|
||||
public string NzbUrl { get; set; }
|
||||
|
||||
public string NzbInfoUrl { get; set; }
|
||||
|
||||
public String Indexer { get; set; }
|
||||
|
||||
public int Age { get; set; }
|
||||
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
public string GetDownloadTitle()
|
||||
{
|
||||
var seriesTitle = FileNameBuilder.CleanFilename(Series.Title);
|
||||
@ -134,4 +138,10 @@ public string GetDownloadTitle()
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class FileNameParseResult :ParseResult
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -509,7 +509,7 @@
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ExternalNotification\ExternalNotificationDefinition.cs" />
|
||||
<Compile Include="Model\EpisodeParseResult.cs" />
|
||||
<Compile Include="Model\IndexerParseResult.cs" />
|
||||
<Compile Include="Model\EpisodeStatusType.cs" />
|
||||
<Compile Include="Download\Clients\Sabnzbd\SabPriorityType.cs" />
|
||||
<Compile Include="Model\SeasonParseResult.cs" />
|
||||
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
@ -6,9 +6,9 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using NLog;
|
||||
using NzbDrone.Common;
|
||||
using NzbDrone.Core.Qualities;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Qualities;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
|
||||
namespace NzbDrone.Core
|
||||
{
|
||||
@ -91,16 +91,16 @@ public static class Parser
|
||||
|
||||
private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_)(?<italian>ita|italian)|(?<german>german\b)|(?<flemish>flemish)|(?<greek>greek)(?:\W|_)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
internal static EpisodeParseResult ParsePath(string path)
|
||||
internal static FileNameParseResult ParsePath(string path)
|
||||
{
|
||||
var fileInfo = new FileInfo(path);
|
||||
|
||||
var result = ParseTitle(fileInfo.Name);
|
||||
var result = ParseTitle<FileNameParseResult>(fileInfo.Name);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
Logger.Trace("Attempting to parse episode info using full path. {0}", fileInfo.FullName);
|
||||
result = ParseTitle(fileInfo.FullName);
|
||||
result = ParseTitle<FileNameParseResult>(fileInfo.FullName);
|
||||
}
|
||||
|
||||
if (result != null)
|
||||
@ -115,7 +115,7 @@ internal static EpisodeParseResult ParsePath(string path)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static EpisodeParseResult ParseTitle(string title)
|
||||
internal static T ParseTitle<T>(string title) where T : ParseResult, new()
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -128,7 +128,7 @@ internal static EpisodeParseResult ParseTitle(string title)
|
||||
|
||||
if (match.Count != 0)
|
||||
{
|
||||
var result = ParseMatchCollection(match);
|
||||
var result = ParseMatchCollection<T>(match);
|
||||
if (result != null)
|
||||
{
|
||||
//Check if episode is in the future (most likley a parse error)
|
||||
@ -138,7 +138,6 @@ internal static EpisodeParseResult ParseTitle(string title)
|
||||
result.Language = ParseLanguage(title);
|
||||
result.Quality = ParseQuality(title);
|
||||
result.OriginalString = title;
|
||||
result.ReleaseGroup = ParseReleaseGroup(title);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -155,14 +154,14 @@ internal static EpisodeParseResult ParseTitle(string title)
|
||||
return null;
|
||||
}
|
||||
|
||||
private static EpisodeParseResult ParseMatchCollection(MatchCollection matchCollection)
|
||||
private static T ParseMatchCollection<T>(MatchCollection matchCollection) where T : ParseResult, new()
|
||||
{
|
||||
var seriesName = matchCollection[0].Groups["title"].Value.Replace('.', ' ');
|
||||
|
||||
int airyear;
|
||||
Int32.TryParse(matchCollection[0].Groups["airyear"].Value, out airyear);
|
||||
|
||||
EpisodeParseResult parsedEpisode;
|
||||
T parsedIndexer;
|
||||
|
||||
if (airyear < 1900)
|
||||
{
|
||||
@ -183,7 +182,7 @@ private static EpisodeParseResult ParseMatchCollection(MatchCollection matchColl
|
||||
if (seasons.Distinct().Count() > 1)
|
||||
return null;
|
||||
|
||||
parsedEpisode = new EpisodeParseResult
|
||||
parsedIndexer = new T
|
||||
{
|
||||
SeasonNumber = seasons.First(),
|
||||
EpisodeNumbers = new List<int>()
|
||||
@ -198,7 +197,7 @@ private static EpisodeParseResult ParseMatchCollection(MatchCollection matchColl
|
||||
{
|
||||
var first = Convert.ToInt32(episodeCaptures.First().Value);
|
||||
var last = Convert.ToInt32(episodeCaptures.Last().Value);
|
||||
parsedEpisode.EpisodeNumbers = Enumerable.Range(first, last - first + 1).ToList();
|
||||
parsedIndexer.EpisodeNumbers = Enumerable.Range(first, last - first + 1).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -207,7 +206,7 @@ private static EpisodeParseResult ParseMatchCollection(MatchCollection matchColl
|
||||
if (!String.IsNullOrWhiteSpace(matchCollection[0].Groups["extras"].Value))
|
||||
return null;
|
||||
|
||||
parsedEpisode.FullSeason = true;
|
||||
parsedIndexer.FullSeason = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -226,26 +225,26 @@ private static EpisodeParseResult ParseMatchCollection(MatchCollection matchColl
|
||||
airmonth = tempDay;
|
||||
}
|
||||
|
||||
parsedEpisode = new EpisodeParseResult
|
||||
{
|
||||
parsedIndexer = new T
|
||||
{
|
||||
AirDate = new DateTime(airyear, airmonth, airday).Date,
|
||||
};
|
||||
}
|
||||
|
||||
parsedEpisode.SeriesTitle = seriesName;
|
||||
parsedIndexer.SeriesTitle = seriesName;
|
||||
|
||||
Logger.Trace("Episode Parsed. {0}", parsedEpisode);
|
||||
Logger.Trace("Episode Parsed. {0}", parsedIndexer);
|
||||
|
||||
return parsedEpisode;
|
||||
return parsedIndexer;
|
||||
}
|
||||
|
||||
public static string ParseSeriesName(string title)
|
||||
{
|
||||
Logger.Trace("Parsing string '{0}'", title);
|
||||
|
||||
var parseResult = ParseTitle(title);
|
||||
var parseResult = ParseTitle<ParseResult>(title);
|
||||
|
||||
if(parseResult == null)
|
||||
if (parseResult == null)
|
||||
return NormalizeTitle(title);
|
||||
|
||||
return parseResult.CleanTitle;
|
||||
@ -309,7 +308,7 @@ internal static QualityModel ParseQuality(string name)
|
||||
return result;
|
||||
}
|
||||
|
||||
if(name.Contains("[WEBDL]"))
|
||||
if (name.Contains("[WEBDL]"))
|
||||
{
|
||||
result.Quality = Quality.WEBDL720p;
|
||||
return result;
|
||||
@ -327,7 +326,7 @@ internal static QualityModel ParseQuality(string name)
|
||||
|
||||
if (normalizedName.Contains("x264") || normalizedName.Contains("h264") || normalizedName.Contains("720p"))
|
||||
{
|
||||
if(normalizedName.Contains("1080p"))
|
||||
if (normalizedName.Contains("1080p"))
|
||||
{
|
||||
result.Quality = Quality.HDTV1080p;
|
||||
return result;
|
||||
@ -472,27 +471,7 @@ internal static LanguageType ParseLanguage(string title)
|
||||
return LanguageType.English;
|
||||
}
|
||||
|
||||
internal static string ParseReleaseGroup(string title)
|
||||
{
|
||||
Logger.Trace("Trying to parse release group for {0}", title);
|
||||
|
||||
title = title.Trim();
|
||||
var index = title.LastIndexOf('-');
|
||||
|
||||
if (index < 0)
|
||||
index = title.LastIndexOf(' ');
|
||||
|
||||
if (index < 0)
|
||||
return String.Empty;
|
||||
|
||||
var group = title.Substring(index + 1);
|
||||
|
||||
if (group.Length == title.Length)
|
||||
return String.Empty;
|
||||
|
||||
Logger.Trace("Release Group found: {0}", group);
|
||||
return group;
|
||||
}
|
||||
|
||||
public static string NormalizeTitle(string title)
|
||||
{
|
||||
@ -527,7 +506,7 @@ public static long GetReportSize(string sizeString)
|
||||
|
||||
internal static string ParseHeader(string header)
|
||||
{
|
||||
foreach(var regex in HeaderRegex)
|
||||
foreach (var regex in HeaderRegex)
|
||||
{
|
||||
var match = regex.Matches(header);
|
||||
|
||||
|
@ -155,7 +155,6 @@ public virtual EpisodeFile ImportFile(Series series, string filePath)
|
||||
episodeFile.Quality = parseResult.Quality;
|
||||
episodeFile.SeasonNumber = parseResult.SeasonNumber;
|
||||
episodeFile.SceneName = Path.GetFileNameWithoutExtension(filePath.NormalizePath());
|
||||
episodeFile.ReleaseGroup = parseResult.ReleaseGroup;
|
||||
|
||||
//Todo: We shouldn't actually import the file until we confirm its the only one we want.
|
||||
//Todo: Separate episodeFile creation from importing (pass file to import to import)
|
||||
|
@ -19,7 +19,7 @@ public interface IEpisodeService
|
||||
Episode GetEpisode(int seriesId, DateTime date);
|
||||
List<Episode> GetEpisodeBySeries(int seriesId);
|
||||
List<Episode> GetEpisodesBySeason(int seriesId, int seasonNumber);
|
||||
List<Episode> GetEpisodesByParseResult(EpisodeParseResult parseResult);
|
||||
List<Episode> GetEpisodesByParseResult(ParseResult parseResult);
|
||||
List<Episode> EpisodesWithoutFiles(bool includeSpecials);
|
||||
List<Episode> GetEpisodesByFileId(int episodeFileId);
|
||||
List<Episode> EpisodesWithFiles();
|
||||
@ -85,7 +85,7 @@ public List<Episode> GetEpisodesBySeason(int seriesId, int seasonNumber)
|
||||
return _episodeRepository.GetEpisodes(seriesId, seasonNumber);
|
||||
}
|
||||
|
||||
public List<Episode> GetEpisodesByParseResult(EpisodeParseResult parseResult)
|
||||
public List<Episode> GetEpisodesByParseResult(ParseResult parseResult)
|
||||
{
|
||||
var result = new List<Episode>();
|
||||
|
||||
@ -120,7 +120,10 @@ public List<Episode> GetEpisodesByParseResult(EpisodeParseResult parseResult)
|
||||
Episode episodeInfo = null;
|
||||
|
||||
if (parseResult.SceneSource && parseResult.Series.UseSceneNumbering)
|
||||
episodeInfo = _episodeRepository.GetEpisodeBySceneNumbering(parseResult.Series.Id, parseResult.SeasonNumber, episodeNumber);
|
||||
{
|
||||
episodeInfo = _episodeRepository.GetEpisodeBySceneNumbering(parseResult.Series.Id,
|
||||
parseResult.SeasonNumber, episodeNumber);
|
||||
}
|
||||
|
||||
if (episodeInfo == null)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user