From 87cf09685c0be3347e3cce08ebfc9cd0207d7ce0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 17 Dec 2012 17:52:56 -0800 Subject: [PATCH] Backend work for omgwtfnzbs --- NzbDrone.Core.Test/IndexerTests.cs | 36 +++++ NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 6 + NzbDrone.Core/CentralDispatch.cs | 1 + NzbDrone.Core/NzbDrone.Core.csproj | 1 + .../Providers/Core/ConfigProvider.cs | 12 ++ NzbDrone.Core/Providers/Indexer/Omgwtfnzbs.cs | 126 ++++++++++++++++++ 6 files changed, 182 insertions(+) create mode 100644 NzbDrone.Core/Providers/Indexer/Omgwtfnzbs.cs diff --git a/NzbDrone.Core.Test/IndexerTests.cs b/NzbDrone.Core.Test/IndexerTests.cs index fd71f1714..09c26e1d2 100644 --- a/NzbDrone.Core.Test/IndexerTests.cs +++ b/NzbDrone.Core.Test/IndexerTests.cs @@ -32,6 +32,7 @@ namespace NzbDrone.Core.Test [TestCase("filesharingtalk.xml")] [TestCase("nzbindex.xml")] [TestCase("nzbclub.xml")] + [TestCase("omgwtfnzbs.xml")] public void parse_feed_xml(string fileName) { Mocker.GetMock() @@ -68,6 +69,9 @@ namespace NzbDrone.Core.Test Mocker.GetMock().SetupGet(c => c.FileSharingTalkUid).Returns("MockedConfigValue"); Mocker.GetMock().SetupGet(c => c.FileSharingTalkSecret).Returns("MockedConfigValue"); + + Mocker.GetMock().SetupGet(c => c.OmgwtfnzbsUsername).Returns("MockedConfigValue"); + Mocker.GetMock().SetupGet(c => c.OmgwtfnzbsApiKey).Returns("MockedConfigValue"); } [Test] @@ -209,6 +213,22 @@ namespace NzbDrone.Core.Test parseResults[0].Size.Should().Be(2652142305); } + [Test] + public void size_omgwtfnzbs() + { + WithConfiguredIndexers(); + + Mocker.GetMock() + .Setup(h => h.DownloadStream("http://rss.omgwtfnzbs.com/rss-search.php?catid=19,20&user=MockedConfigValue&api=MockedConfigValue&eng=1", It.IsAny())) + .Returns(File.OpenRead(".\\Files\\Rss\\SizeParsing\\omgwtfnzbs.xml")); + + //Act + var parseResults = Mocker.Resolve().FetchRss(); + + parseResults.Should().HaveCount(1); + parseResults[0].Size.Should().Be(236820890); + } + [Test] public void Server_Unavailable_503_should_not_log_exception() { @@ -452,5 +472,21 @@ namespace NzbDrone.Core.Test { Mocker.Resolve().GetQueryTitle(seriesTitle).Should().Be(expected); } + + [Test] + public void should_get_nzbInfoUrl_for_omgwtfnzbs() + { + WithConfiguredIndexers(); + + Mocker.GetMock() + .Setup(h => h.DownloadStream("http://rss.omgwtfnzbs.com/rss-search.php?catid=19,20&user=MockedConfigValue&api=MockedConfigValue&eng=1", It.IsAny())) + .Returns(File.OpenRead(".\\Files\\Rss\\SizeParsing\\omgwtfnzbs.xml")); + + //Act + var parseResults = Mocker.Resolve().FetchRss(); + + parseResults.Should().HaveCount(1); + parseResults[0].NzbInfoUrl.Should().Be("http://omgwtfnzbs.com/details.php?id=OAl4g"); + } } } \ 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 01459ee65..347380962 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -279,12 +279,18 @@ Always + + Always + Always Always + + Always + Always diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 137eeb4d9..cbf11b4b3 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -92,6 +92,7 @@ namespace NzbDrone.Core Kernel.Bind().To(); Kernel.Bind().To(); Kernel.Bind().To(); + Kernel.Bind().To(); var indexers = Kernel.GetAll(); Kernel.Get().InitializeIndexers(indexers.ToList()); diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 360b57ed2..26db534af 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -311,6 +311,7 @@ + diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index 8ce01e061..dee849168 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -517,6 +517,18 @@ namespace NzbDrone.Core.Providers.Core set { SetValue("RssSyncInterval", value); } } + public virtual string OmgwtfnzbsUsername + { + get { return GetValue("OmgwtfnzbsUsername", String.Empty); } + set { SetValue("OmgwtfnzbsUsername", value); } + } + + public virtual string OmgwtfnzbsApiKey + { + get { return GetValue("OmgwtfnzbsApiKey", String.Empty); } + set { SetValue("OmgwtfnzbsApiKey", value); } + } + private string GetValue(string key) { return GetValue(key, String.Empty); diff --git a/NzbDrone.Core/Providers/Indexer/Omgwtfnzbs.cs b/NzbDrone.Core/Providers/Indexer/Omgwtfnzbs.cs new file mode 100644 index 000000000..562e8e9ed --- /dev/null +++ b/NzbDrone.Core/Providers/Indexer/Omgwtfnzbs.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel.Syndication; +using System.Text; +using System.Text.RegularExpressions; +using Ninject; +using NzbDrone.Common; +using NzbDrone.Core.Model; +using NzbDrone.Core.Providers.Core; + +namespace NzbDrone.Core.Providers.Indexer +{ + class Omgwtfnzbs : IndexerBase + { + [Inject] + public Omgwtfnzbs(HttpProvider httpProvider, ConfigProvider configProvider) + : base(httpProvider, configProvider) + { + } + + public override string Name + { + get { return "omgwtfnzbs"; } + } + + protected override string[] Urls + { + get + { + return new string[] + { + String.Format("http://rss.omgwtfnzbs.com/rss-search.php?catid=19,20&user={0}&api={1}&eng=1", + _configProvider.OmgwtfnzbsUsername, _configProvider.OmgwtfnzbsApiKey) + }; + } + } + + public override bool IsConfigured + { + get + { + return !string.IsNullOrWhiteSpace(_configProvider.OmgwtfnzbsUsername) && + !string.IsNullOrWhiteSpace(_configProvider.OmgwtfnzbsApiKey); + } + } + + protected override IList GetEpisodeSearchUrls(string seriesTitle, int seasonNumber, int episodeNumber) + { + var searchUrls = new List(); + + foreach (var url in Urls) + { + searchUrls.Add(String.Format("{0}&search={1}+S{2:00}E{3:00}", url, seriesTitle, seasonNumber, episodeNumber)); + } + + return searchUrls; + } + + protected override IList GetDailyEpisodeSearchUrls(string seriesTitle, DateTime date) + { + var searchUrls = new List(); + + foreach (var url in Urls) + { + searchUrls.Add(String.Format("{0}&search={1}+{2:yyyy MM dd}", url, seriesTitle, date)); + } + + return searchUrls; + } + + protected override IList GetSeasonSearchUrls(string seriesTitle, int seasonNumber) + { + var searchUrls = new List(); + + foreach (var url in Urls) + { + searchUrls.Add(String.Format("{0}&search={1}+S{2:00}", url, seriesTitle, seasonNumber)); + } + + return searchUrls; + } + + protected override IList GetPartialSeasonSearchUrls(string seriesTitle, int seasonNumber, int episodeWildcard) + { + var searchUrls = new List(); + + foreach (var url in Urls) + { + searchUrls.Add(String.Format("{0}&search={1}+S{2:00}E{3}", url, seriesTitle, seasonNumber, episodeWildcard)); + } + + return searchUrls; + } + + protected override string NzbDownloadUrl(SyndicationItem item) + { + return item.Links[0].Uri.ToString(); + } + + protected override string NzbInfoUrl(SyndicationItem item) + { + //Todo: Me thinks I need to parse details to get this... + var match = Regex.Match(item.Summary.Text, @"(?:\View NZB\:\<\/b\>\s\.+)(?:\""\starget)", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + if(match.Success) + { + return match.Groups["URL"].Value; + } + + return String.Empty; + } + + protected override EpisodeParseResult CustomParser(SyndicationItem item, EpisodeParseResult currentResult) + { + if (currentResult != null) + { + var sizeString = Regex.Match(item.Summary.Text, @"Size:\<\/b\>\s\d+\.\d{1,2}\s\w{2}\
", RegexOptions.IgnoreCase | RegexOptions.Compiled).Value; + currentResult.Size = Parser.GetReportSize(sizeString); + } + + return currentResult; + } + } +}