Integrated scene name helper into episode search, series lookup

pull/3113/head
kay.one 14 years ago
parent f97209d476
commit d09a82a20f

@ -228,6 +228,7 @@ namespace NzbDrone.Core.Test
.Setup(c => c.GetEpisode(episode.EpisodeId)) .Setup(c => c.GetEpisode(episode.EpisodeId))
.Returns(episode); .Returns(episode);
var indexer1 = new Mock<IndexerBase>(); var indexer1 = new Mock<IndexerBase>();
indexer1.Setup(c => c.FetchEpisode(episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber)) indexer1.Setup(c => c.FetchEpisode(episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber))
.Returns(parseResults).Verifiable(); .Returns(parseResults).Verifiable();
@ -259,6 +260,54 @@ namespace NzbDrone.Core.Test
indexer2.VerifyAll(); indexer2.VerifyAll();
} }
[Test]
public void start_should_use_scene_name_to_search()
{
var parseResults = Builder<EpisodeParseResult>.CreateListOfSize(4)
.Build();
var episode = Builder<Episode>.CreateNew()
.With(c => c.Series = Builder<Series>.CreateNew().With(s => s.SeriesId = 71256).Build())
.With(c => c.SeasonNumber = 12)
.Build();
var mocker = new AutoMoqer(MockBehavior.Strict);
mocker.GetMock<EpisodeProvider>()
.Setup(c => c.GetEpisode(episode.EpisodeId))
.Returns(episode);
var indexer1 = new Mock<IndexerBase>();
indexer1.Setup(c => c.FetchEpisode("The Daily Show", episode.SeasonNumber, episode.EpisodeNumber))
.Returns(parseResults).Verifiable();
var indexer2 = new Mock<IndexerBase>();
indexer2.Setup(c => c.FetchEpisode("The Daily Show", episode.SeasonNumber, episode.EpisodeNumber))
.Returns(parseResults).Verifiable();
var indexers = new List<IndexerBase> { indexer1.Object, indexer2.Object };
mocker.GetMock<IndexerProvider>()
.Setup(c => c.GetEnabledIndexers())
.Returns(indexers);
mocker.GetMock<InventoryProvider>()
.Setup(c => c.IsQualityNeeded(It.Is<EpisodeParseResult>(d => d.Series != null && d.Episodes.Count != 0))).Returns(false);
//Act
mocker.Resolve<EpisodeSearchJob>().Start(new ProgressNotification("Test"), episode.EpisodeId);
//Assert
mocker.VerifyAllMocks();
mocker.GetMock<InventoryProvider>().Verify(c => c.IsQualityNeeded(It.IsAny<EpisodeParseResult>()),
Times.Exactly(8));
ExceptionVerification.ExcpectedWarns(1);
indexer1.VerifyAll();
indexer2.VerifyAll();
}
[Test] [Test]
public void start_failed_indexer_should_not_break_job() public void start_failed_indexer_should_not_break_job()

@ -125,6 +125,7 @@
<Compile Include="QualityProfileTest.cs" /> <Compile Include="QualityProfileTest.cs" />
<Compile Include="RepoTest.cs" /> <Compile Include="RepoTest.cs" />
<Compile Include="SabProviderTest.cs" /> <Compile Include="SabProviderTest.cs" />
<Compile Include="SceneNameHelperTest.cs" />
<Compile Include="SeriesProviderTest.cs" /> <Compile Include="SeriesProviderTest.cs" />
<Compile Include="TvDbProviderTest.cs" /> <Compile Include="TvDbProviderTest.cs" />
</ItemGroup> </ItemGroup>

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Helpers;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test
{
[TestFixture]
// ReSharper disable InconsistentNaming
public class SceneNameHelperTest : TestBase
{
[Test]
public void GetIdByName_exists()
{
var id = SceneNameHelper.GetIdByName("CSI New York");
id.Should().Be(73696);
}
[Test]
public void GetTitleById_exists()
{
var title = SceneNameHelper.GetTitleById(71256);
title.Should().Be("The Daily Show");
}
}
}

