From 65417bd8ec565eb020a924277a8e347217bffba2 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Thu, 2 Feb 2012 22:49:34 -0800 Subject: [PATCH] Fixed: Multipart episodes are now added to sab queue using single episode title only. --- NzbDrone.Core.Test/Files/Queue.txt | 21 ++++++++++++++++ ...deProviderTest_GetEpisodesByParseResult.cs | 11 +++++---- .../SabProviderTests/QueueFixture.cs | 24 ++++++++++++++++++- .../SabProviderTests/SabProviderTest.cs | 12 ++++------ NzbDrone.Core/Providers/EpisodeProvider.cs | 19 ++++++++++++--- 5 files changed, 70 insertions(+), 17 deletions(-) diff --git a/NzbDrone.Core.Test/Files/Queue.txt b/NzbDrone.Core.Test/Files/Queue.txt index b8edbc1ca..4d8fdaa6c 100644 --- a/NzbDrone.Core.Test/Files/Queue.txt +++ b/NzbDrone.Core.Test/Files/Queue.txt @@ -155,6 +155,27 @@ "unpackopts":"3", "verbosity":"" }, + { + "avg_age":"580d", + "cat":"tv", + "eta":"01:45 PM Mon 23 Jan", + "filename":"My Name Is Earl - 3x14-3x15 - I Won't Die With a Little Help from My Friends (1) + I Won't Die With a Little Help from My Friend [Bluray720p]", + "index":1, + "mb":"419.23", + "mbleft":"419.23", + "missing":0, + "msgid":5657628, + "nzo_id":"SABnzbd_nzo_dgrzts", + "percentage":"0", + "priority":"Normal", + "script":"None", + "size":"419 MB", + "sizeleft":"419 MB", + "status":"Queued", + "timeleft":"86:01:55", + "unpackopts":"3", + "verbosity":"" + }, { "status":"Paused", "index":1, diff --git a/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest_GetEpisodesByParseResult.cs b/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest_GetEpisodesByParseResult.cs index d41ef630f..28827e81f 100644 --- a/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest_GetEpisodesByParseResult.cs +++ b/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest_GetEpisodesByParseResult.cs @@ -41,14 +41,14 @@ namespace NzbDrone.Core.Test.ProviderTests fakeEpisode = Builder.CreateNew() .With(e => e.SeriesId = fakeSeries.SeriesId) - .With(e => e.Title = "Episode 1") + .With(e => e.Title = "Episode (1)") .Build(); fakeEpisode2 = Builder.CreateNew() .With(e => e.SeriesId = fakeSeries.SeriesId) .With(e => e.SeasonNumber = fakeEpisode.SeasonNumber) .With(e => e.EpisodeNumber = fakeEpisode.EpisodeNumber + 1) - .With(e => e.Title = "Episode 2") + .With(e => e.Title = "Episode (2)") .Build(); fakeDailyEpisode = Builder.CreateNew() @@ -137,6 +137,7 @@ namespace NzbDrone.Core.Test.ProviderTests VerifyEpisode(ep[0], fakeEpisode); VerifyEpisode(ep[1], fakeEpisode2); + parseResult.EpisodeTitle.Should().Be("Episode"); } @@ -155,7 +156,7 @@ namespace NzbDrone.Core.Test.ProviderTests var ep = episodeProvider.GetEpisodesByParseResult(parseResult,true); ep.Should().BeEmpty(); - Db.Fetch().Should().HaveCount(0); + Db.Fetch().Should().BeEmpty(); } @@ -208,7 +209,7 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] - public void GetEpisodeParseResult_should_return_multiple_titles_for_multiple_episodes() + public void GetEpisodeParseResult_should_return_single_title_for_multiple_episodes() { Db.Insert(fakeSeries); Db.Insert(fakeEpisode); @@ -229,7 +230,7 @@ namespace NzbDrone.Core.Test.ProviderTests VerifyEpisode(ep[0], fakeEpisode); VerifyEpisode(ep[1], fakeEpisode2); - parseResult.EpisodeTitle.Should().Be(fakeEpisode.Title + " + " + fakeEpisode2.Title); + parseResult.EpisodeTitle.Should().Be("Episode"); } [Test] diff --git a/NzbDrone.Core.Test/ProviderTests/SabProviderTests/QueueFixture.cs b/NzbDrone.Core.Test/ProviderTests/SabProviderTests/QueueFixture.cs index 099152db2..1d238d99d 100644 --- a/NzbDrone.Core.Test/ProviderTests/SabProviderTests/QueueFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/SabProviderTests/QueueFixture.cs @@ -94,7 +94,7 @@ namespace NzbDrone.Core.Test.ProviderTests.SabProviderTests var result = Mocker.Resolve().GetQueue(); - result.Should().HaveCount(6); + result.Should().HaveCount(7); } [Test] @@ -225,6 +225,28 @@ namespace NzbDrone.Core.Test.ProviderTests.SabProviderTests result.Should().BeTrue(); } + [TestCase(3, new[] { 14, 15 }, "My Name Is Earl", QualityTypes.Bluray720p, false)] + [TestCase(3, new[] { 15 }, "My Name Is Earl", QualityTypes.DVD, false)] + [TestCase(3, new[] { 14 }, "My Name Is Earl", QualityTypes.HDTV, false)] + [TestCase(3, new[] { 15, 16 }, "My Name Is Earl", QualityTypes.SDTV, false)] + public void IsInQueue_should_find_double_episodes_(int season, int[] episodes, string title, QualityTypes qualityType, bool proper) + { + WithFullQueue(); + + var parseResult = new EpisodeParseResult + { + EpisodeTitle = "Title", + EpisodeNumbers = new List(episodes), + SeasonNumber = season, + Quality = new Quality { QualityType = qualityType, Proper = proper }, + Series = new Series { Title = title, CleanTitle = Parser.NormalizeTitle(title) }, + }; + + var result = Mocker.Resolve().IsInQueue(parseResult); + + result.Should().BeTrue(); + } + [Test] public void IsInQueue_should_return_false_if_queue_is_empty() { diff --git a/NzbDrone.Core.Test/ProviderTests/SabProviderTests/SabProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/SabProviderTests/SabProviderTest.cs index 576ec8439..9eae13c6d 100644 --- a/NzbDrone.Core.Test/ProviderTests/SabProviderTests/SabProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/SabProviderTests/SabProviderTest.cs @@ -102,15 +102,11 @@ namespace NzbDrone.Core.Test.ProviderTests.SabProviderTests } - [TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, false, - "My Series Name - 1x2 - My Episode Title [DVD]")] - [TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, true, - "My Series Name - 1x2 - My Episode Title [DVD] [Proper]")] + [TestCase(1, new[] { 2 }, "My Episode Title", QualityTypes.DVD, 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 }, "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 create_proper_sab_titles(int seasons, int[] episodes, string title, QualityTypes quality, bool proper, string expected) diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 480645f39..67903794e 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using Ninject; using NLog; using NzbDrone.Core.Model; @@ -12,7 +13,12 @@ namespace NzbDrone.Core.Providers { public class EpisodeProvider { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + //this will remove (1),(2) from the end of multi part episodes. + private static readonly Regex multiPartCleanupRegex = new Regex(@"\(\d+\)$", RegexOptions.Compiled); + private readonly TvDbProvider _tvDbProvider; private readonly IDatabase _database; private readonly SeriesProvider _seriesProvider; @@ -213,8 +219,15 @@ namespace NzbDrone.Core.Providers if (episodeInfo != null) { result.Add(episodeInfo); - parseResult.EpisodeTitle += String.Format(" + {0}", episodeInfo.Title); - parseResult.EpisodeTitle = parseResult.EpisodeTitle.Trim('+', ' '); + + if (parseResult.EpisodeNumbers.Count == 1) + { + parseResult.EpisodeTitle = episodeInfo.Title.Trim(); + } + else + { + parseResult.EpisodeTitle = multiPartCleanupRegex.Replace(episodeInfo.Title, string.Empty).Trim(); + } } else { @@ -325,7 +338,7 @@ namespace NzbDrone.Core.Providers } _database.InsertMany(newList); - _database.UpdateMany(updateList); + _database.UpdateMany(updateList); Logger.Info("Finished episode refresh for series: {0}. Successful: {1} - Failed: {2} ", tvDbSeriesInfo.SeriesName, successCount, failCount);