indexers: ensure the correct use of disposable parsed documents (#14743)

This commit is contained in:
Bogdan 2023-10-05 04:06:23 +03:00 committed by GitHub
parent 21d948906c
commit f81a7e3d59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 97 additions and 95 deletions

View File

@ -140,7 +140,7 @@ namespace Jackett.Common.Indexers.Abstract
await ConfigureIfOK(response.Cookies, response.ContentString != null && response.ContentString.Contains("logout.php"), () =>
{
var loginResultParser = new HtmlParser();
var loginResultDocument = loginResultParser.ParseDocument(response.ContentString);
using var loginResultDocument = loginResultParser.ParseDocument(response.ContentString);
var loginform = loginResultDocument.QuerySelector("#loginform");
if (loginform == null)
throw new ExceptionWithConfigData(response.ContentString, configData);

View File

@ -142,7 +142,7 @@ namespace Jackett.Common.Indexers
);
var parser = new HtmlParser();
var document = await parser.ParseDocumentAsync(result.ContentString);
using var document = await parser.ParseDocumentAsync(result.ContentString);
await ConfigureIfOK(result.Cookies, IsAuthorized(result), () =>
{
@ -185,7 +185,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = await parser.ParseDocumentAsync(result.ContentString);
using var document = await parser.ParseDocumentAsync(result.ContentString);
foreach (var linkNode in document.QuerySelectorAll(ReleaseLinksSelector))
{
@ -222,7 +222,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = await parser.ParseDocumentAsync(result.ContentString);
using var document = await parser.ParseDocumentAsync(result.ContentString);
var content = document.GetElementById(ContentId);
var date = GetDateFromShowPage(url, content);
@ -553,7 +553,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = await parser.ParseDocumentAsync(response.ContentString);
using var document = await parser.ParseDocumentAsync(response.ContentString);
foreach (var linkNode in document.QuerySelectorAll(searchLinkSelector))
{

View File

@ -212,7 +212,7 @@ namespace Jackett.Common.Indexers
try
{
var resultParser = new HtmlParser();
var resultDocument = resultParser.ParseDocument(response);
using var resultDocument = resultParser.ParseDocument(response);
IEnumerable<IElement> rows = resultDocument.QuerySelectorAll("div#content table > tbody > tr");
var releases = new List<ReleaseInfo>();

View File

@ -103,7 +103,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString != null && result.ContentString.Contains("logout.php"), () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector(".ui-state-error").Text().Trim();
throw new ExceptionWithConfigData(errorMessage, configData);
});
@ -152,7 +152,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results);
using var dom = parser.ParseDocument(results);
var rows = dom.QuerySelectorAll("table tr");
foreach (var (row, index) in rows.Skip(1).Select((v, i) => (v, i)))

View File

@ -207,7 +207,7 @@ namespace Jackett.Common.Indexers
var response = await RequestWithCookiesAsync(link.ToString());
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var hash = dom.QuerySelector("td:contains(\"Info Hash:\") ~ td")?.TextContent.Trim();
if (hash == null)
@ -228,7 +228,7 @@ namespace Jackett.Common.Indexers
{
var releases = new List<ReleaseInfo>();
var dom = ParseHtmlDocument(response.ContentString);
using var dom = ParseHtmlDocument(response.ContentString);
var rows = dom.QuerySelectorAll("div.post:has(div[class=\"postTitle\"])");
foreach (var row in rows)

View File

@ -289,7 +289,7 @@ namespace Jackett.Common.Indexers
{
const string rowsSelector = "table.torrent_table > tbody > tr:not(tr.colhead)";
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
using var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
ICollection<int> groupCategory = null;
string groupTitle = null;
@ -457,7 +457,7 @@ namespace Jackett.Common.Indexers
{
const string rowsSelector = "table.torrent_table > tbody > tr:not(tr.colhead)";
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
using var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
foreach (var row in rows)
try

View File

@ -117,7 +117,7 @@ namespace Jackett.Common.Indexers
};
var htmlParser = new HtmlParser();
var dom = htmlParser.ParseDocument(loginForm.ContentString);
using var dom = htmlParser.ParseDocument(loginForm.ContentString);
var loginKey = dom.QuerySelector("input[name=\"loginKey\"]");
if (loginKey != null)
@ -129,7 +129,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(response.Cookies, response.ContentString != null && !response.ContentString.Contains("loginForm"), () =>
{
var document = htmlParser.ParseDocument(response.ContentString);
using var document = htmlParser.ParseDocument(response.ContentString);
var errorMessage = document.QuerySelector("#loginError, .error")?.Text().Trim();
throw new ExceptionWithConfigData(errorMessage ?? "Login failed.", configData);
@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll(".torrents tr.torrent, .torrents tr.torrent_alt");
ICollection<int> currentCategories = new List<int> { TorznabCatType.TVAnime.ID };
@ -318,7 +318,7 @@ namespace Jackett.Common.Indexers
var downloadPage = await RequestWithCookiesAsync(link.ToString());
var parser = new HtmlParser();
var dom = parser.ParseDocument(downloadPage.ContentString);
using var dom = parser.ParseDocument(downloadPage.ContentString);
var downloadLink = dom.QuerySelector(".download_link")?.GetAttribute("href");

View File

@ -143,7 +143,7 @@ namespace Jackett.Common.Indexers
foreach (var result in results)
try
{
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var tableBody = dom.QuerySelector("#torrents-index-table > #torrents-index-table-body");
if (tableBody == null) // No results, so skip this search

View File

@ -180,7 +180,7 @@ namespace Jackett.Common.Indexers
{
const string rowsSelector = "table.torrent_table > tbody > tr:not(tr.colhead)";
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
using var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
var rows = searchResultDocument.QuerySelectorAll(rowsSelector);
string groupTitle = null;
string groupYearStr = null;

View File

@ -528,7 +528,7 @@ namespace Jackett.Common.Indexers
return true; // no error
var ResultParser = new HtmlParser();
var ResultDocument = ResultParser.ParseDocument(loginResult.ContentString);
using var ResultDocument = ResultParser.ParseDocument(loginResult.ContentString);
foreach (var error in errorBlocks)
{
var selection = ResultDocument.QuerySelector(error.Selector);
@ -877,7 +877,7 @@ namespace Jackett.Common.Indexers
if (Login.Test.Selector != null)
{
var testResultParser = new HtmlParser();
var testResultDocument = testResultParser.ParseDocument(testResult.ContentString);
using var testResultDocument = testResultParser.ParseDocument(testResult.ContentString);
var selection = testResultDocument.QuerySelectorAll(Login.Test.Selector);
if (selection.Length == 0)
{
@ -923,7 +923,7 @@ namespace Jackett.Common.Indexers
if (Definition.Login.Test.Selector != null && (contentType?.Contains("text/html") ?? true))
{
var parser = new HtmlParser();
var document = parser.ParseDocument(response.ContentString);
using var document = parser.ParseDocument(response.ContentString);
var selection = document.QuerySelectorAll(Definition.Login.Test.Selector);
@ -1969,7 +1969,7 @@ namespace Jackett.Common.Indexers
var parser = new HtmlParser();
var results = response.ContentString;
var resultDocument = parser.ParseDocument(results);
using var resultDocument = parser.ParseDocument(results);
var element = resultDocument.QuerySelector(selectorText);
if (element == null)

View File

@ -141,7 +141,7 @@ namespace Jackett.Common.Indexers
try
{
var dom = await parser.ParseDocumentAsync(results.ContentString);
using var dom = await parser.ParseDocumentAsync(results.ContentString);
var downloadLink = link.Query.Contains("type=4k")
? dom.QuerySelector("ul.links a:contains('Bittorrent 4K')")
@ -167,8 +167,10 @@ namespace Jackett.Common.Indexers
protectedLink = GetAbsoluteUrl(protectedLink);
results = await RequestWithCookiesAsync(protectedLink);
dom = parser.ParseDocument(results.ContentString);
var magnetUrl = dom.QuerySelector("a[href^=magnet]").GetAttribute("href");
using var document = parser.ParseDocument(results.ContentString);
var magnetUrl = document.QuerySelector("a[href^=magnet]").GetAttribute("href");
return await base.Download(new Uri(magnetUrl));
}
catch (Exception ex)
@ -186,7 +188,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll("article:has(a.absolute):has(img.rounded)");

View File

@ -167,7 +167,7 @@ namespace Jackett.Common.Indexers
var result = await RequestWithCookiesAsync(downloadUrl);
if (result.Status != HttpStatusCode.OK)
throw new ExceptionWithConfigData(result.ContentString, configData);
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
//var info = dom.QuerySelectorAll("div.descargar > div.card > div.card-body").First();
//var title = info.QuerySelector("h2.descargarTitulo").TextContent;
@ -192,7 +192,7 @@ namespace Jackett.Common.Indexers
try
{
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var rows = doc.QuerySelector("div.seccion#ultimos_torrents > div.card > div.card-body > div");
@ -284,7 +284,7 @@ namespace Jackett.Common.Indexers
try
{
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var rows = doc.QuerySelectorAll("div.seccion#buscador > div.card > div.card-body > p");
@ -375,7 +375,7 @@ namespace Jackett.Common.Indexers
throw new ExceptionWithConfigData(result.ContentString, configData);
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var data = doc.QuerySelector("div.descargar > div.card > div.card-body");
@ -404,7 +404,7 @@ namespace Jackett.Common.Indexers
throw new ExceptionWithConfigData(result.ContentString, configData);
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var data = doc.QuerySelector("div.descargar > div.card > div.card-body");
@ -457,7 +457,7 @@ namespace Jackett.Common.Indexers
throw new ExceptionWithConfigData(result.ContentString, configData);
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
// parse tags in title, we need to put the year after the real title (before the tags)
// Harry Potter And The Deathly Hallows: Part 1 [subs. Integrados]

View File

@ -133,7 +133,7 @@ namespace Jackett.Common.Indexers
{
var json = JsonConvert.DeserializeObject<dynamic>(result.ContentString);
var parser = new HtmlParser();
var doc = parser.ParseDocument((string)json["contenido"]);
using var doc = parser.ParseDocument((string)json["contenido"]);
var rows = doc.QuerySelectorAll("div.span2");
foreach (var row in rows)
@ -147,7 +147,7 @@ namespace Jackett.Common.Indexers
var qLink = row.QuerySelector("a");
var details = new Uri(qLink.GetAttribute("href"));
var qTooltip = parser.ParseDocument(qLink.GetAttribute("data-content"));
using var qTooltip = parser.ParseDocument(qLink.GetAttribute("data-content"));
// we get the language from the last class tag => class="pull-right sprite idioma_5"
var languageId = qTooltip.QuerySelector("div.pull-right").GetAttribute("class").Split('_')[1];
title += $" [{_languages[languageId]}] [epub]";
@ -195,7 +195,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var doc = parser.ParseDocument(result.ContentString);
using var doc = parser.ParseDocument(result.ContentString);
var magnetLink = doc.QuerySelector("a[id=en_desc]").GetAttribute("href");
return Encoding.UTF8.GetBytes(magnetLink);
}

View File

@ -99,7 +99,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString?.Contains("logout.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector("td.mf_content").TextContent;
throw new ExceptionWithConfigData(errorMessage, configData);
});
@ -197,7 +197,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var rows = dom.QuerySelectorAll("table.mainframe table[cellpadding=\"2\"] > tbody > tr:has(td.row3)");
foreach (var row in rows)

View File

@ -247,7 +247,7 @@ namespace Jackett.Common.Indexers
var RowsSelector = ".torrent_table > tbody > tr";
var SearchResultParser = new HtmlParser();
var SearchResultDocument = SearchResultParser.ParseDocument(results.ContentString);
using var SearchResultDocument = SearchResultParser.ParseDocument(results.ContentString);
var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector);
var stickyGroup = false;

View File

@ -111,7 +111,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(response.Cookies, response.ContentString?.Contains("logout.php") == true || response.ContentString?.Contains("Rank: Parked") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var errorMessages = dom
.QuerySelectorAll("table.lista td.lista span[style*=\"#FF0000\"], table.lista td.header:contains(\"login attempts\")")
.Select(r => r.TextContent.Trim())
@ -149,7 +149,7 @@ namespace Jackett.Common.Indexers
try
{
var resultParser = new HtmlParser();
var searchResultDocument = resultParser.ParseDocument(response.ContentString);
using var searchResultDocument = resultParser.ParseDocument(response.ContentString);
var rows = searchResultDocument.QuerySelectorAll("table.lista > tbody > tr");
foreach (var row in rows)

View File

@ -136,7 +136,7 @@ namespace Jackett.Common.Indexers
result.Cookies, result.ContentString?.Contains("If your browser doesn't have javascript enabled") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector("div > font[color=\"#FF0000\"]")?.TextContent.Trim();
@ -167,7 +167,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var userInfo = dom.QuerySelector("table.navus tr");
var userRank = userInfo.Children[1].TextContent.Replace("Rank:", string.Empty).Trim();

View File

@ -308,7 +308,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var doc = parser.ParseDocument(results);
using var doc = parser.ParseDocument(results);
var rows = doc.QuerySelectorAll("table[id=\"torrents\"] > tbody > tr");
foreach (var row in rows)

View File

@ -165,7 +165,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(response.Cookies, response.ContentString.Contains("logout.php"), () =>
{
var parser = new HtmlParser();
var document = parser.ParseDocument(response.ContentString);
using var document = parser.ParseDocument(response.ContentString);
var errorMessage = document.QuerySelector("#main table td:contains(\"ERROR\")")?.TextContent.Trim();
throw new ExceptionWithConfigData(errorMessage ?? "Login failed.", configData);
@ -213,7 +213,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var rows = dom.QuerySelectorAll("#sortabletable tr:has(a[href*=\"details.php?id=\"])");
foreach (var row in rows)

View File

@ -118,7 +118,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString?.Contains("logout.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector("#loginform > .warning")?.TextContent.Trim();
throw new Exception(errorMessage ?? "Login failed.");
@ -194,7 +194,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(searchPage.ContentString);
using var dom = parser.ParseDocument(searchPage.ContentString);
var albumRows = dom.QuerySelectorAll("table#torrent_table > tbody > tr.group:has(strong > a[href*=\"torrents.php?id=\"])");
foreach (var row in albumRows)

View File

@ -157,7 +157,7 @@ namespace Jackett.Common.Indexers
// looks like after some failed login attempts there's a captcha
var loginPage = await RequestWithCookiesAsync(LoginUrl, string.Empty);
var parser = new HtmlParser();
var document = parser.ParseDocument(loginPage.ContentString);
using var document = parser.ParseDocument(loginPage.ContentString);
var qCaptchaImg = document.QuerySelector("img#captcha_pictcha");
if (qCaptchaImg != null)
{
@ -442,7 +442,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.ParseDocument(results.ContentString);
using var document = parser.ParseDocument(results.ContentString);
var rows = document.QuerySelectorAll("div.row");
foreach (var row in rows)
@ -471,7 +471,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.ParseDocument(results.ContentString);
using var document = parser.ParseDocument(results.ContentString);
var playButton = document.QuerySelector("div.external-btn");
if (playButton != null && !playButton.ClassList.Contains("inactive"))
@ -523,7 +523,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.ParseDocument(results.ContentString);
using var document = parser.ParseDocument(results.ContentString);
var seasons = document.QuerySelectorAll("div.serie-block");
var rowSelector = "table.movie-parts-list > tbody > tr";
@ -688,7 +688,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.ParseDocument(results.ContentString);
using var document = parser.ParseDocument(results.ContentString);
var meta = document.QuerySelector("meta");
var metaContent = meta.GetAttribute("content");
@ -714,7 +714,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var document = parser.ParseDocument(results.ContentString);
using var document = parser.ParseDocument(results.ContentString);
var rows = document.QuerySelectorAll("div.inner-box--item");
if (rows.Count() > 0)

View File

@ -169,7 +169,7 @@ namespace Jackett.Common.Indexers
try
{
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var container = doc.QuerySelector(".gap-y-3 > div:nth-child(1) > div:nth-child(1)");
var parsedDetailsLink = new List<string>();
@ -223,7 +223,7 @@ namespace Jackett.Common.Indexers
try
{
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var table = doc.QuerySelector(".w-11\\/12");
// check the search term is valid
@ -304,7 +304,7 @@ namespace Jackett.Common.Indexers
throw new ExceptionWithConfigData(result.ContentString, configData);
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var rows = doc.QuerySelectorAll("tr.border");
quality = CleanQuality(quality);
@ -344,7 +344,7 @@ namespace Jackett.Common.Indexers
throw new ExceptionWithConfigData(result.ContentString, configData);
var searchResultParser = new HtmlParser();
var doc = searchResultParser.ParseDocument(result.ContentString);
using var doc = searchResultParser.ParseDocument(result.ContentString);
var downloadLink = doc.QuerySelector(".ml-2").GetAttribute("href");

View File

@ -143,7 +143,7 @@ namespace Jackett.Common.Indexers
result.Cookies, result.ContentString?.Contains("profile.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var msgContainer = dom.QuerySelector("#hibauzenet table tbody tr")?.Children[1];
throw new ExceptionWithConfigData(msgContainer?.TextContent ?? "Error while trying to login.", configData);
});
@ -196,7 +196,7 @@ namespace Jackett.Common.Indexers
var results = await RequestWithCookiesAndRetryAsync(
SearchUrl, null, RequestType.POST, null, pairs.ToEnumerable(true));
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
// find number of torrents / page
var torrentPerPage = dom.QuerySelectorAll(".box_torrent").Length;
@ -243,7 +243,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var rows = dom.QuerySelectorAll(".box_torrent").Skip(previouslyParsedOnPage).Take(limit - alreadyFound);
var key = ParseUtil.GetArgumentFromQueryString(

View File

@ -248,7 +248,7 @@ namespace Jackett.Common.Indexers
// Getting results & Store content
var response = await RequestWithCookiesAndRetryAsync(request, ConfigData.CookieHeader.Value);
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
try
{

View File

@ -146,7 +146,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var rows = dom.QuerySelectorAll("table.main > tbody > tr");
foreach (var row in rows.Skip(1))
{

View File

@ -69,7 +69,7 @@ namespace Jackett.Common.Indexers
{
var loginPage = await RequestWithCookiesAsync(LoginUrl, string.Empty);
var LoginParser = new HtmlParser();
var LoginDocument = LoginParser.ParseDocument(loginPage.ContentString);
using var LoginDocument = LoginParser.ParseDocument(loginPage.ContentString);
configData.CaptchaCookie.Value = loginPage.Cookies;
@ -116,7 +116,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString.Contains("logout.php"), () =>
{
var LoginParser = new HtmlParser();
var LoginDocument = LoginParser.ParseDocument(result.ContentString);
using var LoginDocument = LoginParser.ParseDocument(result.ContentString);
var errorMessage = LoginDocument.QuerySelector("span.warning[id!=\"no-cookies\"]:has(br)").TextContent;
throw new ExceptionWithConfigData(errorMessage, configData);
});
@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
var IMDBRegEx = new Regex(@"tt(\d+)", RegexOptions.Compiled);
var hParser = new HtmlParser();
var ResultDocument = hParser.ParseDocument(results.ContentString);
using var ResultDocument = hParser.ParseDocument(results.ContentString);
try
{
var Groups = ResultDocument.QuerySelectorAll("div.browsePoster");

View File

@ -177,7 +177,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(loginCookies, result.ContentString?.Contains("logout.php") == true, () =>
{
var loginResultParser = new HtmlParser();
var loginResultDocument = loginResultParser.ParseDocument(result.ContentString);
using var loginResultDocument = loginResultParser.ParseDocument(result.ContentString);
var errorMessage = loginResultDocument.QuerySelector("table.body_table font[color~=\"red\"]")?.TextContent.Trim();
throw new ExceptionWithConfigData(errorMessage ?? "Login failed", configData);
@ -249,7 +249,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll("table > tbody > tr.browse");
foreach (var row in rows)

View File

@ -159,7 +159,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(results.ContentString);
using var dom = parser.ParseDocument(results.ContentString);
var rows = dom.QuerySelectorAll("#torrents-table > tbody > tr");
foreach (var row in rows.Skip(1))

View File

@ -1398,7 +1398,7 @@ namespace Jackett.Common.Indexers
configData.CookieHeader.Value = null;
var response = await RequestWithCookiesAsync(LoginUrl);
var parser = new HtmlParser();
var doc = parser.ParseDocument(response.ContentString);
using var doc = parser.ParseDocument(response.ContentString);
var captchaimg = doc.QuerySelector("img[src^=\"https://static.rutracker.cc/captcha/\"]");
if (captchaimg != null)
@ -1444,7 +1444,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString != null && result.ContentString.Contains("id=\"logged-in-username\""), () =>
{
var parser = new HtmlParser();
var doc = parser.ParseDocument(result.ContentString);
using var doc = parser.ParseDocument(result.ContentString);
var errorMessage = doc.QuerySelector("h4.warnColor1.tCenter.mrg_16, div.msg-main")?.TextContent.Trim();
throw new ExceptionWithConfigData(errorMessage ?? "RuTracker authentication failed", configData);
@ -1498,7 +1498,7 @@ namespace Jackett.Common.Indexers
var response = await RequestWithCookiesAsync(link.ToString());
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var magnetLink = dom.QuerySelector("table.attach a.magnet-link[href^=\"magnet:?\"]")?.GetAttribute("href");
if (magnetLink == null)
@ -1560,7 +1560,7 @@ namespace Jackett.Common.Indexers
private IHtmlCollection<IElement> GetReleaseRows(WebResult results)
{
var parser = new HtmlParser();
var doc = parser.ParseDocument(results.ContentString);
using var doc = parser.ParseDocument(results.ContentString);
var rows = doc.QuerySelectorAll("table#tor-tbl > tbody > tr");
return rows;
}

View File

@ -166,7 +166,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(htmlResponse);
using var dom = parser.ParseDocument(htmlResponse);
var table = dom.QuerySelector("table.movehere");
if (table == null)

View File

@ -124,7 +124,7 @@ namespace Jackett.Common.Indexers
response = await ReloginIfNecessaryAsync(response);
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
hasGlobalFreeleech = dom.QuerySelector("span:contains(\"Freeleech until:\"):has(span.datetime)") != null;
@ -185,7 +185,7 @@ namespace Jackett.Common.Indexers
var releases = new List<ReleaseInfo>();
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
if (!hasGlobalFreeleech)
hasGlobalFreeleech = dom.QuerySelector("span:contains(\"Freeleech until:\"):has(span.datetime)") != null;

View File

@ -147,7 +147,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString?.Contains("/browse.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector("h5")?.TextContent;
if (result.ContentString.Contains("Wrong Captcha!"))
@ -221,7 +221,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll("div.boxContent > table > tbody > tr");
foreach (var row in rows)

View File

@ -169,7 +169,7 @@ namespace Jackett.Common.Indexers
var downloadLink = new Uri(DownloadUrl + "?id=" + torrentId);
// the genre field is a html string, and we just want the text
var parser = new HtmlParser();
var dom = parser.ParseDocument(row[(int)TorrentParts.Genre]);
using var dom = parser.ParseDocument(row[(int)TorrentParts.Genre]);
var genres = dom.QuerySelector("*").TextContent.Replace("\xA0", "");
var description = "";
if (!string.IsNullOrWhiteSpace(genres))

View File

@ -222,7 +222,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString != null && result.ContentString.Contains("logout=true"), () =>
{
var loginResultParser = new HtmlParser();
var loginResultDocument = loginResultParser.ParseDocument(result.ContentString);
using var loginResultDocument = loginResultParser.ParseDocument(result.ContentString);
var errorMessage = loginResultDocument.QuerySelector("table.forumline table span.gen")?.FirstChild?.TextContent;
throw new ExceptionWithConfigData(errorMessage ?? "Unknown error message, please report.", configData);
@ -281,7 +281,7 @@ namespace Jackett.Common.Indexers
try
{
var searchResultParser = new HtmlParser();
var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
using var searchResultDocument = searchResultParser.ParseDocument(results.ContentString);
var rows = searchResultDocument.QuerySelectorAll("table.forumline > tbody > tr[class*=\"prow\"]");
foreach (var row in rows)

View File

@ -116,7 +116,7 @@ namespace Jackett.Common.Indexers
result.Cookies, result.ContentString?.Contains("my.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var messageEl = dom.QuerySelector("td.embedded");
var errorMessage = messageEl != null ? messageEl.TextContent : result.ContentString;
throw new ExceptionWithConfigData(errorMessage, configData);
@ -159,7 +159,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll("table > tbody:has(tr > td.colhead) > tr:not(:has(td.colhead))");
foreach (var row in rows)
{

View File

@ -138,7 +138,7 @@ namespace Jackett.Common.Indexers
!result.ContentString.Contains("index.php?strWebValue=account&strWebAction=logout")))
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessageEl = dom.QuerySelector("table > tbody > tr > td[valign=top][width=100%]");
var errorMessage = errorMessageEl != null ? errorMessageEl.InnerHtml : result.ContentString;
throw new ExceptionWithConfigData(errorMessage, configData);
@ -155,7 +155,7 @@ namespace Jackett.Common.Indexers
{
var loginPage = await RequestWithCookiesAsync(IndexUrl, string.Empty);
var parser = new HtmlParser();
var dom = parser.ParseDocument(loginPage.ContentString);
using var dom = parser.ParseDocument(loginPage.ContentString);
var qCaptchaImg = dom.QuerySelector("td.tablea > img");
if (qCaptchaImg != null)
{
@ -212,7 +212,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var rows = dom.QuerySelectorAll("table.torrenttable > tbody > tr");
foreach (var row in rows.Skip(1))
{

View File

@ -94,7 +94,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(response.Cookies, response.Cookies != null && response.Cookies.Contains("uid=") && response.Cookies.Contains("pass="), () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var errorMessage = dom.QuerySelector(".login-content span.text-red")?.TextContent.Trim();
throw new ExceptionWithConfigData(errorMessage ?? "Unknown error message, please report.", configData);
@ -137,9 +137,9 @@ namespace Jackett.Common.Indexers
var publishDate = DateTime.Now;
foreach (var item in jsonContent.Value<JArray>("data"))
{
var detailsDom = parser.ParseDocument(item.SelectToken("[0]").Value<string>());
var categoryDom = parser.ParseDocument(item.SelectToken("[1]").Value<string>());
var groupDom = parser.ParseDocument(item.SelectToken("[7]").Value<string>());
using var detailsDom = parser.ParseDocument(item.SelectToken("[0]").Value<string>());
using var categoryDom = parser.ParseDocument(item.SelectToken("[1]").Value<string>());
using var groupDom = parser.ParseDocument(item.SelectToken("[7]").Value<string>());
var qTitleLink = detailsDom.QuerySelector("a[href^=\"torrents-details.php?id=\"]");
var title = qTitleLink?.TextContent.Trim();
@ -191,7 +191,7 @@ namespace Jackett.Common.Indexers
var response = await RequestWithCookiesAsync(link.ToString());
var parser = new HtmlParser();
var dom = parser.ParseDocument(response.ContentString);
using var dom = parser.ParseDocument(response.ContentString);
var downloadLink = dom.QuerySelector("a[href^=\"download.php?id=\"]")?.GetAttribute("href")?.Trim();
if (downloadLink == null)

View File

@ -163,7 +163,7 @@ namespace Jackett.Common.Indexers
{
var loginPage = await RequestWithCookiesAsync(LandingUrl);
var parser = new HtmlParser();
var dom = parser.ParseDocument(loginPage.ContentString);
using var dom = parser.ParseDocument(loginPage.ContentString);
var qCaptchaImg = dom.QuerySelector("img#regimage");
if (qCaptchaImg != null)
{
@ -204,7 +204,7 @@ namespace Jackett.Common.Indexers
await ConfigureIfOK(result.Cookies, result.ContentString?.Contains("logout.php") == true, () =>
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var errorMessage = dom.QuerySelector(".left_side table:nth-of-type(1) tr:nth-of-type(2)")?.TextContent.Trim().Replace("\n\t", " ");
if (errorMessage.IsNullOrWhiteSpace())
@ -268,7 +268,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var dom = parser.ParseDocument(searchPage.ContentString);
using var dom = parser.ParseDocument(searchPage.ContentString);
var rows = dom.QuerySelectorAll("table#sortabletable > tbody > tr:has(div > a[href*=\"details.php?id=\"])");
foreach (var row in rows)
{

View File

@ -177,7 +177,7 @@ namespace Jackett.Common.Indexers
try
{
var parser = new HtmlParser();
var doc = parser.ParseDocument(results);
using var doc = parser.ParseDocument(results);
var rows = doc.QuerySelectorAll("table.torrent_list > tbody > tr");
foreach (var row in rows.Skip(1))
@ -248,7 +248,7 @@ namespace Jackett.Common.Indexers
CookieHeader = "";
var result = await RequestWithCookiesAsync(Login1Url, "");
var parser = new HtmlParser();
var dom = parser.ParseDocument(result.ContentString);
using var dom = parser.ParseDocument(result.ContentString);
var sessionId = dom.QuerySelector("input#session_id")?.GetAttribute("value");
if (string.IsNullOrWhiteSpace(sessionId))
throw new ExceptionWithConfigData("Error getting the Session ID", configData);