SceneNaming is now stored on NzbDrone webserver.

Database will update every 12 hours from CSV on server.
This commit is contained in:
Mark McDowall 2011-06-13 19:15:55 -07:00
parent 6dda51d0e7
commit ab2007cb6f
11 changed files with 312 additions and 159 deletions

View File

@ -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 GetIdByName_exists()
public void GetSceneName_exists()
{
var id = SceneNameHelper.GetIdByName("CSI New York");
id.Should().Be(73696);
//Setup
var fakeMap = Builder<SceneNameMapping>.CreateNew()
.With(f => f.SeriesId = 12345)
.With(f => f.SceneName = "Law and Order")
.Build();
var mocker = new AutoMoqer();
mocker.GetMock<IRepository>()
.Setup(f => f.Single<SceneNameMapping>(It.IsAny<Expression<Func<SceneNameMapping, bool>>>()))
.Returns(fakeMap);
//Act
var sceneName = mocker.Resolve<SceneNameMappingProvider>().GetSceneName(fakeMap.SeriesId);
//Assert
Assert.AreEqual(fakeMap.SceneName, sceneName);
}
[Test]
public void GetSeriesId_exists()
{
//Setup
var fakeMap = Builder<SceneNameMapping>.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<IRepository>()
.Setup(f => f.Single<SceneNameMapping>(It.IsAny<Expression<Func<SceneNameMapping, bool>>>()))
.Returns(fakeMap);
//Act
var seriesId = mocker.Resolve<SceneNameMappingProvider>().GetSeriesId(fakeMap.SceneCleanName);
//Assert
Assert.AreEqual(fakeMap.SeriesId, seriesId);
}
[Test]
public void GetTitleById_exists()
public void GetSceneName_null()
{
var title = SceneNameHelper.GetTitleById(71256);
title.Should().Be("The Daily Show");
//Setup
var fakeMap = Builder<SceneNameMapping>.CreateNew()
.With(f => f.SeriesId = 12345)
.With(f => f.SceneName = "Law and Order")
.Build();
var mocker = new AutoMoqer();
mocker.GetMock<IRepository>()
.Setup(f => f.Single<SceneNameMapping>(It.IsAny<Expression<Func<SceneNameMapping, bool>>>()));
//Act
var sceneName = mocker.Resolve<SceneNameMappingProvider>().GetSceneName(fakeMap.SeriesId);
//Assert
Assert.AreEqual(null, sceneName);
}
[Test]
public void GetSeriesId_null()
{
//Setup
var fakeMap = Builder<SceneNameMapping>.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<IRepository>()
.Setup(f => f.Single<SceneNameMapping>(It.IsAny<Expression<Func<SceneNameMapping, bool>>>()));
//Act
var seriesId = mocker.Resolve<SceneNameMappingProvider>().GetSeriesId(fakeMap.SceneCleanName);
//Assert
Assert.AreEqual(null, seriesId);
}
}
}

View File

@ -122,6 +122,7 @@ namespace NzbDrone.Core
_kernel.Bind<IJob>().To<EpisodeSearchJob>().InTransientScope();
_kernel.Bind<IJob>().To<RenameEpisodeJob>().InTransientScope();
_kernel.Bind<IJob>().To<PostDownloadScanJob>().InTransientScope();
_kernel.Bind<IJob>().To<UpdateSceneMappingsJob>().InTransientScope();
_kernel.Get<JobProvider>().Initialize();
_kernel.Get<WebTimer>().StartTimer(30);

View File

@ -58,6 +58,7 @@ namespace NzbDrone.Core.Datastore
repository.Single<QualityProfile>(1);
repository.Single<History>(1);
repository.Single<IndexerSetting>(1);
repository.Single<SceneNameMapping>(1);
}

View File

@ -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<String, Int32> SeriesIdLookupList = new Dictionary<string, int>();
private static readonly Dictionary<Int32, String> SceneNameLookupList = new Dictionary<Int32, String>();
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<Int32> 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;
}
}
}

View File

