From 5d2b80d15a2ccde010a4966efbbaea130c3d92d1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 23 Jan 2024 10:59:59 +0200 Subject: [PATCH] Fixed: (SubsPlease) Parse release size from magnet links --- .../Indexers/Definitions/SubsPlease.cs | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs index d395e0ba1..5c0aa3c96 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/SubsPlease.cs @@ -6,6 +6,7 @@ using System.Text; using System.Text.RegularExpressions; using Newtonsoft.Json; using NLog; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using NzbDrone.Core.Indexers.Exceptions; @@ -43,12 +44,12 @@ namespace NzbDrone.Core.Indexers.Definitions public override IIndexerRequestGenerator GetRequestGenerator() { - return new SubsPleaseRequestGenerator { Settings = Settings, Capabilities = Capabilities }; + return new SubsPleaseRequestGenerator(Settings); } public override IParseIndexerResponse GetParser() { - return new SubsPleaseParser(Settings, Capabilities.Categories); + return new SubsPleaseParser(Settings); } private IndexerCapabilities SetCapabilities() @@ -74,12 +75,16 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubsPleaseRequestGenerator : IIndexerRequestGenerator { - public NoAuthTorrentBaseSettings Settings { get; set; } - public IndexerCapabilities Capabilities { get; set; } + private readonly NoAuthTorrentBaseSettings _settings; + + public SubsPleaseRequestGenerator(NoAuthTorrentBaseSettings settings) + { + _settings = settings; + } private IEnumerable GetSearchRequests(string term) { - var searchUrl = $"{Settings.BaseUrl.TrimEnd('/')}/api/?"; + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; var searchTerm = Regex.Replace(term, "\\[?SubsPlease\\]?\\s*", string.Empty, RegexOptions.IgnoreCase).Trim(); @@ -104,7 +109,7 @@ namespace NzbDrone.Core.Indexers.Definitions private IEnumerable GetRssRequest() { - var searchUrl = $"{Settings.BaseUrl.TrimEnd('/')}/api/?"; + var searchUrl = $"{_settings.BaseUrl.TrimEnd('/')}/api/?"; var queryParameters = new NameValueCollection { @@ -119,16 +124,12 @@ namespace NzbDrone.Core.Indexers.Definitions public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; + return new IndexerPageableRequestChain(); } public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria) { - var pageableRequests = new IndexerPageableRequestChain(); - - return pageableRequests; + return new IndexerPageableRequestChain(); } public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria) @@ -166,13 +167,13 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubsPleaseParser : IParseIndexerResponse { + private static readonly Regex RegexSize = new (@"\&xl=(?\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private readonly NoAuthTorrentBaseSettings _settings; - private readonly IndexerCapabilitiesCategories _categories; - public SubsPleaseParser(NoAuthTorrentBaseSettings settings, IndexerCapabilitiesCategories categories) + public SubsPleaseParser(NoAuthTorrentBaseSettings settings) { _settings = settings; - _categories = categories; } public IList ParseResponse(IndexerResponse indexerResponse) @@ -216,28 +217,11 @@ namespace NzbDrone.Core.Indexers.Definitions } // Ex: [SubsPlease] Shingeki no Kyojin (The Final Season) - 64 (1080p) - release.Title += $"[SubsPlease] {value.Show} - {value.Episode} ({d.Res}p)"; + release.Title += $"[SubsPlease] {value.Show} - {value.Episode} ({d.Resolution}p)"; release.MagnetUrl = d.Magnet; release.DownloadUrl = null; release.Guid = d.Magnet; - - // The API doesn't tell us file size, so give an estimate based on resolution - if (string.Equals(d.Res, "1080")) - { - release.Size = 1395864371; // 1.3GB - } - else if (string.Equals(d.Res, "720")) - { - release.Size = 734003200; // 700MB - } - else if (string.Equals(d.Res, "480")) - { - release.Size = 367001600; // 350MB - } - else - { - release.Size = 1073741824; // 1GB - } + release.Size = GetReleaseSize(d); torrentInfos.Add(release); } @@ -246,6 +230,30 @@ namespace NzbDrone.Core.Indexers.Definitions return torrentInfos.ToArray(); } + private static long GetReleaseSize(SubPleaseDownloadInfo info) + { + if (info.Magnet.IsNotNullOrWhiteSpace()) + { + var sizeMatch = RegexSize.Match(info.Magnet); + + if (sizeMatch.Success && + long.TryParse(sizeMatch.Groups["size"].Value, out var releaseSize) + && releaseSize > 0) + { + return releaseSize; + } + } + + // The API doesn't tell us file size, so give an estimate based on resolution + return info.Resolution switch + { + "1080" => 1.3.Gigabytes(), + "720" => 700.Megabytes(), + "480" => 350.Megabytes(), + _ => 1.Gigabytes() + }; + } + public Action, DateTime?> CookiesUpdater { get; set; } } @@ -265,7 +273,8 @@ namespace NzbDrone.Core.Indexers.Definitions public class SubPleaseDownloadInfo { - public string Res { get; set; } + [JsonProperty("res")] + public string Resolution { get; set; } public string Magnet { get; set; } } }