@ -16,12 +16,9 @@ namespace NzbDrone.Core.Test
[TestCase("The Simpsons")] [TestCase("The Simpsons")]
[TestCase("Family Guy")] [TestCase("Family Guy")]
[TestCase("South Park")] [TestCase("South Park")]
[TestCase("clone high, usa")]
public void successful_search(string title) public void successful_search(string title)
{ {
var tvCont = new TvDbProvider(); var result = new TvDbProvider().SearchSeries(title);
var result = tvCont.SearchSeries(title);
result.Should().NotBeEmpty(); result.Should().NotBeEmpty();
result[0].SeriesName.Should().Be(title); result[0].SeriesName.Should().Be(title);

@ -1,7 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Model;
namespace NzbDrone.Core.Helpers namespace NzbDrone.Core.Helpers
{ {
@ -9,307 +7,140 @@ namespace NzbDrone.Core.Helpers
{ {
//Todo: Move this to a publically available location (so updates can be applied without releasing a new version of NzbDrone) //Todo: Move this to a publically available location (so updates can be applied without releasing a new version of NzbDrone)
//Todo: GoogleDocs? WCF Web Services on NzbDrone.com? //Todo: GoogleDocs? WCF Web Services on NzbDrone.com?
private static readonly List<SceneNameModel> SceneNameMappings = new List<SceneNameModel> private static readonly Dictionary<String, Int32> SeriesIdLookupList = new Dictionary<string, int>();
{ private static readonly Dictionary<Int32, String> SceneNameLookupList = new Dictionary<Int32, String>();
new SceneNameModel
{SeriesId = 72546, Name = "CSI"},
new SceneNameModel static SceneNameHelper()
{ {
SeriesId = 73696, //These values are used to match report titles parsed out of RSS to a series in the DB
Name = "CSI New York" SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI"), 72546);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI New York"), 73696);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI NY"), 73696);
{SeriesId = 73696, Name = "CSI NY"}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Archer"), 110381);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Life After People The Series"), 83897);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Life After People"), 83897);
SeriesId = 110381, SeriesIdLookupList.Add(Parser.NormalizeTitle("Kitchen Nightmares US"), 80552);
Name = "Archer" SeriesIdLookupList.Add(Parser.NormalizeTitle("The Daily Show"), 71256);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("The Daily Show with Jon Stewart"), 71256);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order SVU"), 75692);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order Special Victims Unit"), 75692);
SeriesId = 83897, SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order Criminal Intent"), 71489);
Name = SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order CI"), 71489);
"Life After People The Series" SeriesIdLookupList.Add(Parser.NormalizeTitle("Dancing With The Stars US"), 79590);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Craig Ferguson"), 73387);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Jimmy Fallon"), 85355);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("David Letterman"), 75088);
SeriesId = 83897, SeriesIdLookupList.Add(Parser.NormalizeTitle("Big Brother US"), 76706);
Name = "Life After People" SeriesIdLookupList.Add(Parser.NormalizeTitle("The Colony"), 105521);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("The Colony US"), 105521);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Americas Funniest Home Videos"), 76235);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("AFHV"), 76235);
SeriesId = 80552, SeriesIdLookupList.Add(Parser.NormalizeTitle("Childrens Hospital US"), 139941);
Name = "Kitchen Nightmares US" SeriesIdLookupList.Add(Parser.NormalizeTitle("Childrens Hospital"), 139941);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Merlin"), 83123);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Merlin 2008"), 83123);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("WWE Monday Night RAW"), 76779);
SeriesId = 71256, SeriesIdLookupList.Add(Parser.NormalizeTitle("Shit My Dad Says"), 164951);
Name = "The Daily Show" SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius with Dave Gorman"), 83714);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order LA"), 168161);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Star Trek TOS"), 77526);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Star Trek DS9"), 72073);
SeriesId = 71256, SeriesIdLookupList.Add(Parser.NormalizeTitle("Ellen Degeneres"), 72194);
Name = SeriesIdLookupList.Add(Parser.NormalizeTitle("Drinking Made Easy"), 195831);
"The Daily Show with Jon Stewart" SeriesIdLookupList.Add(Parser.NormalizeTitle("Zane Lampreys Drinking Made Easy"), 195831);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Poirot"), 76133);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Agatha Christies Poirot"), 76133);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("The Real World Road Rules Challenge"), 70870);
SeriesId = 75692, SeriesIdLookupList.Add(Parser.NormalizeTitle("The Challenge Cutthroat"), 70870);
Name = "Law and Order SVU" SeriesIdLookupList.Add(Parser.NormalizeTitle("This Old House Program"), 77444);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("60 Minutes US"), 73290);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Conan"), 194751);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Conan 2010"), 194751);
SeriesId = 75692, SeriesIdLookupList.Add(Parser.NormalizeTitle("Carlos 2010"), 164451);
Name = SeriesIdLookupList.Add(Parser.NormalizeTitle("Babalon 5"), 70726);
"Law and Order Special Victims Unit" SeriesIdLookupList.Add(Parser.NormalizeTitle("Babalon5"), 70726);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius"), 83714);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius With Dave Gormand"), 83714);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Come Fly With Me 2010"), 212571);
SeriesId = 71489, SeriesIdLookupList.Add(Parser.NormalizeTitle("Border Security"), 81563);
Name = SeriesIdLookupList.Add(Parser.NormalizeTitle("Border Security Australias Frontline"), 81563);
"Law and Order Criminal Intent" SeriesIdLookupList.Add(Parser.NormalizeTitle("Silent Library US"), 172381);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("Sci-Fi Science"), 131791);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("Frontline"), 80646);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("Frontline US"), 80646);
SeriesId = 71489, SeriesIdLookupList.Add(Parser.NormalizeTitle("RBT AU"), 189931);
Name = "Law and Order CI" SeriesIdLookupList.Add(Parser.NormalizeTitle("House"), 73255);
}, SeriesIdLookupList.Add(Parser.NormalizeTitle("House MD"), 73255);
new SceneNameModel SeriesIdLookupList.Add(Parser.NormalizeTitle("The Office"), 73244);
{ SeriesIdLookupList.Add(Parser.NormalizeTitle("The Office US"), 73244);
SeriesId = 79590,
Name = "Dancing With The Stars US" //These values are used when doing an indexer search.
}, SceneNameLookupList.Add(72546, "CSI"); //CSI
new SceneNameModel SceneNameLookupList.Add(73696, "CSI"); //CSI NY
{ SceneNameLookupList.Add(110381, "Archer");
SeriesId = 73387, SceneNameLookupList.Add(83897, "Life After People");
Name = "Craig Ferguson" SceneNameLookupList.Add(80552, "Kitchen Nightmares US");
}, SceneNameLookupList.Add(71256, "The Daily Show"); //The Daily Show with Jon Stewart
new SceneNameModel SceneNameLookupList.Add(75692, "Law and Order"); //SVU
{ SceneNameLookupList.Add(71489, "Law and Order");//CI
SeriesId = 85355, SceneNameLookupList.Add(79590, "Dancing With The Stars US");
Name = "Jimmy Fallon" SceneNameLookupList.Add(73387, "Craig Ferguson");
}, SceneNameLookupList.Add(85355, "Jimmy Fallon");
new SceneNameModel SceneNameLookupList.Add(75088, "David Letterman");
{ SceneNameLookupList.Add(76706, "Big Brother US");
SeriesId = 75088, SceneNameLookupList.Add(105521, "The Colony");
Name = "David Letterman" SceneNameLookupList.Add(76235, "Americas Funniest Home Videos");
}, SceneNameLookupList.Add(139941, "Childrens Hospital");
new SceneNameModel SceneNameLookupList.Add(83123, "Merlin");
{ SceneNameLookupList.Add(76779, "WWE Monday Night RAW");
SeriesId = 76706, SceneNameLookupList.Add(164951, "Shit My Dad Says");
Name = "Big Brother US" SceneNameLookupList.Add(168161, "Law and Order LA");
}, SceneNameLookupList.Add(77526, "Star Trek TOS");
new SceneNameModel SceneNameLookupList.Add(72073, "Star Trek DS9");
{ SceneNameLookupList.Add(72194, "Ellen Degeneres");
SeriesId = 105521, SceneNameLookupList.Add(195831, "Drinking Made Easy");//Zane Lampreys Drinking Made Easy
Name = "The Colony" SceneNameLookupList.Add(76133, "Poirot"); //Agatha Christies Poirot
}, SceneNameLookupList.Add(70870, "The Real World Road Rules Challenge");
new SceneNameModel SceneNameLookupList.Add(77444, "This Old House Program");
{ SceneNameLookupList.Add(73290, "60 Minutes US");
SeriesId = 105521, SceneNameLookupList.Add(194751, "Conan");
Name = "The Colony US" SceneNameLookupList.Add(164451, "Carlos 2010");
}, SceneNameLookupList.Add(70726, "Babalon"); //5
new SceneNameModel SceneNameLookupList.Add(83714, "Genius"); //Genius With Dave Gormand
{ SceneNameLookupList.Add(212571, "Come Fly With Me 2010");
SeriesId = 76235, SceneNameLookupList.Add(81563, "Border Security");
Name = SceneNameLookupList.Add(172381, "Silent Library US");
"Americas Funniest Home Videos" SceneNameLookupList.Add(131791, "Sci-Fi Science");
}, SceneNameLookupList.Add(80646, "Frontline");
new SceneNameModel SceneNameLookupList.Add(189931, "RBT AU");
{SeriesId = 76235, Name = "AFHV"}, SceneNameLookupList.Add(73255, "House");
new SceneNameModel SceneNameLookupList.Add(73244, "The Office");
{ }
SeriesId = 139941,
Name = "Childrens Hospital US"
}, public static Nullable<Int32> GetIdByName(string cleanSeriesName)
new SceneNameModel
{
SeriesId = 139941,
Name = "Childrens Hospital"
},
new SceneNameModel
{SeriesId = 83123, Name = "Merlin"},
new SceneNameModel
{
SeriesId = 83123,
Name = "Merlin 2008"
},
new SceneNameModel
{
SeriesId = 76779,
Name = "WWE Monday Night RAW"
},
new SceneNameModel
{
SeriesId = 164951,
Name = "Shit My Dad Says"
},
new SceneNameModel
{
SeriesId = 83714,
Name = "Genius with Dave Gorman"
},
new SceneNameModel
{
SeriesId = 168161,
Name = "Law and Order LA"
},
new SceneNameModel
{
SeriesId = 77526,
Name = "Star Trek TOS"
},
new SceneNameModel
{
SeriesId = 72073,
Name = "Star Trek DS9"
},
new SceneNameModel
{
SeriesId = 72194,
Name = "Ellen Degeneres"
},
new SceneNameModel
{
SeriesId = 72194,
Name = "Ellen Degeneres"
},
new SceneNameModel
{
SeriesId = 195831,
Name = "Drinking Made Easy"
},
new SceneNameModel
{
SeriesId = 195831,
Name =
"Zane Lampreys Drinking Made Easy"
},
new SceneNameModel
{SeriesId = 76133, Name = "Poirot"},
new SceneNameModel
{
SeriesId = 76133,
Name = "Agatha Christies Poirot"
},
new SceneNameModel
{
SeriesId = 70870,
Name =
"The Real World Road Rules Challenge"
},
new SceneNameModel
{
SeriesId = 70870,
Name = "The Challenge Cutthroat"
},
new SceneNameModel
{
SeriesId = 77444,
Name = "This Old House Program"
},
new SceneNameModel
{
SeriesId = 73290,
Name = "60 Minutes US"
},
new SceneNameModel
{SeriesId = 194751, Name = "Conan"},
new SceneNameModel
{
SeriesId = 194751,
Name = "Conan 2010"
},
new SceneNameModel
{
SeriesId = 164451,
Name = "Carlos 2010"
},
new SceneNameModel
{
SeriesId = 70726,
Name = "Babalon 5"
},
new SceneNameModel
{
SeriesId = 70726,
Name = "Babalon5"
},
new SceneNameModel
{SeriesId = 83714, Name = "Genius"},
new SceneNameModel
{
SeriesId = 83714,
Name = "Genius With Dave Gormand"
},
new SceneNameModel
{
SeriesId = 212571,
Name = "Come Fly With Me 2010"
},
new SceneNameModel
{
SeriesId = 81563,
Name = "Border Security"
},
new SceneNameModel
{
SeriesId = 81563,
Name =
"Border Security Australias Frontline"
},
new SceneNameModel
{
SeriesId = 172381,
Name = "Silent Library US"
},
new SceneNameModel
{
SeriesId = 131791,
Name = "Sci-Fi Science"
},
new SceneNameModel
{
SeriesId = 80646,
Name = "Frontline"
},
new SceneNameModel
{
SeriesId = 80646,
Name = "Frontline US"
},
new SceneNameModel
{
SeriesId = 189931,
Name = "RBT AU"
},
new SceneNameModel
{SeriesId = 73255, Name = "House"},
new SceneNameModel
{
SeriesId = 73255,
Name = "House MD"
},
new SceneNameModel
{ {
SeriesId = 73244, int id;
Name = "The Office"
}, if (SeriesIdLookupList.TryGetValue(Parser.NormalizeTitle(cleanSeriesName), out id))
new SceneNameModel
{ {
SeriesId = 73244, return id;
Name = "The Office US" }
},
};
public static int FindByName(string cleanSeriesName) return null;
}
public static String GetTitleById(int seriesId)
{ {
var map = SceneNameMappings.Find(s => Parser.NormalizeTitle(s.Name) == cleanSeriesName); string title;
if (map == null) if (SceneNameLookupList.TryGetValue(seriesId, out title))
return 0; {
return title;
}
return map.SeriesId; return null;
} }
} }
} }

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Providers.Indexer;
@ -43,15 +44,25 @@ namespace NzbDrone.Core.Providers.Jobs
throw new ArgumentOutOfRangeException("targetId"); throw new ArgumentOutOfRangeException("targetId");
var episode = _episodeProvider.GetEpisode(targetId); var episode = _episodeProvider.GetEpisode(targetId);
if (episode == null) if (episode == null)
{ {
Logger.Error("Unable to find an episode {0} in database", targetId); Logger.Error("Unable to find an episode {0} in database", targetId);
return; return;
} }
var series = episode.Series;
var indexers = _indexerProvider.GetEnabledIndexers(); var indexers = _indexerProvider.GetEnabledIndexers();
var reports = new List<EpisodeParseResult>(); var reports = new List<EpisodeParseResult>();
var title = SceneNameHelper.GetTitleById(series.SeriesId);
if(string.IsNullOrWhiteSpace(title))
{
title = series.Title;
}
foreach (var indexer in indexers) foreach (var indexer in indexers)
{ {
try try
@ -66,7 +77,7 @@ namespace NzbDrone.Core.Providers.Jobs
} }
else else
{ {
indexerResults = indexer.FetchEpisode(episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber); indexerResults = indexer.FetchEpisode(title, episode.SeasonNumber, episode.EpisodeNumber);
} }
reports.AddRange(indexerResults); reports.AddRange(indexerResults);
@ -82,7 +93,7 @@ namespace NzbDrone.Core.Providers.Jobs
reports.ForEach(c => reports.ForEach(c =>
{ {
c.Series = episode.Series; c.Series = series;
c.Episodes = new List<Episode> { episode }; c.Episodes = new List<Episode> { episode };
}); });

@ -105,10 +105,10 @@ namespace NzbDrone.Core.Providers
{ {
var normalizeTitle = Parser.NormalizeTitle(title); var normalizeTitle = Parser.NormalizeTitle(title);
var seriesId = SceneNameHelper.FindByName(normalizeTitle); var seriesId = SceneNameHelper.GetIdByName(normalizeTitle);
if (seriesId != 0) if (seriesId != 0)
{ {
return GetSeries(seriesId); return GetSeries(seriesId.Value);
} }
return _repository.Single<Series>(s => s.CleanTitle == normalizeTitle); return _repository.Single<Series>(s => s.CleanTitle == normalizeTitle);

Loading…
Cancel
Save