From ab2007cb6f88c52695de746b1548a1ab18504284 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 13 Jun 2011 19:15:55 -0700 Subject: [PATCH] SceneNaming is now stored on NzbDrone webserver. Database will update every 12 hours from CSV on server. --- NzbDrone.Core.Test/SceneNameHelperTest.cs | 92 ++++++++++- NzbDrone.Core/CentralDispatch.cs | 1 + NzbDrone.Core/Datastore/Migrations.cs | 1 + NzbDrone.Core/Helpers/SceneNameHelper.cs | 146 ------------------ NzbDrone.Core/NzbDrone.Core.csproj | 4 +- .../Providers/Jobs/EpisodeSearchJob.cs | 9 +- .../Providers/Jobs/UpdateSceneMappingsJob.cs | 42 +++++ .../Providers/SceneNameMappingProvider.cs | 91 +++++++++++ NzbDrone.Core/Providers/SeriesProvider.cs | 7 +- NzbDrone.Core/Repository/SceneNameMapping.cs | 18 +++ SceneNameMappings.csv | 58 +++++++ 11 files changed, 311 insertions(+), 158 deletions(-) delete mode 100644 NzbDrone.Core/Helpers/SceneNameHelper.cs create mode 100644 NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs create mode 100644 NzbDrone.Core/Providers/SceneNameMappingProvider.cs create mode 100644 NzbDrone.Core/Repository/SceneNameMapping.cs create mode 100644 SceneNameMappings.csv diff --git a/NzbDrone.Core.Test/SceneNameHelperTest.cs b/NzbDrone.Core.Test/SceneNameHelperTest.cs index 91feadcb0..56b5c3cd8 100644 --- a/NzbDrone.Core.Test/SceneNameHelperTest.cs +++ b/NzbDrone.Core.Test/SceneNameHelperTest.cs @@ -1,11 +1,19 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; +using AutoMoq; +using FizzWare.NBuilder; using FluentAssertions; +using Moq; using NUnit.Framework; using NzbDrone.Core.Helpers; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; +using SubSonic.Repository; +using TvdbLib.Data; namespace NzbDrone.Core.Test { @@ -13,20 +21,92 @@ namespace NzbDrone.Core.Test // ReSharper disable InconsistentNaming public class SceneNameHelperTest : TestBase { + [Test] + public void GetSceneName_exists() + { + //Setup + var fakeMap = Builder.CreateNew() + .With(f => f.SeriesId = 12345) + .With(f => f.SceneName = "Law and Order") + .Build(); + + var mocker = new AutoMoqer(); + + mocker.GetMock() + .Setup(f => f.Single(It.IsAny>>())) + .Returns(fakeMap); + + //Act + var sceneName = mocker.Resolve().GetSceneName(fakeMap.SeriesId); + + //Assert + Assert.AreEqual(fakeMap.SceneName, sceneName); + } [Test] - public void GetIdByName_exists() + public void GetSeriesId_exists() { - var id = SceneNameHelper.GetIdByName("CSI New York"); - id.Should().Be(73696); + //Setup + var fakeMap = Builder.CreateNew() + .With(f => f.SeriesId = 12345) + .With(f => f.SceneName = "Law and Order") + .With(f => f.SceneName = "laworder") + .Build(); + + var mocker = new AutoMoqer(); + + mocker.GetMock() + .Setup(f => f.Single(It.IsAny>>())) + .Returns(fakeMap); + + //Act + var seriesId = mocker.Resolve().GetSeriesId(fakeMap.SceneCleanName); + + //Assert + Assert.AreEqual(fakeMap.SeriesId, seriesId); } + [Test] + public void GetSceneName_null() + { + //Setup + var fakeMap = Builder.CreateNew() + .With(f => f.SeriesId = 12345) + .With(f => f.SceneName = "Law and Order") + .Build(); + + var mocker = new AutoMoqer(); + + mocker.GetMock() + .Setup(f => f.Single(It.IsAny>>())); + + //Act + var sceneName = mocker.Resolve().GetSceneName(fakeMap.SeriesId); + + //Assert + Assert.AreEqual(null, sceneName); + } [Test] - public void GetTitleById_exists() + public void GetSeriesId_null() { - var title = SceneNameHelper.GetTitleById(71256); - title.Should().Be("The Daily Show"); + //Setup + var fakeMap = Builder.CreateNew() + .With(f => f.SeriesId = 12345) + .With(f => f.SceneName = "Law and Order") + .With(f => f.SceneName = "laworder") + .Build(); + + var mocker = new AutoMoqer(); + + mocker.GetMock() + .Setup(f => f.Single(It.IsAny>>())); + + //Act + var seriesId = mocker.Resolve().GetSeriesId(fakeMap.SceneCleanName); + + //Assert + Assert.AreEqual(null, seriesId); } } } diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index c4a3c3dd5..f855d2064 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -122,6 +122,7 @@ namespace NzbDrone.Core _kernel.Bind().To().InTransientScope(); _kernel.Bind().To().InTransientScope(); _kernel.Bind().To().InTransientScope(); + _kernel.Bind().To().InTransientScope(); _kernel.Get().Initialize(); _kernel.Get().StartTimer(30); diff --git a/NzbDrone.Core/Datastore/Migrations.cs b/NzbDrone.Core/Datastore/Migrations.cs index b87f8589f..e942c7c05 100644 --- a/NzbDrone.Core/Datastore/Migrations.cs +++ b/NzbDrone.Core/Datastore/Migrations.cs @@ -58,6 +58,7 @@ namespace NzbDrone.Core.Datastore repository.Single(1); repository.Single(1); repository.Single(1); + repository.Single(1); } diff --git a/NzbDrone.Core/Helpers/SceneNameHelper.cs b/NzbDrone.Core/Helpers/SceneNameHelper.cs deleted file mode 100644 index 1342bc591..000000000 --- a/NzbDrone.Core/Helpers/SceneNameHelper.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace NzbDrone.Core.Helpers -{ - public static class SceneNameHelper - { - //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? - private static readonly Dictionary SeriesIdLookupList = new Dictionary(); - private static readonly Dictionary SceneNameLookupList = new Dictionary(); - - - static SceneNameHelper() - { - //These values are used to match report titles parsed out of RSS to a series in the DB - SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI"), 72546); - SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI New York"), 73696); - SeriesIdLookupList.Add(Parser.NormalizeTitle("CSI NY"), 73696); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Archer"), 110381); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Life After People The Series"), 83897); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Life After People"), 83897); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Kitchen Nightmares US"), 80552); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Daily Show"), 71256); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Daily Show with Jon Stewart"), 71256); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order SVU"), 75692); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order Special Victims Unit"), 75692); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order Criminal Intent"), 71489); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order CI"), 71489); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Dancing With The Stars US"), 79590); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Craig Ferguson"), 73387); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Jimmy Fallon"), 85355); - SeriesIdLookupList.Add(Parser.NormalizeTitle("David Letterman"), 75088); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Big Brother US"), 76706); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Colony"), 105521); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Colony US"), 105521); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Americas Funniest Home Videos"), 76235); - SeriesIdLookupList.Add(Parser.NormalizeTitle("AFHV"), 76235); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Childrens Hospital US"), 139941); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Childrens Hospital"), 139941); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Merlin"), 83123); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Merlin 2008"), 83123); - SeriesIdLookupList.Add(Parser.NormalizeTitle("WWE Monday Night RAW"), 76779); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Shit My Dad Says"), 164951); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius with Dave Gorman"), 83714); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Law and Order LA"), 168161); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Star Trek TOS"), 77526); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Star Trek DS9"), 72073); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Ellen Degeneres"), 72194); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Drinking Made Easy"), 195831); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Zane Lampreys Drinking Made Easy"), 195831); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Poirot"), 76133); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Agatha Christies Poirot"), 76133); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Real World Road Rules Challenge"), 70870); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Challenge Cutthroat"), 70870); - SeriesIdLookupList.Add(Parser.NormalizeTitle("This Old House Program"), 77444); - SeriesIdLookupList.Add(Parser.NormalizeTitle("60 Minutes US"), 73290); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Conan"), 194751); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Conan 2010"), 194751); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Carlos 2010"), 164451); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Babalon 5"), 70726); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Babalon5"), 70726); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius"), 83714); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Genius With Dave Gormand"), 83714); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Come Fly With Me 2010"), 212571); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Border Security"), 81563); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Border Security Australias Frontline"), 81563); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Silent Library US"), 172381); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Sci-Fi Science"), 131791); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Frontline"), 80646); - SeriesIdLookupList.Add(Parser.NormalizeTitle("Frontline US"), 80646); - SeriesIdLookupList.Add(Parser.NormalizeTitle("RBT AU"), 189931); - SeriesIdLookupList.Add(Parser.NormalizeTitle("House"), 73255); - SeriesIdLookupList.Add(Parser.NormalizeTitle("House MD"), 73255); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Office"), 73244); - SeriesIdLookupList.Add(Parser.NormalizeTitle("The Office US"), 73244); - - //These values are used when doing an indexer search. - SceneNameLookupList.Add(72546, "CSI"); //CSI - SceneNameLookupList.Add(73696, "CSI"); //CSI NY - SceneNameLookupList.Add(110381, "Archer"); - SceneNameLookupList.Add(83897, "Life After People"); - SceneNameLookupList.Add(80552, "Kitchen Nightmares US"); - SceneNameLookupList.Add(71256, "The Daily Show"); //The Daily Show with Jon Stewart - SceneNameLookupList.Add(75692, "Law and Order"); //SVU - SceneNameLookupList.Add(71489, "Law and Order");//CI - SceneNameLookupList.Add(79590, "Dancing With The Stars US"); - SceneNameLookupList.Add(73387, "Craig Ferguson"); - SceneNameLookupList.Add(85355, "Jimmy Fallon"); - SceneNameLookupList.Add(75088, "David Letterman"); - SceneNameLookupList.Add(76706, "Big Brother US"); - SceneNameLookupList.Add(105521, "The Colony"); - SceneNameLookupList.Add(76235, "Americas Funniest Home Videos"); - SceneNameLookupList.Add(139941, "Childrens Hospital"); - SceneNameLookupList.Add(83123, "Merlin"); - SceneNameLookupList.Add(76779, "WWE Monday Night RAW"); - SceneNameLookupList.Add(164951, "Shit My Dad Says"); - SceneNameLookupList.Add(168161, "Law and Order LA"); - SceneNameLookupList.Add(77526, "Star Trek TOS"); - SceneNameLookupList.Add(72073, "Star Trek DS9"); - SceneNameLookupList.Add(72194, "Ellen Degeneres"); - SceneNameLookupList.Add(195831, "Drinking Made Easy");//Zane Lampreys Drinking Made Easy - SceneNameLookupList.Add(76133, "Poirot"); //Agatha Christies Poirot - SceneNameLookupList.Add(70870, "The Real World Road Rules Challenge"); - SceneNameLookupList.Add(77444, "This Old House Program"); - SceneNameLookupList.Add(73290, "60 Minutes US"); - SceneNameLookupList.Add(194751, "Conan"); - SceneNameLookupList.Add(164451, "Carlos 2010"); - SceneNameLookupList.Add(70726, "Babalon"); //5 - SceneNameLookupList.Add(83714, "Genius"); //Genius With Dave Gormand - SceneNameLookupList.Add(212571, "Come Fly With Me 2010"); - SceneNameLookupList.Add(81563, "Border Security"); - SceneNameLookupList.Add(172381, "Silent Library US"); - SceneNameLookupList.Add(131791, "Sci-Fi Science"); - SceneNameLookupList.Add(80646, "Frontline"); - SceneNameLookupList.Add(189931, "RBT AU"); - SceneNameLookupList.Add(73255, "House"); - SceneNameLookupList.Add(73244, "The Office"); - } - - - public static Nullable GetIdByName(string cleanSeriesName) - { - int id; - - if (SeriesIdLookupList.TryGetValue(Parser.NormalizeTitle(cleanSeriesName), out id)) - { - return id; - } - - return null; - } - - public static String GetTitleById(int seriesId) - { - string title; - - if (SceneNameLookupList.TryGetValue(seriesId, out title)) - { - return title; - } - - return null; - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index daee93be9..bb5169eb0 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -168,7 +168,6 @@ - @@ -185,6 +184,7 @@ + @@ -197,6 +197,7 @@ + @@ -241,6 +242,7 @@ + diff --git a/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs index bbb151fa5..a2696423f 100644 --- a/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs +++ b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs @@ -16,16 +16,19 @@ namespace NzbDrone.Core.Providers.Jobs private readonly DownloadProvider _downloadProvider; private readonly IndexerProvider _indexerProvider; private readonly EpisodeProvider _episodeProvider; - + private readonly SceneNameMappingProvider _sceneNameMappingProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public EpisodeSearchJob(InventoryProvider inventoryProvider, DownloadProvider downloadProvider, IndexerProvider indexerProvider, EpisodeProvider episodeProvider) + public EpisodeSearchJob(InventoryProvider inventoryProvider, DownloadProvider downloadProvider, + IndexerProvider indexerProvider, EpisodeProvider episodeProvider, + SceneNameMappingProvider sceneNameMappingProvider) { _inventoryProvider = inventoryProvider; _downloadProvider = downloadProvider; _indexerProvider = indexerProvider; _episodeProvider = episodeProvider; + _sceneNameMappingProvider = sceneNameMappingProvider; } public string Name @@ -56,7 +59,7 @@ namespace NzbDrone.Core.Providers.Jobs var indexers = _indexerProvider.GetEnabledIndexers(); var reports = new List(); - var title = SceneNameHelper.GetTitleById(series.SeriesId); + var title = _sceneNameMappingProvider.GetSceneName(series.SeriesId); if(string.IsNullOrWhiteSpace(title)) { diff --git a/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs b/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs new file mode 100644 index 000000000..ad517287e --- /dev/null +++ b/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs @@ -0,0 +1,42 @@ +using System.Linq; +using System.Collections.Generic; +using NzbDrone.Core.Model.Notification; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers.Jobs +{ + public class UpdateSceneMappingsJob : IJob + { + private readonly SceneNameMappingProvider _sceneNameMappingProvider; + + public UpdateSceneMappingsJob(SceneNameMappingProvider sceneNameMappingProvider) + { + _sceneNameMappingProvider = sceneNameMappingProvider; + } + + public UpdateSceneMappingsJob() + { + + } + + public string Name + { + get { return "Update Scene Mappings"; } + } + + public int DefaultInterval + { + get { return 720; } //Every 12 hours + } + + public virtual void Start(ProgressNotification notification, int targetId) + { + notification.CurrentMessage = "Updating Scene Mappings"; + if (_sceneNameMappingProvider.UpdateMappings()) + notification.CurrentMessage = "Scene Mappings Completed"; + + else + notification.CurrentMessage = "Scene Mappings Failed"; + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/SceneNameMappingProvider.cs b/NzbDrone.Core/Providers/SceneNameMappingProvider.cs new file mode 100644 index 000000000..f40aa1e9b --- /dev/null +++ b/NzbDrone.Core/Providers/SceneNameMappingProvider.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using NLog; +using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Repository; +using SubSonic.Repository; + +namespace NzbDrone.Core.Providers +{ + public class SceneNameMappingProvider + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private readonly IRepository _repository; + private readonly HttpProvider _httpProvider; + + public SceneNameMappingProvider(IRepository repository, HttpProvider httpProvider) + { + _repository = repository; + _httpProvider = httpProvider; + } + + public virtual bool UpdateMappings() + { + try + { + var mapping = _httpProvider.DownloadString("http://vps.nzbdrone.com/SceneNameMappings.csv"); + var newMaps = new List(); + + using (var reader = new StringReader(mapping)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + var split = line.Split(','); + var seriesId = 0; + Int32.TryParse(split[1], out seriesId); + + var map = new SceneNameMapping(); + map.SceneCleanName = split[0]; + map.SeriesId = seriesId; + map.SceneName = split[2]; + + newMaps.Add(map); + } + } + + Logger.Debug("Deleting all existing Scene Mappings."); + _repository.DeleteMany(GetAll()); + + Logger.Debug("Adding Scene Mappings"); + _repository.AddMany(newMaps); + } + + catch (Exception ex) + { + Logger.InfoException("Failed to Update Scene Mappings", ex); + return false; + } + return true; + } + + public virtual List GetAll() + { + return _repository.All().ToList(); + } + + public virtual string GetSceneName(int seriesId) + { + var item = _repository.Single(s => s.SeriesId == seriesId); + + if (item == null) + return null; + + return item.SceneName; + } + + public virtual Nullable GetSeriesId(string cleanName) + { + var item = _repository.Single(s => s.SceneCleanName == cleanName); + + if (item == null) + return null; + + return item.SeriesId; + } + } +} diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index c164cb32e..79fe43d26 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -22,12 +22,15 @@ namespace NzbDrone.Core.Providers private readonly IRepository _repository; private readonly ConfigProvider _configProvider; private readonly TvDbProvider _tvDbProvider; + private readonly SceneNameMappingProvider _sceneNameMappingProvider; - public SeriesProvider(ConfigProvider configProviderProvider, IRepository repository, TvDbProvider tvDbProviderProvider) + public SeriesProvider(ConfigProvider configProviderProvider, IRepository repository, + TvDbProvider tvDbProviderProvider, SceneNameMappingProvider sceneNameMappingProvider) { _configProvider = configProviderProvider; _repository = repository; _tvDbProvider = tvDbProviderProvider; + _sceneNameMappingProvider = sceneNameMappingProvider; } public SeriesProvider() @@ -105,7 +108,7 @@ namespace NzbDrone.Core.Providers { var normalizeTitle = Parser.NormalizeTitle(title); - var seriesId = SceneNameHelper.GetIdByName(normalizeTitle); + var seriesId = _sceneNameMappingProvider.GetSeriesId(normalizeTitle); if (seriesId != null) { return GetSeries(seriesId.Value); diff --git a/NzbDrone.Core/Repository/SceneNameMapping.cs b/NzbDrone.Core/Repository/SceneNameMapping.cs new file mode 100644 index 000000000..b6338bfeb --- /dev/null +++ b/NzbDrone.Core/Repository/SceneNameMapping.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SubSonic.SqlGeneration.Schema; + +namespace NzbDrone.Core.Repository +{ + public class SceneNameMapping + { + [SubSonicPrimaryKey] + public virtual string SceneCleanName { get; set; } + + public virtual int SeriesId { get; set; } + + public virtual string SceneName { get; set; } + } +} diff --git a/SceneNameMappings.csv b/SceneNameMappings.csv new file mode 100644 index 000000000..0da6a367d --- /dev/null +++ b/SceneNameMappings.csv @@ -0,0 +1,58 @@ +csinewyork,73696,CSI +csiny,73696,CSI +archer,110381,Archer +lifeafterpeopleseries,83897,Life After People +lifeafterpeople,83897,Life After People +kitchennightmaresus,80552,Kitchen Nightmares US +dailyshow,71256,The Daily Show +dailyshowwithjonstewart,71256,The Daily Show +lawordersvu,75692,Law and Order SVU +laworderspecialvictimsunit,75692,Law and Order +lawordercriminalintent,71489,Law and Order +laworderci,71489,Law and Order +dancingwithstarsus,79590,Dancing With The Stars +craigferguson,73387,Craig Ferguson +jimmyfallon,85355,Jimmy Fallon +davidletterman,75088,David Letterman +bigbrotherus,76706,Big Brother +colony,105521,The Colony +colonyus,105521,The Colony +americasfunniesthomevideos,76235,Americas Funniest Home Videos +afhv,76235,Americas Funniest Home Videos +childrenshospitalus,139941,Childrens Hospital +childrenshospital,139941,Childrens Hospital +merlin,83123,Merlin +merlin2008,83123,Merlin +wwemondaynightraw,76779,WWE Monday Night RAW +shitmydadsays,164951,Shit My Dad Says +geniuswithdavegorman,83714,Genius with Dave Gorman +laworderla,168161,Law and Order +startrektos,77526,Star Trek TOS +startrekds,72073,Star Trek DS9 +ellendegeneres,72194,Ellen Degeneres +drinkingmadeeasy,195831,Drinking Made Easy +zanelampreysdrinkingmadeeasy,195831,Drinking Made Easy +poirot,76133,Poirot +agathachristiespoirot,76133,Poirot +realworldroadruleschallenge,70870,The Real World Road Rules Challenge +challengecutthroat,70870,The Challenge Cutthroat +thisoldhouseprogram,77444,This Old House Program +minutesus,73290,60 Minutes +conan,194751,Conan +conan2010,194751,Conan +carlos2010,164451,Carlos 2010 +babalon,70726,Babalon +genius,83714,Genius +geniuswithdavegormand,83714,Genius With Dave Gormand +comeflywithme2010,212571,Come Fly With Me 2010 +bordersecurity,81563,Border Security +bordersecurityaustraliasfrontline,81563,Border Security Australias Frontline +silentlibraryus,172381,Silent Library US +scifiscience,131791,Sci Fi Science +frontline,80646,Frontline +frontlineus,80646,Frontline +rbtau,189931,RBT AU +house,73255,House +housemd,73255,House +office,73244,The Office +officeus,73244,The Office \ No newline at end of file