From 59a7fc66d5f357b025284eb4f36d3146470334dd Mon Sep 17 00:00:00 2001 From: Diego Heras Date: Wed, 22 Jul 2020 00:14:13 +0200 Subject: [PATCH] torrentseeds: fix keyword search (#9206) --- src/Jackett.Common/Indexers/TorrentSeeds.cs | 135 +++++--------------- 1 file changed, 35 insertions(+), 100 deletions(-) diff --git a/src/Jackett.Common/Indexers/TorrentSeeds.cs b/src/Jackett.Common/Indexers/TorrentSeeds.cs index 92cd0715b..f03c15212 100644 --- a/src/Jackett.Common/Indexers/TorrentSeeds.cs +++ b/src/Jackett.Common/Indexers/TorrentSeeds.cs @@ -21,14 +21,10 @@ namespace Jackett.Common.Indexers public class TorrentSeeds : BaseWebIndexer { private string LoginUrl => SiteLink + "takelogin.php"; - private string SearchUrl => SiteLink + "browse_elastic.php"; + private string SearchUrl => SiteLink + "browse.php"; private string TokenUrl => SiteLink + "login.php"; - private new ConfigurationDataBasicLoginWithRSSAndDisplay configData - { - get => (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; - set => base.configData = value; - } + private new ConfigurationDataBasicLoginWithRSSAndDisplay configData => (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; public TorrentSeeds(IIndexerConfigurationService configService, Utils.Clients.WebClient wc, Logger l, IProtectionService ps) : base(id: "torrentseeds", @@ -136,20 +132,25 @@ namespace Jackett.Common.Indexers protected override async Task> PerformQuery(TorznabQuery query) { var releases = new List(); - var searchString = query.GetQueryString(); - var finalSearchString = Regex.Replace(searchString.Trim(), "[ _.-]+", " ", RegexOptions.Compiled); + + // remove operator characters / all words must be present (+ prefix) + var cleanSearchString = Regex.Replace(query.GetQueryString().Trim(), "[ _.+-]+", " ", RegexOptions.Compiled); + var finalSearchString = cleanSearchString.Split(' ') + .Aggregate("", (current, word) => current + $"+{word} ") + .Trim(); + var searchUrl = SearchUrl; var queryCollection = new NameValueCollection { - { "search_in", "name" }, - { "search_mode", "all" }, - { "order_by", "added" }, - { "order_way", "desc" } + { "searchin", "title" }, + { "incldead", "1" }, + { "sort", "4" }, + { "type", "desc" } }; if (!string.IsNullOrWhiteSpace(finalSearchString)) - queryCollection.Add("query", finalSearchString); + queryCollection.Add("search", finalSearchString); foreach (var cat in MapTorznabCapsToTrackers(query)) - queryCollection.Add("cat[" + cat + "]", "1"); + queryCollection.Add("c" + cat, "1"); searchUrl += "?" + queryCollection.GetQueryString(); var response = await RequestStringWithCookiesAndRetry(searchUrl); var results = response.Content; @@ -157,113 +158,47 @@ namespace Jackett.Common.Indexers { await ApplyConfiguration(null); response = await RequestStringWithCookiesAndRetry(searchUrl); - } - - if (response.IsRedirect) - { - // handle single entries - var qCommentLink = new Uri(response.RedirectingTo); - await FollowIfRedirect(response, accumulateCookies: true); results = response.Content; - try - { - var parser = new HtmlParser(); - var dom = parser.ParseDocument(results); - var content = dom.QuerySelector("tbody:has(script)"); - var release = new ReleaseInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 72 * 60 * 60; - var catStr = content.QuerySelector("tr:has(td:contains(\"Type\"))").Children[1].TextContent; - release.Category = MapTrackerCatDescToNewznab(catStr); - var qLink = content.QuerySelector("tr:has(td:contains(\"Download\"))") - .QuerySelector("a[href*=\"download.php?torrent=\"]"); - release.Link = new Uri(SiteLink + qLink.GetAttribute("href")); - release.Title = qLink.QuerySelector("u").TextContent.Replace(".torrent", "").Trim(); - release.Comments = qCommentLink; - release.Guid = release.Comments; - var qSize = content.QuerySelector("tr:has(td.heading:contains(\"Size\"))").Children[1].TextContent - .Split('(')[0].Trim(); - release.Size = ReleaseInfo.GetBytes(qSize); - var peerStats = content.QuerySelector("tr:has(td:has(a[href^=\"./peerlist_xbt.php?id=\"]))").Children[1] - .TextContent.Split(','); - var qSeeders = peerStats[0].Replace(" seeder(s)", "").Trim(); - var qLeechers = peerStats[1].Split('=')[0].Replace(" leecher(s) ", "").Trim(); - release.Seeders = ParseUtil.CoerceInt(qSeeders); - release.Peers = ParseUtil.CoerceInt(qLeechers) + release.Seeders; - var rawDateStr = content.QuerySelector("tr:has(td:contains(\"Added\"))").Children[1].TextContent; - var dateUpped = DateTimeUtil.FromUnknown(rawDateStr.Replace(",", string.Empty)); - - var imdbRegexp = new Regex(@"(https:\/\/[w]{0,3}\.?imdb.com\/\S*\/\S*)"); - var qInfo = content.QuerySelector("tr:has(th)")?.Children[1].TextContent - ?? content.QuerySelector("tr > td > pre")?.TextContent; - if (qInfo != null) - { - release.Imdb = ParseUtil.GetImdbID(imdbRegexp.Match(qInfo).Groups[1].Value.Split('/').Last()); - } - - // Mar 4 2020, 05:47 AM - release.PublishDate = dateUpped.ToLocalTime(); - var qGrabs = content.QuerySelector("tr:has(td:contains(\"Snatched\"))").Children[1]; - release.Grabs = ParseUtil.CoerceInt(qGrabs.TextContent.Replace(" time(s)", "")); - var qFiles = content.QuerySelector("tr:has(td:has(a[href^=\"./filelist.php?id=\"]))").Children[1]; - release.Files = ParseUtil.CoerceInt(qFiles.TextContent.Replace(" files", "")); - var qRatio = content.QuerySelector("tr:has(td:contains(\"Ratio After Download\"))").Children[1]; - release.DownloadVolumeFactor = qRatio.QuerySelector("del") != null ? 0 : 1; - release.UploadVolumeFactor = 1; - releases.Add(release); - } - catch (Exception ex) - { - OnParseError(results, ex); - } - - return releases; } try { var parser = new HtmlParser(); var dom = parser.ParseDocument(results); - var rows = dom.QuerySelectorAll("table.torrent-table > tbody > tr"); - foreach (var row in rows.Skip(1)) + var rows = dom.QuerySelectorAll("table.table-bordered > tbody > tr.browse_color"); + foreach (var row in rows) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 72 * 60 * 60; - var qCatLink = row.QuerySelector("a[href^=\"/browse_elastic.php?cat=\"]"); + var qCatLink = row.QuerySelector("a[href^=\"browse.php?cat=\"]"); var catStr = qCatLink.GetAttribute("href").Split('=')[1]; release.Category = MapTrackerCatToNewznab(catStr); - var qDetailsLink = row.QuerySelector("a[href^=\"/details.php?id=\"]"); - var qDetailsTitle = row.QuerySelector("td:has(a[href^=\"/details.php?id=\"]) b"); + var qDetailsLink = row.QuerySelector("a[href^=\"details.php?id=\"]"); + var qDetailsTitle = row.QuerySelector("td:has(a[href^=\"details.php?id=\"]) b"); release.Title = qDetailsTitle.TextContent.Trim(); - var qDlLink = row.QuerySelector("a[href^=\"/download.php?torrent=\"]"); - var qSeeders = row.QuerySelector("td.torrent-table-seeders"); - var qLeechers = row.QuerySelector("td.torrent-table-leechers"); - var qDateStr = row.QuerySelector("td.torrent-table-added"); - var qSize = row.QuerySelector("td.torrent-table-size"); - var qGrabs = row.QuerySelector("td.torrent-table-snatched"); - var qFiles = row.QuerySelector("td.torrent-table-files"); - release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href").Split('/')[1]); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href").Split('/')[1]); - release.Guid = release.Comments; - var sizeStr = qSize.TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); - release.Seeders = ParseUtil.CoerceInt(qSeeders.TextContent); - release.Peers = ParseUtil.CoerceInt(qLeechers.TextContent) + release.Seeders; - var dateStr = ParseUtil.CoerceLong(qDateStr.GetAttribute("data-timestamp")); - var parsedDateTime = DateTimeUtil.UnixTimestampToDateTime(dateStr); - release.PublishDate = parsedDateTime; - release.Grabs = ParseUtil.CoerceInt(qGrabs.TextContent); - release.Files = ParseUtil.CoerceInt(qFiles.TextContent); + var qDlLink = row.QuerySelector("a[href^=\"download.php?torrent=\"]"); - var qImdb = row.QuerySelector("td.torrent-table-name > div > p.float-down > span.label-warning > a"); + release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href")); + release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + release.Guid = release.Comments; + + var qColumns = row.QuerySelectorAll("td"); + release.Files = ParseUtil.CoerceInt(qColumns[4].TextContent); + release.PublishDate = DateTimeUtil.FromUnknown(qColumns[5].TextContent); + release.Size = ReleaseInfo.GetBytes(qColumns[6].TextContent); + release.Grabs = ParseUtil.CoerceInt(qColumns[7].TextContent.Replace("Times", "")); + release.Seeders = ParseUtil.CoerceInt(qColumns[8].TextContent); + release.Peers = ParseUtil.CoerceInt(qColumns[9].TextContent) + release.Seeders; + + var qImdb = row.QuerySelector("a[href*=\"www.imdb.com\"]"); if (qImdb != null) { var deRefUrl = qImdb.GetAttribute("href"); release.Imdb = ParseUtil.GetImdbID(WebUtility.UrlDecode(deRefUrl).Split('/').Last()); } - release.DownloadVolumeFactor = row.GetAttribute("class").Contains("freeleech") ? 0 : 1; + release.DownloadVolumeFactor = row.QuerySelector("img[src*=\"freedownload\"]") != null ? 0 : 1; release.UploadVolumeFactor = 1; releases.Add(release); }