diff --git a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs index 276ccf033..0bac28dfd 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/HDSpace.cs @@ -3,9 +3,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Net; -using System.Net.Http; using System.Text; -using System.Text.RegularExpressions; using System.Threading.Tasks; using AngleSharp.Html.Parser; using NLog; @@ -31,7 +29,6 @@ namespace NzbDrone.Core.Indexers.Definitions public override DownloadProtocol Protocol => DownloadProtocol.Torrent; public override IndexerPrivacy Privacy => IndexerPrivacy.Private; public override IndexerCapabilities Capabilities => SetCapabilities(); - private string LoginUrl => Settings.BaseUrl + "index.php?page=login"; public HDSpace(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger) : base(httpClient, eventAggregator, indexerStatusService, configService, logger) @@ -50,37 +47,41 @@ namespace NzbDrone.Core.Indexers.Definitions protected override async Task DoLogin() { - var loginPage = await ExecuteAuth(new HttpRequest(LoginUrl)); + var loginUrl = Settings.BaseUrl + "index.php?page=login"; - var requestBuilder = new HttpRequestBuilder(LoginUrl) + var loginPage = await ExecuteAuth(new HttpRequest(loginUrl)); + + var requestBuilder = new HttpRequestBuilder(loginUrl) { LogResponseContent = true, - AllowAutoRedirect = true, - Method = HttpMethod.Post + AllowAutoRedirect = true }; var cookies = Cookies; Cookies = null; var authLoginRequest = requestBuilder + .Post() .AddFormParameter("uid", Settings.Username) .AddFormParameter("pwd", Settings.Password) .SetCookies(loginPage.GetCookies()) .SetHeader("Content-Type", "application/x-www-form-urlencoded") - .SetHeader("Referer", LoginUrl) + .SetHeader("Referer", loginUrl) .Build(); var response = await ExecuteAuth(authLoginRequest); if (CheckIfLoginNeeded(response)) { - var errorStr = "Login Failed: You have {0} remaining login attempts"; - var remainingAttemptSpan = new Regex(string.Format(errorStr, "(.*?)")) - .Match(loginPage.Content).Groups[1].ToString(); - var attempts = Regex.Replace(remainingAttemptSpan, "<.*?>", string.Empty); - var errorMessage = string.Format(errorStr, attempts); - - throw new IndexerAuthException(errorMessage); + var parser = new HtmlParser(); + var dom = parser.ParseDocument(response.Content); + var errorMessages = dom + .QuerySelectorAll("table.lista td.lista span[style*=\"#FF0000\"], table.lista td.header:contains(\"login attempts\")") + .Select(r => r.TextContent.Trim()) + .Where(m => m.IsNotNullOrWhiteSpace()) + .ToArray(); + + throw new IndexerAuthException(errorMessages.Any() ? errorMessages.Join(" ") : "Unknown error message, please report."); } cookies = response.GetCookies(); @@ -91,7 +92,7 @@ namespace NzbDrone.Core.Indexers.Definitions protected override bool CheckIfLoginNeeded(HttpResponse httpResponse) { - return !httpResponse.Content.Contains("logout.php"); + return !httpResponse.Content.Contains("logout.php") && !httpResponse.Content.Contains("Rank: Parked"); } private IndexerCapabilities SetCapabilities()