diff --git a/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs b/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs index 6498af359..64677d88a 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SpeedCD.cs @@ -35,6 +35,7 @@ public class SpeedCD : TorrentIndexerBase public override Encoding Encoding => Encoding.UTF8; public override DownloadProtocol Protocol => DownloadProtocol.Torrent; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; + public override bool SupportsPagination => true; public override IndexerCapabilities Capabilities => SetCapabilities(); public SpeedCD(IIndexerHttpClient httpClient, @@ -190,41 +191,6 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator _encoding = encoding; } - private IEnumerable GetPagedRequests(string term, int[] categories, bool deep = false) - { - var parameters = new List(); - - var catList = _capabilities.Categories.MapTorznabCapsToTrackers(categories); - foreach (var cat in catList) - { - parameters.Add(cat); - } - - if (_settings.FreeleechOnly) - { - parameters.Add("freeleech"); - } - - if (_settings.ExcludeArchives) - { - parameters.Add("norar"); - } - - if (deep) - { - parameters.Add("deep"); - } - - parameters.Add("q"); - parameters.Add(term.UrlEncode(_encoding)); - - var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/browse/{string.Join("/", parameters)}"; - - var request = new IndexerRequest(searchUrl, HttpAccept.Html); - - yield return request; - } - public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { var pageableRequests = new IndexerPageableRequestChain(); @@ -236,7 +202,7 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator term = $"{searchCriteria.FullImdbId}"; } - pageableRequests.Add(GetPagedRequests(term.Trim(), searchCriteria.Categories, searchCriteria.FullImdbId.IsNotNullOrWhiteSpace())); + pageableRequests.Add(GetPagedRequests(term.Trim(), searchCriteria, searchCriteria.FullImdbId.IsNotNullOrWhiteSpace())); return pageableRequests; } @@ -245,7 +211,7 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria)); return pageableRequests; } @@ -271,7 +237,7 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator } } - pageableRequests.Add(GetPagedRequests(term.Trim(), searchCriteria.Categories, searchCriteria.FullImdbId.IsNotNullOrWhiteSpace())); + pageableRequests.Add(GetPagedRequests(term.Trim(), searchCriteria, searchCriteria.FullImdbId.IsNotNullOrWhiteSpace())); return pageableRequests; } @@ -280,7 +246,7 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria)); return pageableRequests; } @@ -289,11 +255,55 @@ public class SpeedCDRequestGenerator : IIndexerRequestGenerator { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria.Categories)); + pageableRequests.Add(GetPagedRequests($"{searchCriteria.SanitizedSearchTerm}", searchCriteria)); return pageableRequests; } + private IEnumerable GetPagedRequests(string term, SearchCriteriaBase searchCriteria, bool deep = false) + { + var parameters = new List(); + + var catList = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories); + foreach (var cat in catList) + { + parameters.Add(cat); + } + + if (_settings.FreeleechOnly) + { + parameters.Add("freeleech"); + } + + if (_settings.ExcludeArchives) + { + parameters.Add("norar"); + } + + if (deep) + { + parameters.Add("deep"); + } + + if (term.IsNotNullOrWhiteSpace()) + { + parameters.Add("q"); + parameters.Add(term.UrlEncode(_encoding)); + } + + if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0) + { + var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1; + + parameters.Add("p"); + parameters.Add(page.ToString()); + } + + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/browse/{string.Join("/", parameters)}"; + + yield return new IndexerRequest(searchUrl, HttpAccept.Html); + } + public Func> GetCookies { get; set; } public Action, DateTime?> CookiesUpdater { get; set; } }