diff --git a/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml b/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml
new file mode 100644
index 000000000..4f8843778
--- /dev/null
+++ b/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml
@@ -0,0 +1,3 @@
+
+
+0
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/Files/TvRage/SearchResults_many.xml b/NzbDrone.Core.Test/Files/TvRage/SearchResults_many.xml
new file mode 100644
index 000000000..31206736b
--- /dev/null
+++ b/NzbDrone.Core.Test/Files/TvRage/SearchResults_many.xml
@@ -0,0 +1,420 @@
+
+
+
+
+ 6753
+ Top Gear
+ http://www.tvrage.com/Top_Gear
+ UK
+ Oct/20/2002
+
+ 18
+ Returning Series
+ 60
+ Reality
+
+
+ Automobiles
+ Comedy
+
+ BBC TWO
+ 20:00
+ Sunday
+
+
+ 19321
+ Top Gear (1978)
+ http://www.tvrage.com/shows/id-19321
+ UK
+ Jul/13/1978
+ Dec/17/2001
+ 24
+ Canceled/Ended
+ 30
+ Reality
+
+ Automobiles
+
+ BBC TWO
+ 12:00
+ Sunday
+
+ Top Gear Xtra
+
+
+
+ 20568
+ Top Gear (US)
+ http://www.tvrage.com/Top_Gear_US
+ US
+ Nov/21/2010
+
+ 3
+ Returning Series
+ 60
+ Documentary
+
+ Automobiles
+ Comedy
+
+ History Channel
+ 21:00
+ Tuesday
+
+ Top Gear USA
+
+
+
+ 20324
+ Top Gear Australia
+ http://www.tvrage.com/shows/id-20324
+ AU
+ Sep/29/2008
+
+ 4
+ Returning Series
+ 60
+ Documentary
+
+ Automobiles
+ Comedy
+
+ GEM
+ 18:30
+ Saturday
+
+
+ 20569
+ Top Gear Motorsport
+ http://www.tvrage.com/shows/id-20569
+ UK
+ Mar/24/1995
+ 1998
+ 3
+ Canceled/Ended
+ 30
+ Sports
+
+ Educational
+ Family
+ How To/Do It Yourself
+
+ BBC TWO
+ 12:00
+ Wednesday
+
+
+ 6249
+ Top Secret Life of Edgar Briggs
+ http://www.tvrage.com/shows/id-6249
+ UK
+ Sep/15/1974
+ Dec/20/1974
+ 1
+ Canceled/Ended
+ 30
+ Scripted
+
+ Comedy
+
+ ITV
+ 19:00
+ Friday
+
+
+ 25253
+ Popstar Wesley: Op weg naar de Top
+ http://www.tvrage.com/shows/id-25253
+ NL
+ Feb/06/2010
+ Feb/27/2010
+ 1
+ Canceled/Ended
+ 15
+ Reality
+
+ How To/Do It Yourself
+ Music
+ Talent
+
+ SBS 6
+ 23:15
+ Saturday
+
+
+ 19649
+ Top Chef: Masters
+ http://www.tvrage.com/Top_Chef-Masters
+ US
+ Jun/10/2009
+
+ 4
+ Returning Series
+ 60
+ Reality
+
+ Cooking/Food
+ Family
+ Talent
+
+ Bravo
+ 22:00
+ Wednesday
+
+
+ 26212
+ Top Chef: Just Desserts
+ http://www.tvrage.com/Top_Chef-Just_Desserts
+ US
+ Sep/15/2010
+
+ 2
+ New Series
+ 60
+ Reality
+
+ Celebrities
+ Cooking/Food
+ Educational
+ Family
+ How To/Do It Yourself
+ Talent
+
+ Bravo
+ 22:00
+ Wednesday
+
+
+ 11210
+ Top Design
+ http://www.tvrage.com/shows/id-11210
+ US
+ Jan/31/2007
+ Nov/05/2008
+ 2
+ Canceled/Ended
+ 60
+ Reality
+
+ Celebrities
+ Educational
+ Family
+ Housing/Building
+ How To/Do It Yourself
+
+ Bravo
+ 22:00
+ Wednesday
+
+ Top Decorator
+ Top Designer
+
+
+
+ 15390
+ Air Gear
+ http://www.tvrage.com/shows/id-15390
+ AJ
+ Apr/04/2006
+ Sep/26/2006
+ 1
+ Canceled/Ended
+ 30
+ Animation
+
+ Anime
+ Adventure
+ Sci-Fi
+ Tech/Gaming
+
+ TV Tokyo
+ 12:00
+ Wednesday
+
+
+ 30933
+ Top Guns
+ http://www.tvrage.com/shows/id-30933
+ US
+ Feb/15/2012
+
+ 1
+ New Series
+ 60
+ Reality
+
+ Action
+ Family
+ How To/Do It Yourself
+ Talent
+
+ H2 TV
+ 22:00
+ Wednesday
+
+
+ 28150
+ Top Chef Canada
+ http://www.tvrage.com/shows/id-28150
+ CA
+ Apr/11/2011
+
+ 2
+ New Series
+ 60
+ Reality
+
+ Cooking/Food
+ Family
+ Talent
+
+ Food Network Canada
+ 21:00
+ Monday
+
+
+ 6386
+ Top of the Pops Saturday
+ http://www.tvrage.com/shows/id-6386
+ UK
+ Sep/20/2003
+ Mar/26/2005
+ 2
+ Canceled/Ended
+ 60
+ Variety
+
+ Children
+
+ BBC One
+ 23:00
+ Saturday
+
+
+ 29633
+ Top Secret Recipe
+ http://www.tvrage.com/shows/id-29633
+ US
+ Oct/07/2011
+
+ 1
+ New Series
+ 60
+ Reality
+
+ Cooking/Food
+ How To/Do It Yourself
+
+ CMT
+ 21:00
+ Thursday
+
+
+ 26650
+ The Top 100: NFL's Greatest Players
+ http://www.tvrage.com/shows/id-26650
+ US
+ Sep/03/2010
+ Nov/04/2010
+ 1
+ New Series
+ 60
+ Sports
+
+ Sports
+
+ NFL Network
+ 21:00
+ Thursday
+
+
+ 7047
+ Top of the Pops Reloaded
+ http://www.tvrage.com/shows/id-7047
+ UK
+ Sep/2005
+ Mar/2006
+ 2
+ Canceled/Ended
+ 45
+ Variety
+
+ Children
+ Music
+ Sketch/Improv
+
+ CBBC
+ 11:00
+ Saturday
+
+
+ 19475
+ Top Model Ghana
+ http://www.tvrage.com/shows/id-19475
+ GH
+ Aug/26/2006
+ Oct/16/2006
+ 1
+ Canceled/Ended
+ 60
+ Reality
+
+ Celebrities
+ Family
+ Fashion/Make-up
+ Talent
+ Travel
+
+ GTV
+ 21:00
+ Monday
+
+ Ghana's Next Top Model
+ TMG
+ Top Model Ghana, Cycle
+
+
+
+ 31823
+ Top 100 Video Games of All Time
+ http://www.tvrage.com/shows/id-31823
+ US
+ Jun/11/2012
+
+ 1
+ New Series
+ 60
+ Mini-Series
+
+ Family
+ Teens
+
+ G4
+ 20:00
+ Weekdays
+
+
+ 25003
+ Cantore Stories: On Top of the World
+ http://www.tvrage.com/Cantore_Stories-On_Top_of_the_World
+ US
+ Jan/24/2010
+
+ 1
+ New Series
+ 60
+ Reality
+
+ Adventure
+ Educational
+ Family
+ Travel
+
+ The Weather Channel
+ 22:00
+ Sunday
+
+ Cantore Stories
+
+
+
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/Files/TvRage/SearchResults_one.xml b/NzbDrone.Core.Test/Files/TvRage/SearchResults_one.xml
new file mode 100644
index 000000000..4517c22bc
--- /dev/null
+++ b/NzbDrone.Core.Test/Files/TvRage/SearchResults_one.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ 27518
+ Suits
+ http://www.tvrage.com/Suits
+ US
+ Jun/23/2011
+
+ 2
+ Returning Series
+ 60
+ Scripted
+
+ Drama
+ Financial/Business
+
+ USA
+ 22:00
+ Thursday
+
+ A Legal Mind
+
+
+
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_empty.xml b/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_empty.xml
new file mode 100644
index 000000000..52671b237
--- /dev/null
+++ b/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_empty.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_one.xml b/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_one.xml
new file mode 100644
index 000000000..f5eddca5b
--- /dev/null
+++ b/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_one.xml
@@ -0,0 +1,22 @@
+
+
+
+ 29999
+ Anger Management
+ http://tvrage.com/shows/id-29999
+ 2
+ 2012
+ Jun/28/2012
+
+ US
+ Returning Series
+ Scripted
+
+ Comedy
+
+ 30
+ FX
+ 21:30
+ Thursday
+ GMT-5 -DST
+
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
index ae92b4807..fb07bea6a 100644
--- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
+++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
@@ -139,6 +139,7 @@
+
@@ -330,6 +331,15 @@
Designer
Always
+
+ Always
+
+
+ Always
+
+
+ Always
+
Always
diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs
new file mode 100644
index 000000000..bea08e55e
--- /dev/null
+++ b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs
@@ -0,0 +1,57 @@
+// ReSharper disable RedundantUsingDirective
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using FluentAssertions;
+using Moq;
+using NUnit.Framework;
+using Ninject;
+using NzbDrone.Common;
+using NzbDrone.Core.Providers;
+using NzbDrone.Core.Test.Framework;
+using NzbDrone.Test.Common;
+using TvdbLib.Data;
+using TvdbLib.Exceptions;
+
+namespace NzbDrone.Core.Test.ProviderTests.TvRageProviderTests
+{
+ [TestFixture]
+ // ReSharper disable InconsistentNaming
+ public class GetSeriesFixture : CoreTest
+ {
+ private const string showinfo = "http://services.tvrage.com/feeds/showinfo.php?key=NW4v0PSmQIoVmpbASLdD&sid=";
+
+ private void WithEmptyResults()
+ {
+ Mocker.GetMock()
+ .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(showinfo)), null))
+ .Returns(new FileStream(@".\Files\TVRage\SeriesInfo_empty.xml", FileMode.Open, FileAccess.Read, FileShare.Read));
+ }
+
+ private void WithOneResult()
+ {
+ Mocker.GetMock()
+ .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(showinfo)), null))
+ .Returns(new FileStream(@".\Files\TVRage\SeriesInfo_one.xml", FileMode.Open, FileAccess.Read, FileShare.Read));
+ }
+
+ [Test]
+ public void should_be_null_when_no_showinfo_is_returned()
+ {
+ WithEmptyResults();
+ Mocker.Resolve().GetSeries(100).Should().BeNull();
+ }
+
+ [Test]
+ public void should_return_series_when_showinfo_is_valid()
+ {
+ WithOneResult();
+ var result = Mocker.Resolve().GetSeries(29999);
+
+ result.ShowId.Should().Be(29999);
+ result.Name.Should().Be("Anger Management");
+ }
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/ParseDayOfWeekFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/ParseDayOfWeekFixture.cs
new file mode 100644
index 000000000..95cf3699d
--- /dev/null
+++ b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/ParseDayOfWeekFixture.cs
@@ -0,0 +1,65 @@
+// ReSharper disable RedundantUsingDirective
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+using FluentAssertions;
+using NUnit.Framework;
+using Ninject;
+using NzbDrone.Common;
+using NzbDrone.Core.Providers;
+using NzbDrone.Core.Test.Framework;
+using NzbDrone.Test.Common;
+using TvdbLib.Data;
+using TvdbLib.Exceptions;
+
+namespace NzbDrone.Core.Test.ProviderTests.TvRageProviderTests
+{
+ [TestFixture]
+ // ReSharper disable InconsistentNaming
+ public class ParseDayOfWeekFixture : CoreTest
+ {
+ [Test]
+ public void should_return_null_if_xelement_is_null()
+ {
+ Mocker.Resolve().ParseDayOfWeek(null).Should().Be(null);
+ }
+
+ [Test]
+ public void should_return_null_if_value_is_null()
+ {
+ Mocker.Resolve().ParseDayOfWeek(new XElement("airday", null)).Should().Be(null);
+ }
+
+ [Test]
+ public void should_return_null_if_value_is_empty()
+ {
+ Mocker.Resolve().ParseDayOfWeek(new XElement("airday", "")).Should().Be(null);
+ }
+
+ [Test]
+ public void should_return_null_if_value_is_daily()
+ {
+ Mocker.Resolve().ParseDayOfWeek(new XElement("airday", "Daily")).Should().Be(null);
+ }
+
+ [Test]
+ public void should_return_null_if_value_is_weekdays()
+ {
+ Mocker.Resolve().ParseDayOfWeek(new XElement("airday", "Weekdays")).Should().Be(null);
+ }
+
+ [TestCase("Sunday", DayOfWeek.Sunday)]
+ [TestCase("Monday", DayOfWeek.Monday)]
+ [TestCase("Tuesday", DayOfWeek.Tuesday)]
+ [TestCase("Wednesday", DayOfWeek.Wednesday)]
+ [TestCase("Thursday", DayOfWeek.Thursday)]
+ [TestCase("Friday", DayOfWeek.Friday)]
+ [TestCase("Saturday", DayOfWeek.Saturday)]
+ public void should_return_dayOfWeek_when_it_is_valid(string value, DayOfWeek expected)
+ {
+ Mocker.Resolve().ParseDayOfWeek(new XElement("airday", value)).Should().Be(expected);
+ }
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20121218.cs b/NzbDrone.Core/Datastore/Migrations/Migration20121218.cs
new file mode 100644
index 000000000..00061a9e1
--- /dev/null
+++ b/NzbDrone.Core/Datastore/Migrations/Migration20121218.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Data;
+using Migrator.Framework;
+using NzbDrone.Common;
+
+namespace NzbDrone.Core.Datastore.Migrations
+{
+ [Migration(20121218)]
+ public class Migration20121218 : NzbDroneMigration
+ {
+ protected override void MainDbUpgrade()
+ {
+ Database.AddColumn("Series", new Column("TvRageId", DbType.Int32, ColumnProperty.Null));
+ Database.AddColumn("Series", new Column("TvRageTitle", DbType.String, ColumnProperty.Null));
+ Database.AddColumn("Series", new Column("UtcOffset", DbType.Int32, ColumnProperty.Null));
+ }
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.Core/Model/TvRage/TvRageSearchResult.cs b/NzbDrone.Core/Model/TvRage/TvRageSearchResult.cs
index d109a991f..9d7c6a8b6 100644
--- a/NzbDrone.Core/Model/TvRage/TvRageSearchResult.cs
+++ b/NzbDrone.Core/Model/TvRage/TvRageSearchResult.cs
@@ -17,6 +17,6 @@ namespace NzbDrone.Core.Model.TvRage
public string Status { get; set; }
public int RunTime { get; set; }
public DateTime AirTime { get; set; }
- public DayOfWeek AirDay { get; set; }
+ public DayOfWeek? AirDay { get; set; }
}
}
diff --git a/NzbDrone.Core/Model/TvRage/TvRageSeries.cs b/NzbDrone.Core/Model/TvRage/TvRageSeries.cs
index 965738bbd..ebc69f022 100644
--- a/NzbDrone.Core/Model/TvRage/TvRageSeries.cs
+++ b/NzbDrone.Core/Model/TvRage/TvRageSeries.cs
@@ -19,7 +19,7 @@ namespace NzbDrone.Core.Model.TvRage
public int RunTime { get; set; }
public string Network { get; set; }
public DateTime AirTime { get; set; }
- public DayOfWeek AirDay { get; set; }
+ public DayOfWeek? AirDay { get; set; }
public int UtcOffset { get; set; }
}
}
diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj
index 4a0183fc6..402f146d9 100644
--- a/NzbDrone.Core/NzbDrone.Core.csproj
+++ b/NzbDrone.Core/NzbDrone.Core.csproj
@@ -228,6 +228,7 @@
+
@@ -346,6 +347,7 @@
+
diff --git a/NzbDrone.Core/Providers/SceneMappingProvider.cs b/NzbDrone.Core/Providers/SceneMappingProvider.cs
index ad70a6d65..d4f119d80 100644
--- a/NzbDrone.Core/Providers/SceneMappingProvider.cs
+++ b/NzbDrone.Core/Providers/SceneMappingProvider.cs
@@ -99,5 +99,15 @@ namespace NzbDrone.Core.Providers
return false;
}
+
+ public virtual string GetCleanName(int seriesId)
+ {
+ var item = _database.FirstOrDefault("WHERE SeriesId = @0", seriesId);
+
+ if (item == null)
+ return null;
+
+ return item.CleanTitle;
+ }
}
}
diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs
index ecbded829..37e3e4dfb 100644
--- a/NzbDrone.Core/Providers/SeriesProvider.cs
+++ b/NzbDrone.Core/Providers/SeriesProvider.cs
@@ -21,11 +21,13 @@ namespace NzbDrone.Core.Providers
private readonly SceneMappingProvider _sceneNameMappingProvider;
private readonly BannerProvider _bannerProvider;
private readonly MetadataProvider _metadataProvider;
+ private readonly TvRageMappingProvider _tvRageMappingProvider;
private static readonly Regex TimeRegex = new Regex(@"^(?