private TorznabCapabilities ParseCapabilities(HttpResponse response) { var capabilities = new TorznabCapabilities(); var xmlRoot = XDocument.Parse(response.Content).Element("caps"); var xmlSearching = xmlRoot.Element("searching"); if (xmlSearching != null) { var xmlBasicSearch = xmlSearching.Element("search"); if (xmlBasicSearch == null || xmlBasicSearch.Attribute("available").Value != "yes") { capabilities.SupportedSearchParameters = null; } else if (xmlBasicSearch.Attribute("supportedParams") != null) { capabilities.SupportedSearchParameters = xmlBasicSearch.Attribute("supportedParams").Value.Split(','); } var xmlTvSearch = xmlSearching.Element("tv-search"); if (xmlTvSearch == null || xmlTvSearch.Attribute("available").Value != "yes") { capabilities.SupportedTvSearchParameters = null; } else if (xmlTvSearch.Attribute("supportedParams") != null) { capabilities.SupportedTvSearchParameters = xmlTvSearch.Attribute("supportedParams").Value.Split(','); } } var xmlCategories = xmlRoot.Element("categories"); if (xmlCategories != null) { foreach (var xmlCategory in xmlCategories.Elements("category")) { var cat = new TorznabCategory { Id = int.Parse(xmlCategory.Attribute("id").Value), Name = xmlCategory.Attribute("name").Value, Description = xmlCategory.Attribute("description") != null ? xmlCategory.Attribute("description").Value : string.Empty, Subcategories = new List<TorznabCategory>() }; foreach (var xmlSubcat in xmlCategory.Elements("subcat")) { cat.Subcategories.Add(new TorznabCategory { Id = int.Parse(xmlSubcat.Attribute("id").Value), Name = xmlSubcat.Attribute("name").Value, Description = xmlSubcat.Attribute("description") != null ? xmlCategory.Attribute("description").Value : string.Empty }); } capabilities.Categories.Add(cat); } } return capabilities; }
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { var results = new List<ReleaseInfo>(); switch (indexerResponse.HttpResponse.StatusCode) { case HttpStatusCode.Unauthorized: throw new ApiKeyException("API Key invalid or not authorized"); case HttpStatusCode.NotFound: throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed."); case HttpStatusCode.ServiceUnavailable: throw new RequestLimitReachedException("Cannot do more than 150 API requests per hour."); default: if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); } break; } var jsonResponse = new HttpResponse<JsonRpcResponse<BroadcastheNetTorrents>>(indexerResponse.HttpResponse).Resource; if (jsonResponse.Error != null || jsonResponse.Result == null) { throw new IndexerException(indexerResponse, "Indexer API call returned an error [{0}]", jsonResponse.Error); } if (jsonResponse.Result.Results == 0) { return results; } var protocol = indexerResponse.HttpRequest.Url.Scheme + ":"; foreach (var torrent in jsonResponse.Result.Torrents.Values) { var torrentInfo = new TorrentInfo(); torrentInfo.Guid = string.Format("BTN-{0}", torrent.TorrentID); torrentInfo.Title = torrent.ReleaseName; torrentInfo.Size = torrent.Size; torrentInfo.DownloadUrl = RegexProtocol.Replace(torrent.DownloadURL, protocol); torrentInfo.InfoUrl = string.Format("{0}//broadcasthe.net/torrents.php?id={1}&torrentid={2}", protocol, torrent.GroupID, torrent.TorrentID); //torrentInfo.CommentUrl = if (torrent.TvrageID.HasValue) { torrentInfo.TvRageId = torrent.TvrageID.Value; } torrentInfo.PublishDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().AddSeconds(torrent.Time); //torrentInfo.MagnetUrl = torrentInfo.InfoHash = torrent.InfoHash; torrentInfo.Seeders = torrent.Seeders; torrentInfo.Peers = torrent.Leechers + torrent.Seeders; results.Add(torrentInfo); } return results; }
public TooManyRequestsException(HttpRequest request, HttpResponse response) : base(request, response) { if (response.Headers.ContainsKey("Retry-After")) { RetryAfter = TimeSpan.FromSeconds(int.Parse(response.Headers["Retry-After"].ToString())); } }
public HttpResponse PostResponse(HttpResponse response) { if (response.StatusCode == HttpStatusCode.Forbidden && response.Content.Contains(_cloudFlareChallengeScript)) { _logger.Debug("CloudFlare CAPTCHA block on {0}", response.Request.Url); throw new CloudFlareCaptchaException(response, CreateCaptchaRequest(response)); } return response; }
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { var results = new List<ReleaseInfo>(); switch (indexerResponse.HttpResponse.StatusCode) { default: if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); } break; } var jsonResponse = new HttpResponse<RarbgResponse>(indexerResponse.HttpResponse); if (jsonResponse.Resource.error_code.HasValue) { if (jsonResponse.Resource.error_code == 20 || jsonResponse.Resource.error_code == 8) { // No results found return results; } throw new IndexerException(indexerResponse, "Indexer API call returned error {0}: {1}", jsonResponse.Resource.error_code, jsonResponse.Resource.error); } if (jsonResponse.Resource.torrent_results == null) { return results; } foreach (var torrent in jsonResponse.Resource.torrent_results) { var torrentInfo = new TorrentInfo(); torrentInfo.Guid = GetGuid(torrent); torrentInfo.Title = torrent.title; torrentInfo.Size = torrent.size; torrentInfo.DownloadUrl = torrent.download; torrentInfo.InfoUrl = torrent.info_page; torrentInfo.PublishDate = torrent.pubdate; torrentInfo.Seeders = torrent.seeders; torrentInfo.Peers = torrent.leechers + torrent.seeders; if (torrent.episode_info != null && torrent.episode_info.tvrage != null) { torrentInfo.TvRageId = torrent.episode_info.tvrage.Value; } results.Add(torrentInfo); } return results; }
private CloudFlareCaptchaRequest CreateCaptchaRequest(HttpResponse response) { var match = _cloudFlareRegex.Match(response.Content); if (!match.Success) { return null; } return new CloudFlareCaptchaRequest { Host = response.Request.Url.Host, SiteKey = match.Groups["SiteKey"].Value, Ray = match.Groups["Ray"].Value, SecretToken = match.Groups["SecretToken"].Value, ResponseUrl = response.Request.Url + new HttpUri("/cdn-cgi/l/chk_captcha") }; }
public TooManyRequestsException(HttpRequest request, HttpResponse response) : base(request, response) { if (response.Headers.ContainsKey("Retry-After")) { var retryAfter = response.Headers["Retry-After"].ToString(); int seconds; DateTime date; if (int.TryParse(retryAfter, out seconds)) { RetryAfter = TimeSpan.FromSeconds(seconds); } else if (DateTime.TryParse(retryAfter, out date)) { RetryAfter = date.ToUniversalTime() - DateTime.UtcNow; } } }
private void CheckForError(HttpResponse response) { SabnzbdJsonError result; if (!Json.TryDeserialize<SabnzbdJsonError>(response.Content, out result)) { //Handle plain text responses from SAB result = new SabnzbdJsonError(); if (response.Content.StartsWith("error", StringComparison.InvariantCultureIgnoreCase)) { result.Status = "false"; result.Error = response.Content.Replace("error: ", ""); } else { result.Status = "true"; } result.Error = response.Content.Replace("error: ", ""); } if (result.Failed) { throw new DownloadClientException("Error response received from SABnzbd: {0}", result.Error); } }
public HttpException(HttpRequest request, HttpResponse response) : base(string.Format("HTTP request failed: [{0}:{1}] [{2}] at [{3}]", (int)response.StatusCode, response.StatusCode, request.Method, request.Url.ToString())) { Request = request; Response = response; }
public HttpException(HttpResponse response) : this(response.Request, response) { }
public HttpResponse PostResponse(HttpResponse response) { return response; }
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse) { _indexerRequest = indexerRequest; _httpResponse = httpResponse; }
private void CheckForError(HttpResponse response) { _logger.Debug("Looking for error in response: {0}", response); //TODO: actually check for the error }
public CloudFlareCaptchaException(HttpResponse response, CloudFlareCaptchaRequest captchaRequest) : base("Unable to access {0}, blocked by CloudFlare CAPTCHA. Likely due to shared-IP VPN.", response.Request.Url.Host) { Response = response; CaptchaRequest = captchaRequest; }