From a052a9389e6fed0b43a0b0040be217d74abe43bc Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 31 Mar 2013 13:25:39 -0700 Subject: [PATCH] fully replaced TVDB with Trakt.tv --- NzbDrone.Api/Series/SeriesLookupModule.cs | 13 +- .../EnsureThat/StringExtensions.cs | 32 +- NzbDrone.Common/Eventing/EventAggregator.cs | 1 - NzbDrone.Common/NzbDrone.Common.csproj | 1 - .../Datastore/DatabaseRelationshipFixture.cs | 4 +- .../Files/TvRage/SearchResults_empty.xml | 3 - .../Files/TvRage/SearchResults_many.xml | 420 ------------------ .../Files/TvRage/SearchResults_one.xml | 26 -- .../Files/TvRage/SeriesInfo_empty.xml | 3 - .../Files/TvRage/SeriesInfo_one.xml | 22 - .../TracktProxyFixture.cs} | 32 +- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 22 +- .../FindMatchingTvRageSeriesFixture.cs | 96 ---- .../ProcessResultsFixture.cs | 92 ---- .../TvRageProviderTests/GetSeriesFixture.cs | 56 --- .../GetUtcOffsetFixture.cs | 48 -- .../SearchSeriesFixture.cs | 80 ---- NzbDrone.Core/Datastore/BasicRepository.cs | 1 + .../Datastore/Migration/Migration20130324.cs | 1 + NzbDrone.Core/Datastore/TableMapping.cs | 9 +- NzbDrone.Core/MediaCover/MediaCover.cs | 4 +- NzbDrone.Core/MediaCover/MediaCoverService.cs | 2 +- .../MetadataSource/IProvideEpisodeInfo.cs | 10 + .../MetadataSource/IProvideSeriesInfo.cs | 9 + .../MetadataSource/ISearchForNewSeries.cs | 10 + NzbDrone.Core/MetadataSource/Trakt/Actor.cs | 8 + NzbDrone.Core/MetadataSource/Trakt/Episode.cs | 18 + NzbDrone.Core/MetadataSource/Trakt/Images.cs | 9 + NzbDrone.Core/MetadataSource/Trakt/People.cs | 9 + NzbDrone.Core/MetadataSource/Trakt/Ratings.cs | 10 + NzbDrone.Core/MetadataSource/Trakt/Season.cs | 12 + NzbDrone.Core/MetadataSource/Trakt/Show.cs | 34 ++ NzbDrone.Core/MetadataSource/Trakt/Stats.cs | 14 + .../MetadataSource/Trakt/TopEpisode.cs | 12 + .../MetadataSource/Trakt/TopWatcher.cs | 17 + NzbDrone.Core/MetadataSource/TraktProxy.cs | 82 ++++ NzbDrone.Core/MetadataSource/TvDbProxy.cs | 160 ------- .../MetadataSource/TvRageMappingProvider.cs | 71 --- NzbDrone.Core/MetadataSource/TvRageProxy.cs | 166 ------- NzbDrone.Core/Model/TvRage/TvRageEpisode.cs | 17 - .../Model/TvRage/TvRageSearchResult.cs | 22 - NzbDrone.Core/Model/TvRage/TvRageSeries.cs | 25 -- NzbDrone.Core/NzbDrone.Core.csproj | 37 +- NzbDrone.Core/Tv/EpisodeService.cs | 8 +- NzbDrone.Core/Tv/Series.cs | 6 +- NzbDrone.Core/Tv/SeriesRepository.cs | 7 +- NzbDrone.Core/Tv/SeriesService.cs | 33 +- NzbDrone.Core/Tvdb/Tvdb.Sync.cs | 223 ---------- NzbDrone.Core/Tvdb/Tvdb.cs | 205 --------- NzbDrone.Core/Tvdb/TvdbActor.cs | 36 -- NzbDrone.Core/Tvdb/TvdbAsyncResult.cs | 10 - NzbDrone.Core/Tvdb/TvdbBanner.cs | 86 ---- NzbDrone.Core/Tvdb/TvdbEpisodes.cs | 132 ------ NzbDrone.Core/Tvdb/TvdbLanguages.cs | 30 -- NzbDrone.Core/Tvdb/TvdbMirrors.cs | 40 -- NzbDrone.Core/Tvdb/TvdbSeriesBase.cs | 131 ------ NzbDrone.Core/Tvdb/TvdbSeriesFull.cs | 21 - NzbDrone.Core/Tvdb/TvdbSeriesSearch.cs | 18 - NzbDrone.Core/Tvdb/TvdbSeriesSearchItem.cs | 50 --- NzbDrone.Core/Tvdb/TvdbServerTime.cs | 13 - NzbDrone.Core/Tvdb/TvdbUpdate.cs | 86 ---- NzbDrone.Core/Tvdb/TvdbUpdateItems.cs | 26 -- NzbDrone.sln.DotSettings | 1 + 63 files changed, 353 insertions(+), 2529 deletions(-) delete mode 100644 NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml delete mode 100644 NzbDrone.Core.Test/Files/TvRage/SearchResults_many.xml delete mode 100644 NzbDrone.Core.Test/Files/TvRage/SearchResults_one.xml delete mode 100644 NzbDrone.Core.Test/Files/TvRage/SeriesInfo_empty.xml delete mode 100644 NzbDrone.Core.Test/Files/TvRage/SeriesInfo_one.xml rename NzbDrone.Core.Test/{ProviderTests/TvDbProxyFixture.cs => MetadataSourceTests/TracktProxyFixture.cs} (70%) delete mode 100644 NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/FindMatchingTvRageSeriesFixture.cs delete mode 100644 NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/ProcessResultsFixture.cs delete mode 100644 NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs delete mode 100644 NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetUtcOffsetFixture.cs delete mode 100644 NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/SearchSeriesFixture.cs create mode 100644 NzbDrone.Core/MetadataSource/IProvideEpisodeInfo.cs create mode 100644 NzbDrone.Core/MetadataSource/IProvideSeriesInfo.cs create mode 100644 NzbDrone.Core/MetadataSource/ISearchForNewSeries.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Actor.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Episode.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Images.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/People.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Ratings.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Season.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Show.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/Stats.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/TopEpisode.cs create mode 100644 NzbDrone.Core/MetadataSource/Trakt/TopWatcher.cs create mode 100644 NzbDrone.Core/MetadataSource/TraktProxy.cs delete mode 100644 NzbDrone.Core/MetadataSource/TvDbProxy.cs delete mode 100644 NzbDrone.Core/MetadataSource/TvRageMappingProvider.cs delete mode 100644 NzbDrone.Core/MetadataSource/TvRageProxy.cs delete mode 100644 NzbDrone.Core/Model/TvRage/TvRageEpisode.cs delete mode 100644 NzbDrone.Core/Model/TvRage/TvRageSearchResult.cs delete mode 100644 NzbDrone.Core/Model/TvRage/TvRageSeries.cs delete mode 100644 NzbDrone.Core/Tvdb/Tvdb.Sync.cs delete mode 100644 NzbDrone.Core/Tvdb/Tvdb.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbActor.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbAsyncResult.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbBanner.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbEpisodes.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbLanguages.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbMirrors.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbSeriesBase.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbSeriesFull.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbSeriesSearch.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbSeriesSearchItem.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbServerTime.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbUpdate.cs delete mode 100644 NzbDrone.Core/Tvdb/TvdbUpdateItems.cs diff --git a/NzbDrone.Api/Series/SeriesLookupModule.cs b/NzbDrone.Api/Series/SeriesLookupModule.cs index 4f9b70a54..e8a2b1a7d 100644 --- a/NzbDrone.Api/Series/SeriesLookupModule.cs +++ b/NzbDrone.Api/Series/SeriesLookupModule.cs @@ -1,27 +1,24 @@ -using System.Linq; -using Nancy; +using Nancy; using NzbDrone.Api.Extensions; -using NzbDrone.Api.QualityType; using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.Providers; namespace NzbDrone.Api.Series { public class SeriesLookupModule : NzbDroneApiModule { - private readonly TvDbProxy _tvDbProxy; + private readonly ISearchForNewSeries _searchProxy; - public SeriesLookupModule(TvDbProxy tvDbProxy) + public SeriesLookupModule(ISearchForNewSeries searchProxy) : base("/Series/lookup") { - _tvDbProxy = tvDbProxy; + _searchProxy = searchProxy; Get["/"] = x => GetQualityType(); } private Response GetQualityType() { - var tvDbResults = _tvDbProxy.SearchSeries((string)Request.Query.term); + var tvDbResults = _searchProxy.SearchForNewSeries((string)Request.Query.term); return tvDbResults.AsResponse(); } } diff --git a/NzbDrone.Common/EnsureThat/StringExtensions.cs b/NzbDrone.Common/EnsureThat/StringExtensions.cs index b2e4e8560..1f16b30ab 100644 --- a/NzbDrone.Common/EnsureThat/StringExtensions.cs +++ b/NzbDrone.Common/EnsureThat/StringExtensions.cs @@ -1,15 +1,39 @@ +using System.Text.RegularExpressions; +using System.Linq; + namespace NzbDrone.Common.EnsureThat { - internal static class StringExtensions + public static class StringExtensions { - internal static string Inject(this string format, params object[] formattingArgs) + public static string Inject(this string format, params object[] formattingArgs) { return string.Format(format, formattingArgs); } - internal static string Inject(this string format, params string[] formattingArgs) + public static string Inject(this string format, params string[] formattingArgs) { - return string.Format(format, formattingArgs); + return string.Format(format, formattingArgs.Cast()); + } + + + private static readonly Regex InvalidCharRegex = new Regex(@"[^a-z0-9\s-]", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex CollapseSpace = new Regex(@"\s+", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public static string ToSlug(this string phrase) + { + phrase = phrase.RemoveAccent().ToLower(); + + phrase = InvalidCharRegex.Replace(phrase, string.Empty); + phrase = CollapseSpace.Replace(phrase, " ").Trim(); + phrase = phrase.Replace(" ", "-"); + + return phrase; + } + + public static string RemoveAccent(this string txt) + { + var bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt); + return System.Text.Encoding.ASCII.GetString(bytes); } } } \ No newline at end of file diff --git a/NzbDrone.Common/Eventing/EventAggregator.cs b/NzbDrone.Common/Eventing/EventAggregator.cs index 58a7290e4..11bfa52f2 100644 --- a/NzbDrone.Common/Eventing/EventAggregator.cs +++ b/NzbDrone.Common/Eventing/EventAggregator.cs @@ -29,7 +29,6 @@ namespace NzbDrone.Common.Eventing _logger.Debug("{0} <- {1}", message.GetType().Name, handler.GetType().Name); } - foreach (var handler in _handlers().OfType>()) { var handlerLocal = handler; diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index cb7fd388e..ec3b28cd5 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -137,7 +137,6 @@ - diff --git a/NzbDrone.Core.Test/Datastore/DatabaseRelationshipFixture.cs b/NzbDrone.Core.Test/Datastore/DatabaseRelationshipFixture.cs index c78c5a4b5..a98f8e9eb 100644 --- a/NzbDrone.Core.Test/Datastore/DatabaseRelationshipFixture.cs +++ b/NzbDrone.Core.Test/Datastore/DatabaseRelationshipFixture.cs @@ -13,7 +13,7 @@ namespace NzbDrone.Core.Test.Datastore [TestFixture] public class DatabaseRelationshipFixture : DbTest { - [Test] +/* [Test] [Explicit] public void benchmark() { @@ -70,7 +70,7 @@ namespace NzbDrone.Core.Test.Datastore var loadedSeries = Db.Single(); loadedSeries.Covers.Value.Should().HaveSameCount(covers); - } + }*/ [Test] public void one_to_one() diff --git a/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml b/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml deleted file mode 100644 index 4f8843778..000000000 --- a/NzbDrone.Core.Test/Files/TvRage/SearchResults_empty.xml +++ /dev/null @@ -1,3 +0,0 @@ - - -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 deleted file mode 100644 index 31206736b..000000000 --- a/NzbDrone.Core.Test/Files/TvRage/SearchResults_many.xml +++ /dev/null @@ -1,420 +0,0 @@ - - - - - 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 deleted file mode 100644 index 4517c22bc..000000000 --- a/NzbDrone.Core.Test/Files/TvRage/SearchResults_one.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - 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 deleted file mode 100644 index 52671b237..000000000 --- a/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_empty.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ 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 deleted file mode 100644 index f5eddca5b..000000000 --- a/NzbDrone.Core.Test/Files/TvRage/SeriesInfo_one.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 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/ProviderTests/TvDbProxyFixture.cs b/NzbDrone.Core.Test/MetadataSourceTests/TracktProxyFixture.cs similarity index 70% rename from NzbDrone.Core.Test/ProviderTests/TvDbProxyFixture.cs rename to NzbDrone.Core.Test/MetadataSourceTests/TracktProxyFixture.cs index c1364f95f..e1e30136d 100644 --- a/NzbDrone.Core.Test/ProviderTests/TvDbProxyFixture.cs +++ b/NzbDrone.Core.Test/MetadataSourceTests/TracktProxyFixture.cs @@ -5,19 +5,17 @@ using NUnit.Framework; using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Test.Framework; -namespace NzbDrone.Core.Test.ProviderTests +namespace NzbDrone.Core.Test.MetadataSourceTests { [TestFixture] - - public class TvDbProxyFixture : CoreTest + public class TraktProxyFixture : CoreTest { [TestCase("The Simpsons")] - [TestCase("Family Guy")] [TestCase("South Park")] [TestCase("Franklin & Bash")] public void successful_search(string title) { - var result = Subject.SearchSeries(title); + var result = Subject.SearchForNewSeries(title); result.Should().NotBeEmpty(); result[0].Title.Should().Be(title); @@ -27,14 +25,23 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void no_search_result() { - var result = Subject.SearchSeries(Guid.NewGuid().ToString()); + var result = Subject.SearchForNewSeries(Guid.NewGuid().ToString()); result.Should().BeEmpty(); } + [Test] + public void should_be_able_to_get_series_detail() + { + var details = Subject.GetSeriesInfo(75978); + + details.Should().NotBeNull(); + details.Images.Should().NotBeEmpty(); + } + [Test] public void none_unique_season_episode_number() { - var result = Subject.GetEpisodes(75978);//Family guy + var result = Subject.GetEpisodeInfo(75978);//Family guy result.GroupBy(e => e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000")) .Max(e => e.Count()).Should().Be(1); @@ -42,20 +49,13 @@ namespace NzbDrone.Core.Test.ProviderTests result.Select(c => c.TvDbEpisodeId).Should().OnlyHaveUniqueItems(); } - [Test] - public void should_be_able_to_get_series_detail() - { - var details = Subject.GetSeries(75978); - details.Should().NotBeNull(); - details.Covers.Value.Should().NotBeEmpty(); - } [Test] public void should_be_able_to_get_list_of_episodes() { - var details = Subject.GetEpisodes(75978); + var details = Subject.GetEpisodeInfo(75978); details.Should().NotBeEmpty(); } } -} \ 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 dd35ad5cc..e02b20f08 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -155,16 +155,12 @@ + - - - - - @@ -245,7 +241,6 @@ - @@ -355,21 +350,6 @@ Designer Always - - Always - - - Always - - - Always - - - Always - - - Always - Always diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/FindMatchingTvRageSeriesFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/FindMatchingTvRageSeriesFixture.cs deleted file mode 100644 index da00aecf2..000000000 --- a/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/FindMatchingTvRageSeriesFixture.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using FizzWare.NBuilder; -using FluentAssertions; -using NUnit.Framework; -using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.ReferenceData; -using NzbDrone.Core.Tv; -using NzbDrone.Core.Model.TvRage; -using NzbDrone.Core.Providers; - -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests.TvRageMappingProviderTests -{ - public class FindMatchingTvRageSeriesFixture : TestBase - { - private IList _searchResults; - private Series _series; - private Episode _episode; - private TvRageSeries _tvRageSeries; - - [SetUp] - public void Setup() - { - _searchResults = Builder - .CreateListOfSize(5) - .Build(); - - _series = Builder - .CreateNew() - .With(s => s.TvRageId = 0) - .With(s => s.TvRageTitle = null) - .With(s => s.UtcOffset = 0) - .With(s => s.FirstAired = DateTime.Today.AddDays(-180)) - .Build(); - - _episode = Builder - .CreateNew() - .With(e => e.AirDate = DateTime.Today.AddDays(-365)) - .Build(); - - _tvRageSeries = Builder - .CreateNew() - .With(s => s.UtcOffset = -8) - .Build(); - - Mocker.GetMock() - .Setup(s => s.GetEpisode(_series.Id, 1, 1)) - .Returns(_episode); - - Mocker.GetMock() - .Setup(s => s.GetCleanName(_series.Id)) - .Returns(""); - - Mocker.GetMock() - .Setup(s => s.SearchSeries(_series.Title)) - .Returns(_searchResults); - - Mocker.GetMock() - .Setup(s => s.GetSeries(_searchResults.First().ShowId)) - .Returns(_tvRageSeries); - } - - private void WithMatchingResult() - { - _series.CleanTitle = Parser.NormalizeTitle(_searchResults.First().Name); - } - - [Test] - public void should_not_set_tvRage_info_when_result_is_null() - { - var result = Mocker.Resolve() - .FindMatchingTvRageSeries(_series); - - result.TvRageId.Should().Be(0); - result.TvRageTitle.Should().Be(null); - result.UtcOffset.Should().Be(0); - } - - [Test] - public void should_set_tvRage_info_when_result_is_returned() - { - WithMatchingResult(); - - var result = Mocker.Resolve() - .FindMatchingTvRageSeries(_series); - - result.TvRageId.Should().Be(_searchResults.First().ShowId); - result.TvRageTitle.Should().Be(_searchResults.First().Name); - result.UtcOffset.Should().Be(_tvRageSeries.UtcOffset); - } - } -} diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/ProcessResultsFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/ProcessResultsFixture.cs deleted file mode 100644 index b3e5c9fdd..000000000 --- a/NzbDrone.Core.Test/ProviderTests/TvRageMappingProviderTests/ProcessResultsFixture.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using FizzWare.NBuilder; -using FluentAssertions; -using NUnit.Framework; -using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.Tv; -using NzbDrone.Core.Model.TvRage; -using NzbDrone.Core.Providers; - -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests.TvRageMappingProviderTests -{ - public class ProcessResultsFixture : TestBase - { - private IList _searchResults; - private Series _series; - private Episode _episode; - - [SetUp] - public void Setup() - { - _searchResults = Builder - .CreateListOfSize(5) - .Build(); - - _series = Builder - .CreateNew() - .With(s => s.FirstAired = DateTime.Today.AddDays(-180)) - .Build(); - - _episode = Builder - .CreateNew() - .With(e => e.AirDate = DateTime.Today.AddDays(-365)) - .Build(); - } - - [Test] - public void should_return_null_if_no_match_is_found() - { - Mocker.Resolve() - .ProcessResults(_searchResults, _series, "nomatchhere", _episode) - .Should() - .BeNull(); - } - - [Test] - public void should_return_result_if_series_clean_name_matches() - { - _series.CleanTitle = Parser.NormalizeTitle(_searchResults.First().Name); - - Mocker.Resolve() - .ProcessResults(_searchResults, _series, "nomatchhere", _episode) - .Should() - .Be(_searchResults.First()); - } - - [Test] - public void should_return_result_if_scene_clean_name_matches() - { - Mocker.Resolve() - .ProcessResults(_searchResults, _series, Parser.NormalizeTitle(_searchResults.First().Name), _episode) - .Should() - .Be(_searchResults.First()); - } - - [Test] - public void should_return_result_if_series_firstAired_matches() - { - _series.FirstAired = _searchResults.Last().Started; - - Mocker.Resolve() - .ProcessResults(_searchResults, _series, "nomatchhere", _episode) - .Should() - .Be(_searchResults.Last()); - } - - [Test] - public void should_return_result_if_episode_firstAired_matches() - { - _episode.AirDate = _searchResults.Last().Started; - - Mocker.Resolve() - .ProcessResults(_searchResults, _series, "nomatchhere", _episode) - .Should() - .Be(_searchResults.Last()); - } - } -} diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs deleted file mode 100644 index 93916c4c3..000000000 --- a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetSeriesFixture.cs +++ /dev/null @@ -1,56 +0,0 @@ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using FluentAssertions; -using Moq; -using NUnit.Framework; -using NzbDrone.Common; -using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.Providers; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests.TvRageProviderTests -{ - [TestFixture] - - 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(OpenRead("Files", "TVRage", "SeriesInfo_empty.xml")); - } - - private void WithOneResult() - { - Mocker.GetMock() - .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(showinfo)), null)) - .Returns(OpenRead("Files", "TVRage", "SeriesInfo_one.xml")); - } - - [Test] - public void should_be_null_when_no_showinfo_is_returned() - { - WithEmptyResults(); - Mocker.Resolve().GetSeries(100).Should().BeNull(); - - ExceptionVerification.ExpectedWarns(1); - } - - [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/GetUtcOffsetFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetUtcOffsetFixture.cs deleted file mode 100644 index 5105fbaf1..000000000 --- a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/GetUtcOffsetFixture.cs +++ /dev/null @@ -1,48 +0,0 @@ - - -using System; -using System.Collections.Generic; -using System.Linq; -using FluentAssertions; -using NUnit.Framework; -using NzbDrone.Common; -using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.Providers; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests.TvRageProviderTests -{ - [TestFixture] - - public class GetUtcOffsetFixture : CoreTest - { - [Test] - public void should_return_zero_if_timeZone_is_empty() - { - Mocker.Resolve().GetUtcOffset("").Should().Be(0); - } - - [Test] - public void should_return_zero_if_cannot_be_coverted_to_int() - { - Mocker.Resolve().GetUtcOffset("adfhadfhdjaf").Should().Be(0); - } - - [TestCase("GMT-5", -5)] - [TestCase("GMT+0", 0)] - [TestCase("GMT+8", 8)] - public void should_return_offset_when_not_dst(string timezone, int expected) - { - Mocker.Resolve().GetUtcOffset(timezone).Should().Be(expected); - } - - [TestCase("GMT-5 +DST", -4)] - [TestCase("GMT+0 +DST", 1)] - [TestCase("GMT+8 +DST", 9)] - public void should_return_offset_plus_one_when_dst(string timezone, int expected) - { - Mocker.Resolve().GetUtcOffset(timezone).Should().Be(expected); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/SearchSeriesFixture.cs b/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/SearchSeriesFixture.cs deleted file mode 100644 index 534a51c7b..000000000 --- a/NzbDrone.Core.Test/ProviderTests/TvRageProviderTests/SearchSeriesFixture.cs +++ /dev/null @@ -1,80 +0,0 @@ - - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using FluentAssertions; -using Moq; -using NUnit.Framework; -using NzbDrone.Common; -using NzbDrone.Core.MetadataSource; -using NzbDrone.Core.Providers; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.ProviderTests.TvRageProviderTests -{ - [TestFixture] - - public class SearchSeriesFixture : CoreTest - { - private const string search = "http://services.tvrage.com/feeds/full_search.php?show="; - - private void WithEmptyResults() - { - Mocker.GetMock() - .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(search)), null)) - .Returns(OpenRead("Files", "TVRage", "SearchResults_empty.xml")); - } - - private void WithManyResults() - { - Mocker.GetMock() - .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(search)), null)) - .Returns(OpenRead("Files", "TVRage", "SearchResults_many.xml")); - } - - private void WithOneResult() - { - Mocker.GetMock() - .Setup(s => s.DownloadStream(It.Is(u => u.StartsWith(search)), null)) - .Returns(OpenRead("Files", "TVRage", "earchResults_one.xml")); - } - - [Test] - public void should_be_empty_when_no_results_are_found() - { - WithEmptyResults(); - Mocker.Resolve().SearchSeries("asdasdasdasdas").Should().BeEmpty(); - } - - [Test] - public void should_be_have_more_than_one_when_multiple_results_are_returned() - { - WithManyResults(); - Mocker.Resolve().SearchSeries("top+gear").Should().NotBeEmpty(); - } - - [Test] - public void should_have_one_when_only_one_result_is_found() - { - WithOneResult(); - Mocker.Resolve().SearchSeries("suits").Should().HaveCount(1); - } - - [Test] - public void ended_should_not_have_a_value_when_series_has_not_ended() - { - WithOneResult(); - Mocker.Resolve().SearchSeries("suits").First().Ended.HasValue.Should().BeFalse(); - } - - [Test] - public void started_should_match_series() - { - WithOneResult(); - Mocker.Resolve().SearchSeries("suits").First().Started.Should().Be(new DateTime(2011, 6, 23)); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/BasicRepository.cs b/NzbDrone.Core/Datastore/BasicRepository.cs index 02147daa2..71f2604e7 100644 --- a/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/NzbDrone.Core/Datastore/BasicRepository.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using Marr.Data; using Marr.Data.QGen; +using NzbDrone.Core.Tv; namespace NzbDrone.Core.Datastore diff --git a/NzbDrone.Core/Datastore/Migration/Migration20130324.cs b/NzbDrone.Core/Datastore/Migration/Migration20130324.cs index adf29adff..1fe8418d3 100644 --- a/NzbDrone.Core/Datastore/Migration/Migration20130324.cs +++ b/NzbDrone.Core/Datastore/Migration/Migration20130324.cs @@ -122,6 +122,7 @@ namespace NzbDrone.Core.Datastore.Migration .WithColumn("Status").AsInt32().NotNullable() .WithColumn("Overview").AsString().Nullable() .WithColumn("AirTime").AsString().Nullable() + .WithColumn("Images").AsString() .WithColumn("Language").AsString().NotNullable() .WithColumn("Path").AsString().NotNullable() .WithColumn("Monitored").AsBoolean().NotNullable() diff --git a/NzbDrone.Core/Datastore/TableMapping.cs b/NzbDrone.Core/Datastore/TableMapping.cs index 0d093f4ca..0f6fab020 100644 --- a/NzbDrone.Core/Datastore/TableMapping.cs +++ b/NzbDrone.Core/Datastore/TableMapping.cs @@ -39,17 +39,13 @@ namespace NzbDrone.Core.Datastore Mapper.Entity().RegisterModel("SceneMappings"); Mapper.Entity().RegisterModel("History") - .HasOne(h => h.Episode, h => h.EpisodeId); + .HasOne(h => h.Episode, h => h.EpisodeId); - Mapper.Entity().RegisterModel("Series") - .Relationships.AutoMapComplexTypeProperties() - .For(c => c.Covers) - .LazyLoad((db, series) => db.Query().Where(cover => cover.SeriesId == series.Id).ToList()); + Mapper.Entity().RegisterModel("Series"); Mapper.Entity().RegisterModel("Seasons"); Mapper.Entity().RegisterModel("Episodes"); Mapper.Entity().RegisterModel("EpisodeFiles"); - Mapper.Entity().RegisterModel("MediaCovers"); Mapper.Entity().RegisterModel("QualityProfiles").For(q => q.DbAllowed).SetColumnName("Allowed").Ignore(q => q.Allowed); Mapper.Entity().RegisterModel("QualitySizes"); @@ -63,6 +59,7 @@ namespace NzbDrone.Core.Datastore MapRepository.Instance.RegisterTypeConverter(typeof(Boolean), new BooleanIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Enum), new EnumIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(QualityModel), new EmbeddedDocumentConverter()); + MapRepository.Instance.RegisterTypeConverter(typeof(MediaCover.MediaCover), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Quality), new QualityIntConverter()); } } diff --git a/NzbDrone.Core/MediaCover/MediaCover.cs b/NzbDrone.Core/MediaCover/MediaCover.cs index f9354b572..93f29100d 100644 --- a/NzbDrone.Core/MediaCover/MediaCover.cs +++ b/NzbDrone.Core/MediaCover/MediaCover.cs @@ -1,4 +1,3 @@ -using System.Linq; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.MediaCover @@ -11,10 +10,9 @@ namespace NzbDrone.Core.MediaCover Fanart = 2 } - public class MediaCover : ModelBase + public class MediaCover : IEmbeddedDocument { public MediaCoverTypes CoverType { get; set; } public string Url { get; set; } - public int SeriesId { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Core/MediaCover/MediaCoverService.cs b/NzbDrone.Core/MediaCover/MediaCoverService.cs index b98413f65..78276b07e 100644 --- a/NzbDrone.Core/MediaCover/MediaCoverService.cs +++ b/NzbDrone.Core/MediaCover/MediaCoverService.cs @@ -37,7 +37,7 @@ namespace NzbDrone.Core.MediaCover private void EnsureCovers(Series series) { - foreach (var cover in series.Covers.Value) + foreach (var cover in series.Images) { var fileName = GetCoverPath(series.Id, cover.CoverType); if (!_diskProvider.FileExists(fileName)) diff --git a/NzbDrone.Core/MetadataSource/IProvideEpisodeInfo.cs b/NzbDrone.Core/MetadataSource/IProvideEpisodeInfo.cs new file mode 100644 index 000000000..d3c8728cc --- /dev/null +++ b/NzbDrone.Core/MetadataSource/IProvideEpisodeInfo.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.MetadataSource +{ + public interface IProvideEpisodeInfo + { + IList GetEpisodeInfo(int tvDbSeriesId); + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/IProvideSeriesInfo.cs b/NzbDrone.Core/MetadataSource/IProvideSeriesInfo.cs new file mode 100644 index 000000000..2205a483e --- /dev/null +++ b/NzbDrone.Core/MetadataSource/IProvideSeriesInfo.cs @@ -0,0 +1,9 @@ +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.MetadataSource +{ + public interface IProvideSeriesInfo + { + Series GetSeriesInfo(int tvDbSeriesId); + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/ISearchForNewSeries.cs b/NzbDrone.Core/MetadataSource/ISearchForNewSeries.cs new file mode 100644 index 000000000..5abd02bcc --- /dev/null +++ b/NzbDrone.Core/MetadataSource/ISearchForNewSeries.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.MetadataSource +{ + public interface ISearchForNewSeries + { + List SearchForNewSeries(string title); + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Actor.cs b/NzbDrone.Core/MetadataSource/Trakt/Actor.cs new file mode 100644 index 000000000..2c0922770 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Actor.cs @@ -0,0 +1,8 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Actor + { + public string name { get; set; } + public string character { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Episode.cs b/NzbDrone.Core/MetadataSource/Trakt/Episode.cs new file mode 100644 index 000000000..03eaa8c67 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Episode.cs @@ -0,0 +1,18 @@ +using System; + +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Episode + { + public int season { get; set; } + public int episode { get; set; } + public int number { get; set; } + public int tvdb_id { get; set; } + public string title { get; set; } + public string overview { get; set; } + public DateTime? first_aired { get; set; } + public string url { get; set; } + public string screen { get; set; } + public Ratings ratings { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Images.cs b/NzbDrone.Core/MetadataSource/Trakt/Images.cs new file mode 100644 index 000000000..f1e791132 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Images.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Images + { + public string poster { get; set; } + public string fanart { get; set; } + public string banner { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/People.cs b/NzbDrone.Core/MetadataSource/Trakt/People.cs new file mode 100644 index 000000000..5a4a97755 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/People.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class People + { + public List actors { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Ratings.cs b/NzbDrone.Core/MetadataSource/Trakt/Ratings.cs new file mode 100644 index 000000000..7ca617121 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Ratings.cs @@ -0,0 +1,10 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Ratings + { + public int percentage { get; set; } + public int votes { get; set; } + public int loved { get; set; } + public int hated { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Season.cs b/NzbDrone.Core/MetadataSource/Trakt/Season.cs new file mode 100644 index 000000000..ac741b5c2 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Season.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Season + { + public int season { get; set; } + public List episodes { get; set; } + public string url { get; set; } + public string poster { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Show.cs b/NzbDrone.Core/MetadataSource/Trakt/Show.cs new file mode 100644 index 000000000..dde25f9d4 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Show.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Show + { + public string title { get; set; } + public int year { get; set; } + public string url { get; set; } + public DateTime? first_aired { get; set; } + public string country { get; set; } + public string overview { get; set; } + public int runtime { get; set; } + public string status { get; set; } + public string network { get; set; } + public string air_day { get; set; } + public string air_time { get; set; } + public string certification { get; set; } + public string imdb_id { get; set; } + public int tvdb_id { get; set; } + public int tvrage_id { get; set; } + public int last_updated { get; set; } + public string poster { get; set; } + public Images images { get; set; } + public List top_watchers { get; set; } + public List top_episodes { get; set; } + public Ratings ratings { get; set; } + public Stats stats { get; set; } + public People people { get; set; } + public List genres { get; set; } + public List seasons { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/Stats.cs b/NzbDrone.Core/MetadataSource/Trakt/Stats.cs new file mode 100644 index 000000000..ed0243b33 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/Stats.cs @@ -0,0 +1,14 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class Stats + { + public int watchers { get; set; } + public int plays { get; set; } + public int scrobbles { get; set; } + public int scrobbles_unique { get; set; } + public int checkins { get; set; } + public int checkins_unique { get; set; } + public int collection { get; set; } + public int collection_unique { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/TopEpisode.cs b/NzbDrone.Core/MetadataSource/Trakt/TopEpisode.cs new file mode 100644 index 000000000..2db3d173e --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/TopEpisode.cs @@ -0,0 +1,12 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class TopEpisode + { + public int plays { get; set; } + public int season { get; set; } + public int number { get; set; } + public string title { get; set; } + public string url { get; set; } + public int first_aired { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/Trakt/TopWatcher.cs b/NzbDrone.Core/MetadataSource/Trakt/TopWatcher.cs new file mode 100644 index 000000000..5dbffdc2e --- /dev/null +++ b/NzbDrone.Core/MetadataSource/Trakt/TopWatcher.cs @@ -0,0 +1,17 @@ +namespace NzbDrone.Core.MetadataSource.Trakt +{ + public class TopWatcher + { + public int plays { get; set; } + public string username { get; set; } + public bool @protected { get; set; } + public object full_name { get; set; } + public object gender { get; set; } + public string age { get; set; } + public object location { get; set; } + public object about { get; set; } + public int joined { get; set; } + public string avatar { get; set; } + public string url { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/TraktProxy.cs b/NzbDrone.Core/MetadataSource/TraktProxy.cs new file mode 100644 index 000000000..bd24ff274 --- /dev/null +++ b/NzbDrone.Core/MetadataSource/TraktProxy.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using System.Linq; +using NzbDrone.Core.MediaCover; +using NzbDrone.Core.MetadataSource.Trakt; +using NzbDrone.Core.Tv; +using RestSharp; +using NzbDrone.Common.EnsureThat; +using Episode = NzbDrone.Core.Tv.Episode; + +namespace NzbDrone.Core.MetadataSource +{ + public class TraktProxy : ISearchForNewSeries, IProvideSeriesInfo, IProvideEpisodeInfo + { + public List SearchForNewSeries(string title) + { + var client = BuildClient("search", "shows"); + var restRequest = new RestRequest(title.ToSlug().Replace("-", "+")); + var response = client.Execute>(restRequest); + + return response.Data.Select(MapSeries).ToList(); + } + + + public Series GetSeriesInfo(int tvDbSeriesId) + { + var client = BuildClient("show", "summary"); + var restRequest = new RestRequest(tvDbSeriesId.ToString()); + var response = client.Execute(restRequest); + + return MapSeries(response.Data); + } + + public IList GetEpisodeInfo(int tvDbSeriesId) + { + var client = BuildClient("show", "summary"); + var restRequest = new RestRequest(tvDbSeriesId.ToString() + "/extended"); + var response = client.Execute(restRequest); + + return response.Data.seasons.SelectMany(c => c.episodes).Select(MapEpisode).ToList(); + } + + + private static IRestClient BuildClient(string resource, string method) + { + return new RestClient(string.Format("http://api.trakt.tv/{0}/{1}.json/6fc98f83c6a02decd17eb7e13d00e89c", resource, method)); + } + + private static Series MapSeries(Show show) + { + var series = new Series(); + series.TvDbId = show.tvdb_id; + series.TvRageId = show.tvrage_id; + series.Title = show.title; + series.FirstAired = show.first_aired; + series.Overview = show.overview; + series.Runtime = show.runtime; + series.Network = show.network; + series.AirTime = show.air_time; + + series.Images.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Banner, Url = show.images.banner }); + series.Images.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Poster, Url = show.images.poster }); + series.Images.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Fanart, Url = show.images.fanart }); + return series; + } + + private static Episode MapEpisode(Trakt.Episode traktEpisode) + { + var episode = new Episode(); + episode.Overview = traktEpisode.overview; + episode.SeasonNumber = traktEpisode.season; + episode.EpisodeNumber = traktEpisode.episode; + episode.EpisodeNumber = traktEpisode.number; + episode.TvDbEpisodeId = traktEpisode.tvdb_id; + episode.Title = traktEpisode.title; + episode.AirDate = traktEpisode.first_aired; + + return episode; + } + + + } +} \ No newline at end of file diff --git a/NzbDrone.Core/MetadataSource/TvDbProxy.cs b/NzbDrone.Core/MetadataSource/TvDbProxy.cs deleted file mode 100644 index 3a271aaf4..000000000 --- a/NzbDrone.Core/MetadataSource/TvDbProxy.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using NLog; -using NzbDrone.Core.Datastore; -using NzbDrone.Core.MediaCover; -using NzbDrone.Core.Tv; -using NzbDrone.Common; - -namespace NzbDrone.Core.MetadataSource -{ - public class TvDbProxy - { - public const string TVDB_APIKEY = "5D2D188E86E07F4F"; - private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - - - - private readonly Tvdb.Tvdb _handlerV2; - - - public TvDbProxy() - { - _handlerV2 = new Tvdb.Tvdb(TVDB_APIKEY); - } - - public virtual List SearchSeries(string title) - { - logger.Debug("Searching TVDB for '{0}'", title); - - if (title.Contains(" & ")) - { - title = title.Replace(" & ", " "); - } - - var searchResult = _handlerV2.SearchSeries(title).Select(tvdbSeriesSearchItem => new Series - { - TvDbId = tvdbSeriesSearchItem.seriesid, - Title = tvdbSeriesSearchItem.SeriesName, - FirstAired = tvdbSeriesSearchItem.FirstAired, - Overview = tvdbSeriesSearchItem.Overview - }).ToList(); - - logger.Debug("Search for '{0}' returned {1} possible results", title, searchResult.Count); - return searchResult; - } - - public virtual Series GetSeries(int tvDbSeriesId) - { - var tvDbSeries = _handlerV2.GetSeriesBaseRecord("http://thetvdb.com", tvDbSeriesId); - - var series = new Series(); - - series.Title = tvDbSeries.SeriesName; - series.AirTime = CleanAirsTime(tvDbSeries.Airs_Time); - series.Overview = tvDbSeries.Overview; - series.Status = tvDbSeries.Status == "Continuing" ? SeriesStatusType.Continuing : SeriesStatusType.Ended; - series.Language = tvDbSeries.Language ?? string.Empty; - series.CleanTitle = Parser.NormalizeTitle(tvDbSeries.SeriesName); - series.LastInfoSync = DateTime.Now; - - if (tvDbSeries.Runtime.HasValue) - { - series.Runtime = Convert.ToInt32(tvDbSeries.Runtime); - } - - - if (!string.IsNullOrWhiteSpace(tvDbSeries.banner)) - { - series.Covers.Value.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Banner, Url = tvDbSeries.banner, SeriesId = series.Id }); - } - - if (!string.IsNullOrWhiteSpace(tvDbSeries.fanart)) - { - series.Covers.Value.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Fanart, Url = tvDbSeries.fanart, SeriesId = series.Id }); - } - - if (!string.IsNullOrWhiteSpace(tvDbSeries.poster)) - { - series.Covers.Value.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Poster, Url = tvDbSeries.poster, SeriesId = series.Id }); - } - - series.Network = tvDbSeries.Network; - - if (tvDbSeries.FirstAired.HasValue && tvDbSeries.FirstAired.Value.Year > 1900) - { - series.FirstAired = tvDbSeries.FirstAired.Value.Date; - } - else - { - series.FirstAired = null; - } - - return series; - } - - public virtual IList GetEpisodes(int tvDbSeriesId) - { - var seriesRecord = _handlerV2.GetSeriesFullRecord("http://thetvdb.com", tvDbSeriesId); - - var tvdbEpisodes = seriesRecord.Episodes.OrderByDescending(e => e.FirstAired).ThenByDescending(e => e.EpisodeName) - .GroupBy(e => e.seriesid.ToString("000000") + e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000")) - .Select(e => e.First()); - - - var episodes = new List(); - - foreach (var tvDbEpisode in tvdbEpisodes) - { - var episode = new Episode(); - - episode.TvDbEpisodeId = tvDbEpisode.id; - episode.EpisodeNumber = tvDbEpisode.EpisodeNumber; - episode.SeasonNumber = tvDbEpisode.SeasonNumber; - episode.AbsoluteEpisodeNumber = tvDbEpisode.absolute_number.ParseInt32(); - episode.Title = tvDbEpisode.EpisodeName; - episode.Overview = tvDbEpisode.Overview; - - if (tvDbEpisode.FirstAired.Year > 1900) - { - episode.AirDate = tvDbEpisode.FirstAired.Date; - } - else - { - episode.AirDate = null; - } - - episodes.Add(episode); - } - - return episodes; - } - - /// - /// Cleans up the AirsTime Component from TheTVDB since it can be garbage that comes in. - /// - /// The TVDB AirsTime - /// String that contains the AirTimes - - private static readonly Regex timeRegex = new Regex(@"^(? diff --git a/NzbDrone.Core/Tv/EpisodeService.cs b/NzbDrone.Core/Tv/EpisodeService.cs index a7b44711e..96c7aac5a 100644 --- a/NzbDrone.Core/Tv/EpisodeService.cs +++ b/NzbDrone.Core/Tv/EpisodeService.cs @@ -46,16 +46,16 @@ namespace NzbDrone.Core.Tv private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - private readonly TvDbProxy _tvDbProxy; + private readonly IProvideEpisodeInfo _episodeInfoProxy; private readonly ISeasonRepository _seasonRepository; private readonly IEpisodeRepository _episodeRepository; private readonly IEventAggregator _eventAggregator; private readonly IConfigService _configService; private readonly Logger _logger; - public EpisodeService(TvDbProxy tvDbProxyProxy, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository, IEventAggregator eventAggregator, IConfigService configService, Logger logger) + public EpisodeService(IProvideEpisodeInfo episodeInfoProxy, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository, IEventAggregator eventAggregator, IConfigService configService, Logger logger) { - _tvDbProxy = tvDbProxyProxy; + _episodeInfoProxy = episodeInfoProxy; _seasonRepository = seasonRepository; _episodeRepository = episodeRepository; _eventAggregator = eventAggregator; @@ -193,7 +193,7 @@ namespace NzbDrone.Core.Tv var successCount = 0; var failCount = 0; - var tvdbEpisodes = _tvDbProxy.GetEpisodes(series.TvDbId); + var tvdbEpisodes = _episodeInfoProxy.GetEpisodeInfo(series.TvDbId); var seriesEpisodes = GetEpisodeBySeries(series.Id); var updateList = new List(); diff --git a/NzbDrone.Core/Tv/Series.cs b/NzbDrone.Core/Tv/Series.cs index e8ea024a1..b7c93256c 100644 --- a/NzbDrone.Core/Tv/Series.cs +++ b/NzbDrone.Core/Tv/Series.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using NzbDrone.Core.Datastore; +using NzbDrone.Core.MetadataSource.Trakt; using NzbDrone.Core.Model; using NzbDrone.Core.Qualities; @@ -17,7 +19,7 @@ namespace NzbDrone.Core.Tv { public Series() { - Covers = new LazyList(); + Images =new List(); } public int TvDbId { get; set; } @@ -34,7 +36,7 @@ namespace NzbDrone.Core.Tv public DateTime? LastInfoSync { get; set; } public DateTime? LastDiskSync { get; set; } public int Runtime { get; set; } - public LazyList Covers { get; set; } + public List Images { get; set; } public SeriesTypes SeriesType { get; set; } public BacklogSettingType BacklogSetting { get; set; } public string Network { get; set; } diff --git a/NzbDrone.Core/Tv/SeriesRepository.cs b/NzbDrone.Core/Tv/SeriesRepository.cs index cf9b0bd6f..1c80d302a 100644 --- a/NzbDrone.Core/Tv/SeriesRepository.cs +++ b/NzbDrone.Core/Tv/SeriesRepository.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Data; using System.Linq; using NzbDrone.Core.Datastore; @@ -12,6 +11,7 @@ namespace NzbDrone.Core.Tv Series GetByTitle(string cleanTitle); Series FindByTvdbId(int tvdbId); void SetSeriesType(int seriesId, SeriesTypes seriesTypes); + void SetTvRageId(int seriesId, int tvRageId); } public class SeriesRepository : BasicRepository, ISeriesRepository @@ -45,5 +45,10 @@ namespace NzbDrone.Core.Tv { SetFields(new Series { Id = seriesId, SeriesType = seriesType }, s => s.SeriesType); } + + public void SetTvRageId(int seriesId, int tvRageId) + { + SetFields(new Series { Id = seriesId, TvRageId = tvRageId }, s => s.TvRageId); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Tv/SeriesService.cs b/NzbDrone.Core/Tv/SeriesService.cs index adf56950c..1e5fc7074 100644 --- a/NzbDrone.Core/Tv/SeriesService.cs +++ b/NzbDrone.Core/Tv/SeriesService.cs @@ -30,8 +30,7 @@ namespace NzbDrone.Core.Tv { private readonly ISeriesRepository _seriesRepository; private readonly IConfigService _configService; - private readonly TvDbProxy _tvDbProxy; - private readonly TvRageMappingProvider _tvRageMappingProvider; + private readonly IProvideSeriesInfo _seriesInfoProxy; private readonly IEventAggregator _eventAggregator; private readonly IQualityProfileService _qualityProfileService; private readonly Logger _logger; @@ -40,14 +39,13 @@ namespace NzbDrone.Core.Tv private readonly ISceneMappingService _sceneNameMappingService; public SeriesService(ISeriesRepository seriesRepository, IConfigService configServiceService, - TvDbProxy tvDbProxyProxy, ISceneMappingService sceneNameMappingService, - TvRageMappingProvider tvRageMappingProvider, IEventAggregator eventAggregator, IQualityProfileService qualityProfileService, Logger logger) + IProvideSeriesInfo seriesInfoProxy, ISceneMappingService sceneNameMappingService, + IEventAggregator eventAggregator, IQualityProfileService qualityProfileService, Logger logger) { _seriesRepository = seriesRepository; _configService = configServiceService; - _tvDbProxy = tvDbProxyProxy; + _seriesInfoProxy = seriesInfoProxy; _sceneNameMappingService = sceneNameMappingService; - _tvRageMappingProvider = tvRageMappingProvider; _eventAggregator = eventAggregator; _qualityProfileService = qualityProfileService; _logger = logger; @@ -63,7 +61,7 @@ namespace NzbDrone.Core.Tv public Series UpdateSeriesInfo(int seriesId) { var series = _seriesRepository.Get(seriesId); - var tvDbSeries = _tvDbProxy.GetSeries(series.TvDbId); + var tvDbSeries = _seriesInfoProxy.GetSeriesInfo(series.TvDbId); series.Title = tvDbSeries.Title; series.AirTime = tvDbSeries.AirTime; @@ -73,23 +71,9 @@ namespace NzbDrone.Core.Tv series.CleanTitle = tvDbSeries.CleanTitle; series.LastInfoSync = DateTime.Now; series.Runtime = tvDbSeries.Runtime; - series.Covers = tvDbSeries.Covers; + series.Images = tvDbSeries.Images; series.Network = tvDbSeries.Network; series.FirstAired = tvDbSeries.FirstAired; - - try - { - if (series.TvRageId == 0) - { - series = _tvRageMappingProvider.FindMatchingTvRageSeries(series); - } - } - - catch (Exception ex) - { - _logger.ErrorException("Error getting TvRage information for series: " + series.Title, ex); - } - _seriesRepository.Update(series); _eventAggregator.Publish(new SeriesUpdatedEvent(series)); @@ -164,6 +148,11 @@ namespace NzbDrone.Core.Tv } + public void SetTvRageId(int seriesId, int tvRageId) + { + _seriesRepository.SetTvRageId(seriesId, tvRageId); + } + public Series FindByTvdbId(int tvdbId) { return _seriesRepository.FindByTvdbId(tvdbId); diff --git a/NzbDrone.Core/Tvdb/Tvdb.Sync.cs b/NzbDrone.Core/Tvdb/Tvdb.Sync.cs deleted file mode 100644 index 6ea0904d9..000000000 --- a/NzbDrone.Core/Tvdb/Tvdb.Sync.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using RestSharp; -using RestSharp.Deserializers; - -namespace NzbDrone.Core.Tvdb -{ - public partial class Tvdb - { - private T ProcessRequest (RestRequest request) - where T: new() - { - return ProcessRequest(BASE_URL, request); - } - - private T ProcessRequest (string url, RestRequest request) - where T: new() - { - var client = new RestClient(url); - client.AddHandler("text/xml", new DotNetXmlDeserializer()); - - if(Timeout.HasValue) - client.Timeout = Timeout.Value; - -#if !WINDOWS_PHONE - if(Proxy != null) - client.Proxy = Proxy; -#endif - - Error = null; - - //var resp = client.Execute(request); - IRestResponse resp = client.Execute(request); - - ResponseContent = resp.Content; - ResponseHeaders = resp.Headers.ToDictionary(k => k.Name, v => v.Value); - - if(resp.ResponseStatus == ResponseStatus.Completed) - { - return resp.Data; - - // Manual deserialization - //TextReader r = new StringReader(resp.Content); - //XmlSerializer s = new XmlSerializer(typeof(T)); - //return (T)s.Deserialize(r); - } - else - { - if(resp.ErrorException != null) - throw resp.ErrorException; - else - Error = resp.ErrorMessage; - } - - return default(T); - } - - public TvdbMirrors GetMirrors() - { - return ProcessRequest(BuildGetMirrorsRequest()); - } - - /// - /// http://www.thetvdb.com/api/Updates.php?type=none - /// - /// - public TvdbServerTime GetServerTime() - { - return ProcessRequest(BuildGetServerTimeRequest()); - } - - /// - /// http://www.thetvdb.com/api/{apikey}/languages.xml - /// - /// - public List GetLanguages() - { - var root = ProcessRequest(BuildGetLanguagesRequest()); - if(root != null) - return root.Languages; - - return null; - } - - - /// - /// http://www.thetvdb.com/api/GetSeries.php?seriesname={series} - /// - /// - /// - public List SearchSeries(string search) - { - var root = ProcessRequest(BuildGetSearchSeriesRequest(search)); - if(root != null) - return root.Series; - - return null; - } - - /// - /// http://thetvdb.com/api/{apikey}/series/79349/en.xml - /// - /// - /// - /// - /// - public TvdbSeriesBase GetSeriesBaseRecord(string XMLMirror, int SeriesId, string Language) - { - if(string.IsNullOrEmpty(Language)) - Language = "en"; - - var root = ProcessRequest(XMLMirror, - BuildGetSeriesBaseRecordRequest(SeriesId, Language)); - if(root != null) - return root.Series; - - return null; - } - - public TvdbSeriesBase GetSeriesBaseRecord(string XMLMirror, int SeriesId) - { - return GetSeriesBaseRecord(XMLMirror, SeriesId, null); - } - - /// - /// http://thetvdb.com/api/{apikey}/series/79349/all/en.xml - /// - /// - /// - /// - /// - public TvdbSeriesFull GetSeriesFullRecord(string XMLMirror, int SeriesId, string Language) - { - if(string.IsNullOrEmpty(Language)) - Language = "en"; - - return ProcessRequest(XMLMirror, BuildGetSeriesFullRecordRequest(SeriesId, Language)); - } - - public TvdbSeriesFull GetSeriesFullRecord(string MirrorPath, int SeriesId) - { - return GetSeriesFullRecord(MirrorPath, SeriesId, null); - } - - /// - /// http://thetvdb.com/api/{apikey}/series/79349/banners.xml - /// - /// - /// - /// - public List GetSeriesBanners(string XMLMirror, int SeriesId) - { - var root = ProcessRequest(XMLMirror, BuildGetSeriesBannersRequest(SeriesId)); - if(root != null) - return root.Banners; - - return null; - } - - /// - /// http://thetvdb.com/api/{apikey}/series/79349/actors.xml - /// - /// - /// - /// - public List GetSeriesActors(string XMLMirror, int SeriesId) - { - var root = ProcessRequest(XMLMirror, BuildGetSeriesActorsRequest(SeriesId)); - if(root != null) - return root.Actors; - - return null; - } - - public TvdbEpisode GetEpisode(string XMLMirror, int EpisodeId, string Language) - { - if(string.IsNullOrEmpty(Language)) - Language = "en"; - - var root = ProcessRequest(XMLMirror, BuildGetEpisodeRequest(EpisodeId, Language)); - if(root != null) - return root.Episode; - - return null; - } - - public TvdbEpisode GetEpisode(string XMLMirror, int EpisodeId) - { - return GetEpisode(XMLMirror, EpisodeId, null); - } - - public TvdbEpisode GetSeriesEpisode(string XMLMirror, int SeriesId, int SeasonNum, int EpisodeNum, - string Language) - { - if(string.IsNullOrEmpty(Language)) - Language = "en"; - - var root = ProcessRequest(XMLMirror, - BuildGetSeriesEpisodeRequest(SeriesId, SeasonNum, EpisodeNum, - Language)); - if(root != null) - return root.Episode; - - return null; - } - - public TvdbEpisode GetSeriesEpisode(string XMLMirror, int SeriesId, int SeasonNum, int EpisodeNum) - { - return GetSeriesEpisode(XMLMirror, SeriesId, SeasonNum, EpisodeNum, null); - } - - public TvdbUpdates GetUpdates(string XMLMirror, TvdbUpdatePeriod Period) - { - return ProcessRequest(XMLMirror, BuildGetUpdatesRequest(Period)); - } - - public TvdbUpdateItems GetUpdatesSince(string XMLMirror, Int64 LastTime) - { - return ProcessRequest(XMLMirror, BuildGetUpdatesSinceRequest(LastTime)); - } - } -} diff --git a/NzbDrone.Core/Tvdb/Tvdb.cs b/NzbDrone.Core/Tvdb/Tvdb.cs deleted file mode 100644 index 4f4fabefc..000000000 --- a/NzbDrone.Core/Tvdb/Tvdb.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using RestSharp; - -namespace NzbDrone.Core.Tvdb -{ - public partial class Tvdb - { - private const string BASE_URL = "http://www.thetvdb.com/api"; - - public string ApiKey { get; set; } - public string Error { get; set; } - - /// - /// String representation of response content - /// - public string ResponseContent { get; set; } - - /// - /// Dictionary of Header values in response - /// http://help.themoviedb.org/kb/api/content-versioning - /// - public Dictionary ResponseHeaders { get; set; } - -#if !WINDOWS_PHONE - /// - /// Proxy to use for requests made. Passed on to underying WebRequest if set. - /// - public IWebProxy Proxy { get; set; } -#endif - - /// - /// Timeout in milliseconds to use for requests made. - /// - public int? Timeout { get; set; } - - public Tvdb(string apiKey) - { - ApiKey = apiKey; - Error = null; - Timeout = null; - } - - #region Helper methods - - public static string GetImageUrl(string BannerMirror, string filename) - { - return string.Format("{0}/banners/{1}", BannerMirror, filename); - } - -#if !WINDOWS_PHONE - public static byte[] GetImage(string BannerMirror, string filename) - { - return GetImage(GetImageUrl(BannerMirror, filename)); - } - - public static byte[] GetImage(string url) - { - return new WebClient().DownloadData(url); - } -#endif - - #endregion - - #region Build Requests - - private RestRequest BuildGetMirrorsRequest(object UserState = null) - { - var request = new RestRequest("{apikey}/mirrors.xml", Method.GET); - request.AddUrlSegment("apikey", ApiKey); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private static RestRequest BuildGetServerTimeRequest(object UserState = null) - { - var request = new RestRequest("Updates.php", Method.GET); - request.AddParameter("type", "none"); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetLanguagesRequest(object UserState = null) - { - var request = new RestRequest("{apikey}/languages.xml", Method.GET); - request.AddUrlSegment("apikey", ApiKey); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private static RestRequest BuildGetSearchSeriesRequest(string search, object UserState = null) - { - var request = new RestRequest("GetSeries.php", Method.GET); - request.AddParameter("seriesname", search); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetSeriesBaseRecordRequest(int SeriesId, string Language, object UserState = null) - { - var request = new RestRequest("api/{apikey}/series/{id}/{lang}.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", SeriesId.ToString()); - request.AddUrlSegment("lang", Language); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetSeriesFullRecordRequest(int SeriesId, string Language, object UserState = null) - { - var request = new RestRequest("api/{apikey}/series/{id}/all/{lang}.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", SeriesId.ToString()); - request.AddUrlSegment("lang", Language); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetSeriesBannersRequest(int SeriesId, object UserState = null) - { - var request = new RestRequest("api/{apikey}/series/{id}/banners.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", SeriesId.ToString()); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetSeriesActorsRequest(int SeriesId, object UserState = null) - { - var request = new RestRequest("api/{apikey}/series/{id}/actors.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", SeriesId.ToString()); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetEpisodeRequest(int EpisodeId, string Language, object UserState = null) - { - var request = new RestRequest("api/{apikey}/episodes/{id}/{lang}.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", EpisodeId.ToString()); - request.AddUrlSegment("lang", Language); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetSeriesEpisodeRequest(int SeriesId, int SeasonNum, int EpisodeNum, string Language, - object UserState = null) - { - var request = new RestRequest("api/{apikey}/series/{id}/default/{season}/{episode}/{lang}.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("id", SeriesId.ToString()); - request.AddUrlSegment("season", SeasonNum.ToString()); - request.AddUrlSegment("episode", EpisodeNum.ToString()); - request.AddUrlSegment("lang", Language); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private RestRequest BuildGetUpdatesRequest(TvdbUpdatePeriod Period, object UserState = null) - { - var request = new RestRequest("api/{apikey}/updates/updates_{period}.xml"); - request.AddUrlSegment("apikey", ApiKey); - request.AddUrlSegment("period", Period.ToString()); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - private static RestRequest BuildGetUpdatesSinceRequest(Int64 LastTime, object UserState = null) - { - var request = new RestRequest("api/Updates.php?type=all&time={time}"); - request.AddUrlSegment("time", LastTime.ToString()); - if(UserState != null) - request.UserState = UserState; - - return request; - } - - #endregion - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbActor.cs b/NzbDrone.Core/Tvdb/TvdbActor.cs deleted file mode 100644 index c6487e6f6..000000000 --- a/NzbDrone.Core/Tvdb/TvdbActor.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Actors")] - public class TvdbActorRoot - { - public TvdbActorRoot() - { - Actors = new List(); - } - - [XmlElement(ElementName = "Actor")] - public List Actors { get; set; } - } - - public class TvdbActor - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string Image { get; set; } - - [XmlElement] - public string Name { get; set; } - - [XmlElement] - public string Role { get; set; } - - [XmlElement] - public int SortOrder { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbAsyncResult.cs b/NzbDrone.Core/Tvdb/TvdbAsyncResult.cs deleted file mode 100644 index 4bb64b31e..000000000 --- a/NzbDrone.Core/Tvdb/TvdbAsyncResult.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Linq; - -namespace NzbDrone.Core.Tvdb -{ - public class TvdbAsyncResult - { - public T Data { get; set; } - public object UserState { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbBanner.cs b/NzbDrone.Core/Tvdb/TvdbBanner.cs deleted file mode 100644 index b1bc5f22a..000000000 --- a/NzbDrone.Core/Tvdb/TvdbBanner.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Banners")] - public class TvdbBannerRoot - { - public TvdbBannerRoot() - { - Banners = new List(); - } - - [XmlElement(ElementName = "Banner")] - public List Banners { get; set; } - } - - public class TvdbBanner - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string BannerPath { get; set; } - - [XmlElement] - public string BannerType { get; set; } - - [XmlElement] - public string BannerType2 { get; set; } - - [XmlElement] - public string Colors { get; set; } - - [XmlElement] - public string Language { get; set; } - - [XmlElement("Rating")] - public string RatingString - { - get { return Rating.HasValue ? Rating.Value.ToString() : null; } - set - { - double d; - if(double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out d)) - Rating = d; - else - Rating = null; - } - } - - [XmlIgnore] - public double? Rating { get; set; } - - [XmlElement] - public int? RatingCount { get; set; } - - [XmlElement(ElementName = "SeriesName")] - public string SeriesNameString - { - get { return SeriesName.HasValue ? SeriesName.Value.ToString() : null; } - set - { - bool b; - if(bool.TryParse(value, out b)) - SeriesName = b; - else - SeriesName = null; - } - } - - [XmlIgnore] - public bool? SeriesName { get; set; } - - [XmlElement] - public string ThumbnailPath { get; set; } - - [XmlElement] - public string VignettePath { get; set; } - - [XmlElement] - public string Season { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbEpisodes.cs b/NzbDrone.Core/Tvdb/TvdbEpisodes.cs deleted file mode 100644 index 79353d7f3..000000000 --- a/NzbDrone.Core/Tvdb/TvdbEpisodes.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Data")] - public class TvdbEpisodeRoot - { - [XmlElement] - public TvdbEpisode Episode { get; set; } - } - - public class TvdbEpisode - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string Combined_episodenumber { get; set; } - - [XmlElement] - public string Combined_season { get; set; } - - [XmlElement] - public string DVD_chapter { get; set; } - - [XmlElement] - public string DVD_discid { get; set; } - - [XmlElement] - public string DVD_episodenumber { get; set; } - - [XmlElement] - public string DVD_season { get; set; } - - [XmlElement] - public string Director { get; set; } - - [XmlElement(ElementName = "EpImgFlag")] - public string EpImgFlagString - { - get { return EpImgFlag.HasValue ? EpImgFlag.Value.ToString() : null; } - set - { - int i; - if(int.TryParse(value, out i)) - EpImgFlag = i; - else - EpImgFlag = null; - } - } - - [XmlIgnore] - public int? EpImgFlag { get; set; } - - [XmlElement] - public string EpisodeName { get; set; } - - [XmlElement] - public int EpisodeNumber { get; set; } - - [XmlElement] - public DateTime FirstAired { get; set; } - - [XmlElement] - public string GuestStars { get; set; } - - [XmlElement] - public string IMDB_ID { get; set; } - - [XmlElement] - public string Language { get; set; } - - [XmlElement] - public string Overview { get; set; } - - [XmlElement] - public string ProductionCode { get; set; } - - [XmlElement("Rating")] - public string RatingString - { - get { return Rating.HasValue ? Rating.Value.ToString() : null; } - set - { - double d; - if(double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out d)) - Rating = d; - else - Rating = null; - } - } - - [XmlIgnore] - public double? Rating { get; set; } - - [XmlElement] - public int? RatingCount { get; set; } - - [XmlElement] - public int SeasonNumber { get; set; } - - [XmlElement] - public string Writer { get; set; } - - [XmlElement] - public string absolute_number { get; set; } - - [XmlElement] - public string airsafter_season { get; set; } - - [XmlElement] - public string airsbefore_episode { get; set; } - - [XmlElement] - public string airsbefore_season { get; set; } - - [XmlElement] - public string filename { get; set; } - - [XmlElement] - public Int64 lastupdated { get; set; } - - [XmlElement] - public int? seasonid { get; set; } - - [XmlElement] - public int seriesid { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbLanguages.cs b/NzbDrone.Core/Tvdb/TvdbLanguages.cs deleted file mode 100644 index 03bf34b3e..000000000 --- a/NzbDrone.Core/Tvdb/TvdbLanguages.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Languages")] - public class TvdbLanguagesRoot - { - public TvdbLanguagesRoot() - { - Languages = new List(); - } - - [XmlElement(ElementName = "Language")] - public List Languages { get; set; } - } - - public class TvdbLanguage - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string name { get; set; } - - [XmlElement] - public string abbreviation { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbMirrors.cs b/NzbDrone.Core/Tvdb/TvdbMirrors.cs deleted file mode 100644 index 13f0a4a12..000000000 --- a/NzbDrone.Core/Tvdb/TvdbMirrors.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Mirrors")] - public class TvdbMirrors - { - [XmlElement(ElementName = "Mirror")] - public List Mirrors { get; set; } - } - - public class TvdbMirror - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string mirrorpath { get; set; } - - [XmlElement] - public int typemask { get; set; } - - public bool IsXMLMirror - { - get { return (typemask & 1) != 0; } - } - - public bool IsBannerMirror - { - get { return (typemask & 2) != 0; } - } - - public bool IsZipMirror - { - get { return (typemask & 4) != 0; } - } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbSeriesBase.cs b/NzbDrone.Core/Tvdb/TvdbSeriesBase.cs deleted file mode 100644 index dc6290d45..000000000 --- a/NzbDrone.Core/Tvdb/TvdbSeriesBase.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Data")] - public class TvdbSeriesRecordRoot - { - [XmlElement] - public TvdbSeriesBase Series { get; set; } - } - - public class TvdbSeriesBase - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public string Actors { get; set; } - - [XmlElement] - public string Airs_DayOfWeek { get; set; } - - [XmlElement] - public string Airs_Time { get; set; } - - [XmlElement] - public string ContentRating { get; set; } - - [XmlElement(ElementName = "FirstAired")] - public string FirstAiredString - { - get { return FirstAired.HasValue ? FirstAired.Value.ToString("yyyy-MM-dd") : null; } - set - { - DateTime d; - if(DateTime.TryParse(value, out d)) - FirstAired = d; - else - FirstAired = null; - } - } - - [XmlIgnore] - public DateTime? FirstAired { get; set; } - - [XmlElement] - public string Genre { get; set; } - - [XmlElement] - public string IMDB_ID { get; set; } - - [XmlElement] - public string Language { get; set; } - - [XmlElement] - public string Network { get; set; } - - [XmlElement] - public string Overview { get; set; } - - [XmlElement("Rating")] - public string RatingString - { - get { return Rating.HasValue ? Rating.Value.ToString() : null; } - set - { - double d; - if(double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out d)) - Rating = d; - else - Rating = null; - } - } - - [XmlIgnore] - public double? Rating { get; set; } - - [XmlElement] - public int? RatingCount { get; set; } - - [XmlElement] - public int? Runtime { get; set; } - - [XmlElement] - public string SeriesIDString - { - get { return SeriesID.HasValue ? SeriesID.Value.ToString() : null; } - set - { - int i; - if(int.TryParse(value, out i)) - SeriesID = i; - else - SeriesID = null; - } - } - - [XmlIgnore] - public int? SeriesID { get; set; } - - [XmlElement] - public string SeriesName { get; set; } - - [XmlElement] - public string Status { get; set; } - - [XmlElement] - public string added { get; set; } - - [XmlElement] - public string addedBy { get; set; } - - [XmlElement] - public string banner { get; set; } - - [XmlElement] - public string fanart { get; set; } - - [XmlElement] - public Int64 lastupdated { get; set; } - - [XmlElement] - public string poster { get; set; } - - [XmlElement] - public string zap2it_id { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbSeriesFull.cs b/NzbDrone.Core/Tvdb/TvdbSeriesFull.cs deleted file mode 100644 index 8f51eef3c..000000000 --- a/NzbDrone.Core/Tvdb/TvdbSeriesFull.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Data")] - public class TvdbSeriesFull - { - public TvdbSeriesFull() - { - Episodes = new List(); - } - - [XmlElement] - public TvdbSeriesBase Series { get; set; } - - [XmlElement(ElementName = "Episode")] - public List Episodes { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbSeriesSearch.cs b/NzbDrone.Core/Tvdb/TvdbSeriesSearch.cs deleted file mode 100644 index cfb13db32..000000000 --- a/NzbDrone.Core/Tvdb/TvdbSeriesSearch.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Data")] - public class TvdbSeriesSearchRoot - { - public TvdbSeriesSearchRoot() - { - Series = new List(); - } - - [XmlElement(ElementName = "Series")] - public List Series { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbSeriesSearchItem.cs b/NzbDrone.Core/Tvdb/TvdbSeriesSearchItem.cs deleted file mode 100644 index 8411416a0..000000000 --- a/NzbDrone.Core/Tvdb/TvdbSeriesSearchItem.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - public class TvdbSeriesSearchItem - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public int seriesid { get; set; } - - [XmlElement] - public string language { get; set; } - - [XmlElement] - public string SeriesName { get; set; } - - [XmlElement] - public string banner { get; set; } - - [XmlElement] - public string Overview { get; set; } - - [XmlElement(ElementName = "FirstAired")] - public string FirstAiredString - { - get { return FirstAired.HasValue ? FirstAired.Value.ToString("yyyy-MM-dd") : null; } - set - { - DateTime d; - if(DateTime.TryParse(value, out d)) - FirstAired = d; - else - FirstAired = null; - } - } - - [XmlIgnore] - public DateTime? FirstAired { get; set; } - - [XmlElement] - public string IMDB_ID { get; set; } - - [XmlElement] - public string zap2it_id { get; set; } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/Tvdb/TvdbServerTime.cs b/NzbDrone.Core/Tvdb/TvdbServerTime.cs deleted file mode 100644 index 8bac42dea..000000000 --- a/NzbDrone.Core/Tvdb/TvdbServerTime.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Items")] - public class TvdbServerTime - { - [XmlElement] - public Int64 Time { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbUpdate.cs b/NzbDrone.Core/Tvdb/TvdbUpdate.cs deleted file mode 100644 index 5c4c11aae..000000000 --- a/NzbDrone.Core/Tvdb/TvdbUpdate.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - public enum TvdbUpdatePeriod - { - day, - week, - month - }; - - [XmlRoot(ElementName = "Data")] - public class TvdbUpdates - { - public TvdbUpdates() - { - Series = new List(); - } - - [XmlAttribute] - public Int64 time { get; set; } - - [XmlElement(ElementName = "Series")] - public List Series { get; set; } - - [XmlElement(ElementName = "Episode")] - public List Episodes { get; set; } - - [XmlElement(ElementName = "Banner")] - public List Banners { get; set; } - } - - public class TvdbUpdateSeries - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public Int64 time { get; set; } - } - - public class TvdbUpdateEpisode - { - [XmlElement] - public int id { get; set; } - - [XmlElement] - public int Series { get; set; } - - [XmlElement] - public Int64 time { get; set; } - } - - public class TvdbUpdateBanner - { - /// - /// fanart, poster, season, series, episode, actors - /// - [XmlElement] - public string type { get; set; } - - [XmlElement] - public string format { get; set; } - - [XmlElement] - public int Series { get; set; } - - /// - /// Only appears for season banners - /// - [XmlElement] - public int? SeasonNum { get; set; } - - [XmlElement] - public string language { get; set; } - - [XmlElement] - public string path { get; set; } - - [XmlElement] - public Int64 time { get; set; } - } -} diff --git a/NzbDrone.Core/Tvdb/TvdbUpdateItems.cs b/NzbDrone.Core/Tvdb/TvdbUpdateItems.cs deleted file mode 100644 index 66ec26fd2..000000000 --- a/NzbDrone.Core/Tvdb/TvdbUpdateItems.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Serialization; - -namespace NzbDrone.Core.Tvdb -{ - [XmlRoot(ElementName = "Items")] - public class TvdbUpdateItems - { - public TvdbUpdateItems() - { - Series = new List(); - Episodes = new List(); - } - - [XmlElement] - public Int64 Time { get; set; } - - [XmlElement(ElementName = "Series")] - public List Series { get; set; } - - [XmlElement(ElementName = "Episode")] - public List Episodes { get; set; } - } -} diff --git a/NzbDrone.sln.DotSettings b/NzbDrone.sln.DotSettings index 134731d7a..17f08160c 100644 --- a/NzbDrone.sln.DotSettings +++ b/NzbDrone.sln.DotSettings @@ -4,6 +4,7 @@ DO_NOT_SHOW DO_NOT_SHOW ERROR + HINT <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb"><ExtraRule Prefix="" Suffix="" Style="AaBb" /></Policy> BOTH_SIDES