@ -168,7 +168,6 @@
<Compile Include="Helpers\EpisodeRenameHelper.cs" />
<Compile Include="Helpers\EpisodeSortingHelper.cs" />
<Compile Include="Helpers\FileSizeFormatHelpercs.cs" />
<Compile Include="Helpers\SceneNameHelper.cs" />
<Compile Include="Instrumentation\LogProvider.cs" />
<Compile Include="Instrumentation\SubsonicTarget.cs" />
<Compile Include="Instrumentation\ExceptioneerTarget.cs" />
@ -185,6 +184,7 @@
<Compile Include="Providers\Indexer\SyndicationFeedXmlReader.cs" />
<Compile Include="Providers\AutoConfigureProvider.cs" />
<Compile Include="Providers\Indexer\NzbMatrix.cs" />
<Compile Include="Providers\Jobs\UpdateSceneMappingsJob.cs" />
<Compile Include="Providers\Jobs\PostDownloadScanJob.cs" />
<Compile Include="Providers\Jobs\RenameEpisodeJob.cs" />
<Compile Include="Providers\Jobs\EpisodeSearchJob.cs" />
@ -197,6 +197,7 @@
<Compile Include="Providers\Jobs\IJob.cs" />
<Compile Include="Providers\Jobs\RssSyncJob.cs" />
<Compile Include="Providers\Jobs\UpdateInfoJob.cs" />
<Compile Include="Providers\SceneNameMappingProvider.cs" />
<Compile Include="Providers\StatsProvider.cs" />
<Compile Include="Repository\ExternalNotificationSetting.cs" />
<Compile Include="Repository\JobSetting.cs" />
@ -241,6 +242,7 @@
<Compile Include="Repository\Quality\QualityProfile.cs" />
<Compile Include="Repository\RootDir.cs" />
<Compile Include="Repository\Quality\QualityTypes.cs" />
<Compile Include="Repository\SceneNameMapping.cs" />
<Compile Include="Repository\Series.cs" />
<Compile Include="CentralDispatch.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View File

@ -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<EpisodeParseResult>();
var title = SceneNameHelper.GetTitleById(series.SeriesId);
var title = _sceneNameMappingProvider.GetSceneName(series.SeriesId);
if(string.IsNullOrWhiteSpace(title))
{

View File

@ -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";
}
}
}

View File

@ -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<SceneNameMapping>();
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<SceneNameMapping>(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<SceneNameMapping> GetAll()
{
return _repository.All<SceneNameMapping>().ToList();
}
public virtual string GetSceneName(int seriesId)
{
var item = _repository.Single<SceneNameMapping>(s => s.SeriesId == seriesId);
if (item == null)
return null;
return item.SceneName;
}
public virtual Nullable<Int32> GetSeriesId(string cleanName)
{
var item = _repository.Single<SceneNameMapping>(s => s.SceneCleanName == cleanName);
if (item == null)
return null;
return item.SeriesId;
}
}
}

View File

@ -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);

View File

@ -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; }
}
}

58
SceneNameMappings.csv Normal file
View File

@ -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
1 csinewyork 73696 CSI
2 csiny 73696 CSI
3 archer 110381 Archer
4 lifeafterpeopleseries 83897 Life After People
5 lifeafterpeople 83897 Life After People
6 kitchennightmaresus 80552 Kitchen Nightmares US
7 dailyshow 71256 The Daily Show
8 dailyshowwithjonstewart 71256 The Daily Show
9 lawordersvu 75692 Law and Order SVU
10 laworderspecialvictimsunit 75692 Law and Order
11 lawordercriminalintent 71489 Law and Order
12 laworderci 71489 Law and Order
13 dancingwithstarsus 79590 Dancing With The Stars
14 craigferguson 73387 Craig Ferguson
15 jimmyfallon 85355 Jimmy Fallon
16 davidletterman 75088 David Letterman
17 bigbrotherus 76706 Big Brother
18 colony 105521 The Colony
19 colonyus 105521 The Colony
20 americasfunniesthomevideos 76235 Americas Funniest Home Videos
21 afhv 76235 Americas Funniest Home Videos
22 childrenshospitalus 139941 Childrens Hospital
23 childrenshospital 139941 Childrens Hospital
24 merlin 83123 Merlin
25 merlin2008 83123 Merlin
26 wwemondaynightraw 76779 WWE Monday Night RAW
27 shitmydadsays 164951 Shit My Dad Says
28 geniuswithdavegorman 83714 Genius with Dave Gorman
29 laworderla 168161 Law and Order
30 startrektos 77526 Star Trek TOS
31 startrekds 72073 Star Trek DS9
32 ellendegeneres 72194 Ellen Degeneres
33 drinkingmadeeasy 195831 Drinking Made Easy
34 zanelampreysdrinkingmadeeasy 195831 Drinking Made Easy
35 poirot 76133 Poirot
36 agathachristiespoirot 76133 Poirot
37 realworldroadruleschallenge 70870 The Real World Road Rules Challenge
38 challengecutthroat 70870 The Challenge Cutthroat
39 thisoldhouseprogram 77444 This Old House Program
40 minutesus 73290 60 Minutes
41 conan 194751 Conan
42 conan2010 194751 Conan
43 carlos2010 164451 Carlos 2010
44 babalon 70726 Babalon
45 genius 83714 Genius
46 geniuswithdavegormand 83714 Genius With Dave Gormand
47 comeflywithme2010 212571 Come Fly With Me 2010
48 bordersecurity 81563 Border Security
49 bordersecurityaustraliasfrontline 81563 Border Security Australias Frontline
50 silentlibraryus 172381 Silent Library US
51 scifiscience 131791 Sci Fi Science
52 frontline 80646 Frontline
53 frontlineus 80646 Frontline
54 rbtau 189931 RBT AU
55 house 73255 House
56 housemd 73255 House
57 office 73244 The Office
58 officeus 73244 The Office