diff --git a/src/NzbDrone.Core.Test/IndexerTests/IndexerServiceFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/IndexerServiceFixture.cs index 4cc12f77b..4ade676d9 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/IndexerServiceFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/IndexerServiceFixture.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; +using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Indexers; +using NzbDrone.Core.Indexers.FileList; using NzbDrone.Core.Indexers.Newznab; -using NzbDrone.Core.Indexers.Omgwtfnzbs; using NzbDrone.Core.Lifecycle; using NzbDrone.Core.Test.Framework; @@ -20,7 +20,7 @@ namespace NzbDrone.Core.Test.IndexerTests _indexers = new List(); _indexers.Add(Mocker.Resolve()); - _indexers.Add(Mocker.Resolve()); + _indexers.Add(Mocker.Resolve()); Mocker.SetConstant>(_indexers); } diff --git a/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs deleted file mode 100644 index ade0029bc..000000000 --- a/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Linq; -using System.Net.Http; -using FluentAssertions; -using Moq; -using NUnit.Framework; -using NzbDrone.Common.Http; -using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Omgwtfnzbs; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.IndexerTests.OmgwtfnzbsTests -{ - [TestFixture] - public class OmgwtfnzbsFixture : CoreTest - { - [SetUp] - public void Setup() - { - Subject.Definition = new IndexerDefinition() - { - Name = "Omgwtfnzbs", - Settings = new OmgwtfnzbsSettings() - { - ApiKey = "xxx", - Username = "me@my.domain" - } - }; - } - - [Test] - public void should_parse_recent_feed_from_omgwtfnzbs() - { - var recentFeed = ReadAllText(@"Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml"); - - Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); - - var releases = Subject.FetchRecent(); - - releases.Should().HaveCount(100); - - var releaseInfo = releases.First(); - - releaseInfo.Title.Should().Be("Stephen.Fry.Gadget.Man.S01E05.HDTV.x264-C4TV"); - releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Usenet); - releaseInfo.DownloadUrl.Should().Be("http://api.omgwtfnzbs.org/sn.php?id=OAl4g&user=nzbdrone&api=nzbdrone"); - releaseInfo.InfoUrl.Should().Be("http://omgwtfnzbs.org/details.php?id=OAl4g"); - releaseInfo.CommentUrl.Should().BeNullOrEmpty(); - releaseInfo.Indexer.Should().Be(Subject.Definition.Name); - releaseInfo.PublishDate.Should().Be(DateTime.Parse("2012/12/17 23:30:13")); - releaseInfo.Size.Should().Be(236822906); - } - } -} diff --git a/src/NzbDrone.Core.Test/IndexerTests/RarbgTests/RarbgFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/RarbgTests/RarbgFixture.cs deleted file mode 100644 index 37ef9f5b6..000000000 --- a/src/NzbDrone.Core.Test/IndexerTests/RarbgTests/RarbgFixture.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Linq; -using System.Net.Http; -using FluentAssertions; -using Moq; -using NUnit.Framework; -using NzbDrone.Common.Http; -using NzbDrone.Core.Indexers; -using NzbDrone.Core.Indexers.Rarbg; -using NzbDrone.Core.Parser.Model; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; - -namespace NzbDrone.Core.Test.IndexerTests.RarbgTests -{ - [TestFixture] - public class RarbgFixture : CoreTest - { - [SetUp] - public void Setup() - { - Subject.Definition = new IndexerDefinition() - { - Name = "Rarbg", - Settings = new RarbgSettings() - }; - - Mocker.GetMock() - .Setup(v => v.GetToken(It.IsAny())) - .Returns("validtoken"); - } - - [Test] - public void should_parse_recent_feed_from_Rarbg() - { - var recentFeed = ReadAllText(@"Files/Indexers/Rarbg/RecentFeed_v2.json"); - - Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); - - var releases = Subject.FetchRecent(); - - releases.Should().HaveCount(4); - releases.First().Should().BeOfType(); - - var torrentInfo = releases.First() as TorrentInfo; - - torrentInfo.Title.Should().Be("Sense8.S01E01.WEBRip.x264-FGT"); - torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); - torrentInfo.DownloadUrl.Should().Be("magnet:?xt=urn:btih:d8bde635f573acb390c7d7e7efc1556965fdc802&dn=Sense8.S01E01.WEBRip.x264-FGT&tr=http%3A%2F%2Ftracker.trackerfix.com%3A80%2Fannounce&tr=udp%3A%2F%2F9.rarbg.me%3A2710&tr=udp%3A%2F%2F9.rarbg.to%3A2710&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce"); - torrentInfo.InfoUrl.Should().Be("https://torrentapi.org/redirect_to_info.php?token=i5cx7b9agd&p=8_6_4_4_5_6__d8bde635f5&app_id=Readarr"); - torrentInfo.Indexer.Should().Be(Subject.Definition.Name); - torrentInfo.PublishDate.Should().Be(DateTime.Parse("2015-06-05 16:58:11 +0000").ToUniversalTime()); - torrentInfo.Size.Should().Be(564198371); - torrentInfo.InfoHash.Should().BeNull(); - torrentInfo.MagnetUrl.Should().BeNull(); - torrentInfo.Peers.Should().Be(304 + 200); - torrentInfo.Seeders.Should().Be(304); - } - - [Test] - public void should_parse_error_20_as_empty_results() - { - Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), "{ error_code: 20, error: \"some message\" }")); - - var releases = Subject.FetchRecent(); - - releases.Should().HaveCount(0); - } - - [Test] - public void should_warn_on_unknown_error() - { - Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), "{ error_code: 25, error: \"some message\" }")); - - var releases = Subject.FetchRecent(); - - releases.Should().HaveCount(0); - - ExceptionVerification.ExpectedWarns(1); - } - } -} diff --git a/src/NzbDrone.Core/Datastore/Migration/027_remove_omg.cs b/src/NzbDrone.Core/Datastore/Migration/027_remove_omg.cs new file mode 100644 index 000000000..1d1476c26 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/027_remove_omg.cs @@ -0,0 +1,15 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(027)] + public class remove_omg : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.Sql("DELETE FROM Indexers WHERE Implementation = 'Omgwtfnzbs'"); + Execute.Sql("DELETE FROM Indexers WHERE Implementation = 'Rarbg'"); + } + } +} diff --git a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs index 72d656848..4286343a3 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs @@ -47,7 +47,6 @@ namespace NzbDrone.Core.Indexers.Newznab yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws")); yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info")); yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net")); - yield return GetDefinition("omgwtfnzbs", GetSettings("https://api.omgwtfnzbs.me")); yield return GetDefinition("OZnzb.com", GetSettings("https://api.oznzb.com")); yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com")); yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api")); diff --git a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs deleted file mode 100644 index e4f1bb56b..000000000 --- a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/Omgwtfnzbs.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NLog; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Parser; - -namespace NzbDrone.Core.Indexers.Omgwtfnzbs -{ - public class Omgwtfnzbs : HttpIndexerBase - { - public override string Name => "omgwtfnzbs"; - - public override DownloadProtocol Protocol => DownloadProtocol.Usenet; - - public Omgwtfnzbs(IHttpClient httpClient, IIndexerStatusService indexerStatusService, IConfigService configService, IParsingService parsingService, Logger logger) - : base(httpClient, indexerStatusService, configService, parsingService, logger) - { - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new OmgwtfnzbsRequestGenerator() { Settings = Settings }; - } - - public override IParseIndexerResponse GetParser() - { - return new OmgwtfnzbsRssParser(); - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRequestGenerator.cs deleted file mode 100644 index 1534dc78d..000000000 --- a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRequestGenerator.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using System.Text; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.IndexerSearch.Definitions; - -namespace NzbDrone.Core.Indexers.Omgwtfnzbs -{ - public class OmgwtfnzbsRequestGenerator : IIndexerRequestGenerator - { - public string BaseUrl { get; set; } - public OmgwtfnzbsSettings Settings { get; set; } - - public OmgwtfnzbsRequestGenerator() - { - BaseUrl = "https://rss.omgwtfnzbs.me/rss-download.php"; - } - - public virtual IndexerPageableRequestChain GetRecentRequests() - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(null)); - - return pageableRequests; - } - - public virtual IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}+{1}", - searchCriteria.AuthorQuery, - searchCriteria.BookQuery))); - - return pageableRequests; - } - - public virtual IndexerPageableRequestChain GetSearchRequests(AuthorSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests(string.Format("{0}", - searchCriteria.AuthorQuery))); - - return pageableRequests; - } - - private IEnumerable GetPagedRequests(string query) - { - var url = new StringBuilder(); - - // Category 22 is Music-FLAC, category 7 is Music-MP3 - url.AppendFormat("{0}?catid=22,7&user={1}&api={2}&eng=1&delay={3}", BaseUrl, Settings.Username, Settings.ApiKey, Settings.Delay); - - if (query.IsNotNullOrWhiteSpace()) - { - url = url.Replace("rss-download.php", "rss-search.php"); - url.AppendFormat("&search={0}", query); - } - - yield return new IndexerRequest(url.ToString(), HttpAccept.Rss); - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs deleted file mode 100644 index 5ff9174e3..000000000 --- a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Linq; -using System.Text.RegularExpressions; -using System.Xml.Linq; -using NzbDrone.Common.Extensions; -using NzbDrone.Core.Indexers.Exceptions; - -namespace NzbDrone.Core.Indexers.Omgwtfnzbs -{ - public class OmgwtfnzbsRssParser : RssParser - { - public OmgwtfnzbsRssParser() - { - UseEnclosureUrl = true; - UseEnclosureLength = true; - } - - protected override bool PreProcess(IndexerResponse indexerResponse) - { - var xdoc = LoadXmlDocument(indexerResponse); - var notice = xdoc.Descendants("notice").FirstOrDefault(); - - if (notice == null) - { - return true; - } - - if (!notice.Value.ContainsIgnoreCase("api")) - { - return true; - } - - throw new ApiKeyException(notice.Value); - } - - protected override string GetInfoUrl(XElement item) - { - //Todo: Me thinks I need to parse details to get this... - var match = Regex.Match(item.Description(), - @"(?:\View NZB\:\<\/b\>\s\.+)(?:\""\starget)", - RegexOptions.IgnoreCase | RegexOptions.Compiled); - - if (match.Success) - { - return match.Groups["URL"].Value; - } - - return string.Empty; - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsSettings.cs b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsSettings.cs deleted file mode 100644 index 07100a892..000000000 --- a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsSettings.cs +++ /dev/null @@ -1,46 +0,0 @@ -using FluentValidation; -using NzbDrone.Core.Annotations; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Indexers.Omgwtfnzbs -{ - public class OmgwtfnzbsSettingsValidator : AbstractValidator - { - public OmgwtfnzbsSettingsValidator() - { - RuleFor(c => c.Username).NotEmpty(); - RuleFor(c => c.ApiKey).NotEmpty(); - RuleFor(c => c.Delay).GreaterThanOrEqualTo(0); - } - } - - public class OmgwtfnzbsSettings : IIndexerSettings - { - private static readonly OmgwtfnzbsSettingsValidator Validator = new OmgwtfnzbsSettingsValidator(); - - public OmgwtfnzbsSettings() - { - Delay = 30; - } - - // Unused since Omg has a hardcoded url. - public string BaseUrl { get; set; } - - [FieldDefinition(0, Label = "Username", Privacy = PrivacyLevel.UserName)] - public string Username { get; set; } - - [FieldDefinition(1, Label = "API Key", Privacy = PrivacyLevel.ApiKey)] - public string ApiKey { get; set; } - - [FieldDefinition(2, Label = "Delay", HelpText = "Time in minutes to delay new nzbs before they appear on the RSS feed", Advanced = true)] - public int Delay { get; set; } - - [FieldDefinition(3, Type = FieldType.Number, Label = "Early Download Limit", Unit = "days", HelpText = "Time before release date Readarr will download from this indexer, empty is no limit", Advanced = true)] - public int? EarlyReleaseLimit { get; set; } - - public NzbDroneValidationResult Validate() - { - return new NzbDroneValidationResult(Validator.Validate(this)); - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/Rarbg.cs b/src/NzbDrone.Core/Indexers/Rarbg/Rarbg.cs deleted file mode 100644 index d9f423ae8..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/Rarbg.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using NLog; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Configuration; -using NzbDrone.Core.Exceptions; -using NzbDrone.Core.Http.CloudFlare; -using NzbDrone.Core.Parser; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public class Rarbg : HttpIndexerBase - { - private readonly IRarbgTokenProvider _tokenProvider; - - public override string Name => "Rarbg"; - - public override DownloadProtocol Protocol => DownloadProtocol.Torrent; - - public override TimeSpan RateLimit => TimeSpan.FromSeconds(2); - - public Rarbg(IRarbgTokenProvider tokenProvider, IHttpClient httpClient, IIndexerStatusService indexerStatusService, IConfigService configService, IParsingService parsingService, Logger logger) - : base(httpClient, indexerStatusService, configService, parsingService, logger) - { - _tokenProvider = tokenProvider; - } - - public override IIndexerRequestGenerator GetRequestGenerator() - { - return new RarbgRequestGenerator(_tokenProvider) { Settings = Settings }; - } - - public override IParseIndexerResponse GetParser() - { - return new RarbgParser(); - } - - public override object RequestAction(string action, IDictionary query) - { - if (action == "checkCaptcha") - { - Settings.Validate().Filter("BaseUrl").ThrowOnError(); - - try - { - var request = new HttpRequestBuilder(Settings.BaseUrl.Trim('/')) - .Resource("/pubapi_v2.php?get_token=get_token") - .Accept(HttpAccept.Json) - .Build(); - - _httpClient.Get(request); - } - catch (CloudFlareCaptchaException ex) - { - return new - { - captchaRequest = new - { - host = ex.CaptchaRequest.Host, - ray = ex.CaptchaRequest.Ray, - siteKey = ex.CaptchaRequest.SiteKey, - secretToken = ex.CaptchaRequest.SecretToken, - responseUrl = ex.CaptchaRequest.ResponseUrl.FullUri, - } - }; - } - - return new - { - captchaToken = "" - }; - } - else if (action == "getCaptchaCookie") - { - if (query["responseUrl"].IsNullOrWhiteSpace()) - { - throw new BadRequestException("QueryParam responseUrl invalid."); - } - - if (query["ray"].IsNullOrWhiteSpace()) - { - throw new BadRequestException("QueryParam ray invalid."); - } - - if (query["captchaResponse"].IsNullOrWhiteSpace()) - { - throw new BadRequestException("QueryParam captchaResponse invalid."); - } - - var request = new HttpRequestBuilder(query["responseUrl"]) - .AddQueryParam("id", query["ray"]) - .AddQueryParam("g-recaptcha-response", query["captchaResponse"]) - .Build(); - - request.UseSimplifiedUserAgent = true; - request.AllowAutoRedirect = false; - - var response = _httpClient.Get(request); - - var cfClearanceCookie = response.GetCookies()["cf_clearance"]; - - return new - { - captchaToken = cfClearanceCookie - }; - } - - return new { }; - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgParser.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgParser.cs deleted file mode 100644 index 0b5a501af..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgParser.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Collections.Generic; -using System.Net; -using System.Text.RegularExpressions; -using NzbDrone.Common.Http; -using NzbDrone.Core.Indexers.Exceptions; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public class RarbgParser : IParseIndexerResponse - { - private static readonly Regex RegexGuid = new Regex(@"^magnet:\?xt=urn:btih:([a-f0-9]+)", RegexOptions.Compiled); - - public IList ParseResponse(IndexerResponse indexerResponse) - { - var results = new List(); - - switch (indexerResponse.HttpResponse.StatusCode) - { - default: - if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) - { - throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); - } - - break; - } - - var jsonResponse = new HttpResponse(indexerResponse.HttpResponse); - - if (jsonResponse.Resource.error_code.HasValue) - { - if (jsonResponse.Resource.error_code == 5 || jsonResponse.Resource.error_code == 8 - || jsonResponse.Resource.error_code == 9 || jsonResponse.Resource.error_code == 10 - || jsonResponse.Resource.error_code == 13 || jsonResponse.Resource.error_code == 14 - || jsonResponse.Resource.error_code == 20) - { - // No results, rate limit, tvdbid not found/invalid, or imdbid not found/invalid - return results; - } - - throw new IndexerException(indexerResponse, "Indexer API call returned error {0}: {1}", jsonResponse.Resource.error_code, jsonResponse.Resource.error); - } - - if (jsonResponse.Resource.torrent_results == null) - { - return results; - } - - foreach (var torrent in jsonResponse.Resource.torrent_results) - { - var torrentInfo = new TorrentInfo(); - - torrentInfo.Guid = GetGuid(torrent); - torrentInfo.Title = torrent.title; - torrentInfo.Size = torrent.size; - torrentInfo.DownloadUrl = torrent.download; - torrentInfo.InfoUrl = torrent.info_page + "&app_id=Readarr"; - torrentInfo.PublishDate = torrent.pubdate.ToUniversalTime(); - torrentInfo.Seeders = torrent.seeders; - torrentInfo.Peers = torrent.leechers + torrent.seeders; - - results.Add(torrentInfo); - } - - return results; - } - - private string GetGuid(RarbgTorrent torrent) - { - var match = RegexGuid.Match(torrent.download); - - if (match.Success) - { - return string.Format("rarbg-{0}", match.Groups[1].Value); - } - else - { - return string.Format("rarbg-{0}", torrent.download); - } - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs deleted file mode 100644 index 0fbf05661..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System.Collections.Generic; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; -using NzbDrone.Core.IndexerSearch.Definitions; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public class RarbgRequestGenerator : IIndexerRequestGenerator - { - private readonly IRarbgTokenProvider _tokenProvider; - - public RarbgSettings Settings { get; set; } - - public RarbgRequestGenerator(IRarbgTokenProvider tokenProvider) - { - _tokenProvider = tokenProvider; - } - - public virtual IndexerPageableRequestChain GetRecentRequests() - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests("list", null, null)); - - return pageableRequests; - } - - public virtual IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests("search", null, "{0}+{1}", searchCriteria.AuthorQuery, searchCriteria.BookQuery)); - - return pageableRequests; - } - - public virtual IndexerPageableRequestChain GetSearchRequests(AuthorSearchCriteria searchCriteria) - { - var pageableRequests = new IndexerPageableRequestChain(); - - pageableRequests.Add(GetPagedRequests("search", null, "{0}", searchCriteria.AuthorQuery)); - - return pageableRequests; - } - - private IEnumerable GetPagedRequests(string mode, int? tvdbId, string query, params object[] args) - { - var requestBuilder = new HttpRequestBuilder(Settings.BaseUrl) - .Resource("/pubapi_v2.php") - .Accept(HttpAccept.Json); - - if (Settings.CaptchaToken.IsNotNullOrWhiteSpace()) - { - requestBuilder.UseSimplifiedUserAgent = true; - requestBuilder.SetCookie("cf_clearance", Settings.CaptchaToken); - } - - requestBuilder.AddQueryParam("mode", mode); - - if (tvdbId.HasValue) - { - requestBuilder.AddQueryParam("search_tvdb", tvdbId.Value); - } - - if (query.IsNotNullOrWhiteSpace()) - { - requestBuilder.AddQueryParam("search_string", string.Format(query, args)); - } - - if (!Settings.RankedOnly) - { - requestBuilder.AddQueryParam("ranked", "0"); - } - - requestBuilder.AddQueryParam("category", "1;23;24;25;26"); - requestBuilder.AddQueryParam("limit", "100"); - requestBuilder.AddQueryParam("token", _tokenProvider.GetToken(Settings)); - requestBuilder.AddQueryParam("format", "json_extended"); - requestBuilder.AddQueryParam("app_id", BuildInfo.AppName); - - yield return new IndexerRequest(requestBuilder.Build()); - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgResponse.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgResponse.cs deleted file mode 100644 index 399d3322c..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgResponse.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public class RarbgResponse - { - public string error { get; set; } - public int? error_code { get; set; } - public List torrent_results { get; set; } - } - - public class RarbgTorrent - { - public string title { get; set; } - public string category { get; set; } - public string download { get; set; } - public int? seeders { get; set; } - public int? leechers { get; set; } - public long size { get; set; } - public DateTime pubdate { get; set; } - public RarbgTorrentInfo episode_info { get; set; } - public int? ranked { get; set; } - public string info_page { get; set; } - } - - public class RarbgTorrentInfo - { - // For Future if RARBG decides to return metadata - public string author { get; set; } - public string book { get; set; } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgSettings.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgSettings.cs deleted file mode 100644 index 5e574e2cb..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgSettings.cs +++ /dev/null @@ -1,51 +0,0 @@ -using FluentValidation; -using NzbDrone.Core.Annotations; -using NzbDrone.Core.Validation; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public class RarbgSettingsValidator : AbstractValidator - { - public RarbgSettingsValidator() - { - RuleFor(c => c.BaseUrl).ValidRootUrl(); - - RuleFor(c => c.SeedCriteria).SetValidator(_ => new SeedCriteriaSettingsValidator()); - } - } - - public class RarbgSettings : ITorrentIndexerSettings - { - private static readonly RarbgSettingsValidator Validator = new RarbgSettingsValidator(); - - public RarbgSettings() - { - BaseUrl = "https://torrentapi.org"; - RankedOnly = false; - MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS; - } - - [FieldDefinition(0, Label = "API URL", HelpText = "URL to Rarbg api, not the website.")] - public string BaseUrl { get; set; } - - [FieldDefinition(1, Type = FieldType.Checkbox, Label = "Ranked Only", HelpText = "Only include ranked results.")] - public bool RankedOnly { get; set; } - - [FieldDefinition(2, Type = FieldType.Captcha, Label = "CAPTCHA Token", HelpText = "CAPTCHA Clearance token used to handle CloudFlare Anti-DDOS measures on shared-ip VPNs.")] - public string CaptchaToken { get; set; } - - [FieldDefinition(3, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)] - public int MinimumSeeders { get; set; } - - [FieldDefinition(4)] - public SeedCriteriaSettings SeedCriteria { get; set; } = new SeedCriteriaSettings(); - - [FieldDefinition(5, Type = FieldType.Number, Label = "Early Download Limit", HelpText = "Time before release date Readarr will download from this indexer, empty is no limit", Advanced = true)] - public int? EarlyReleaseLimit { get; set; } - - public NzbDroneValidationResult Validate() - { - return new NzbDroneValidationResult(Validator.Validate(this)); - } - } -} diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgTokenProvider.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgTokenProvider.cs deleted file mode 100644 index b2f8913e0..000000000 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgTokenProvider.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using Newtonsoft.Json.Linq; -using NLog; -using NzbDrone.Common.Cache; -using NzbDrone.Common.Extensions; -using NzbDrone.Common.Http; - -namespace NzbDrone.Core.Indexers.Rarbg -{ - public interface IRarbgTokenProvider - { - string GetToken(RarbgSettings settings); - } - - public class RarbgTokenProvider : IRarbgTokenProvider - { - private readonly IHttpClient _httpClient; - private readonly ICached _tokenCache; - private readonly Logger _logger; - - public RarbgTokenProvider(IHttpClient httpClient, ICacheManager cacheManager, Logger logger) - { - _httpClient = httpClient; - _tokenCache = cacheManager.GetCache(GetType()); - _logger = logger; - } - - public string GetToken(RarbgSettings settings) - { - return _tokenCache.Get(settings.BaseUrl, - () => - { - var requestBuilder = new HttpRequestBuilder(settings.BaseUrl.Trim('/')) - .WithRateLimit(3.0) - .Resource("/pubapi_v2.php?get_token=get_token&app_id=Readarr") - .Accept(HttpAccept.Json); - - if (settings.CaptchaToken.IsNotNullOrWhiteSpace()) - { - requestBuilder.UseSimplifiedUserAgent = true; - requestBuilder.SetCookie("cf_clearance", settings.CaptchaToken); - } - - var response = _httpClient.Get(requestBuilder.Build()); - - return response.Resource["token"].ToString(); - }, - TimeSpan.FromMinutes(14.0)); - } - } -}