public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); string episodeSearchUrl; if (string.IsNullOrEmpty(query.GetQueryString())) episodeSearchUrl = SearchUrl; else { episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString())); } var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; var rows = dom["#highlight > tbody > tr"]; foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qLink = qRow.Find("a.torrent_name_link").First(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = release.Title; release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; release.Link = new Uri(SiteLink + qRow.Find("td.table_links > a").First().Attr("href")); DateTime pubDate; var dateString = qRow.Find("td.table_added").Text().Trim(); if (dateString.StartsWith("Today ")) pubDate = (DateTime.UtcNow + TimeSpan.Parse(dateString.Split(' ')[1])).ToLocalTime(); else if (dateString.StartsWith("Yesterday ")) pubDate = (DateTime.UtcNow + TimeSpan.Parse(dateString.Split(' ')[1]) - TimeSpan.FromDays(1)).ToLocalTime(); else pubDate = DateTime.ParseExact(dateString, "d-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); release.PublishDate = pubDate; release.Seeders = ParseUtil.CoerceInt(qRow.Find("td.table_seeders").Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Find("td.table_leechers").Text().Trim()) + release.Seeders; var sizeStr = qRow.Find("td.table_size")[0].Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { string Url; if (string.IsNullOrEmpty(query.GetQueryString())) Url = SearchUrl; else { Url = $"{SearchUrl}&searchtext={HttpUtility.UrlEncode(query.GetQueryString())}"; } var response = await RequestStringWithCookiesAndRetry(Url); List<ReleaseInfo> releases = ParseResponse(response.Content); return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchUrl = BrowseUrl; var searchString = query.GetQueryString(); var cats = MapTorznabCapsToTrackers(query); string cat = "0"; if (cats.Count == 1) { cat = cats[0]; } if (!string.IsNullOrWhiteSpace(searchString) || cat != "0") searchUrl += string.Format("?search={0}¶m_val=0&complex_search=0&incldead=mc{1}&orderby=added&sort=desc", HttpUtility.UrlEncode(searchString), cat); var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); var results = response.Content; try { CQ dom = results; var rows = dom["td#browse-middle-td"]; foreach (var row in rows) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qTitleLink = qRow.Find("table tbody tr:eq(0) td a").First(); release.Title = qRow.Find("table tbody tr:eq(0) td a b").Text().Trim(); release.Description = release.Title; release.Guid = new Uri(SiteLink + qTitleLink.Attr("href")); release.Comments = release.Guid; //24.04.2016 16:44:57 var dateStr = qRow.Find("table tbody tr:eq(1) td:eq(4)").Html().Replace(" ", " ").Trim(); release.PublishDate = DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture).AddHours(-2); var qLink = qRow.First().Next().Find("a"); release.Link = new Uri(SiteLink + qLink.Attr("href")); var sizeStr = qRow.Find("table tbody tr:eq(1) td b").Text().Trim(); release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(",", ".")); release.Seeders = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(0) font").Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(1) font").Text().Trim()) + release.Seeders; var catId = qRow.First().Prev().Find("a").Attr("onclick").Substring(21, 2); release.Category = MapTrackerCatToNewznab(catId); releases.Add(release); } } catch (Exception ex) { OnParseError(results, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var categoryMapping = MapTorznabCapsToTrackers(query).Distinct(); string category = "0"; // Aka all if (categoryMapping.Count() == 1) { category = categoryMapping.First(); } var episodeSearchUrl = string.Format(SearchUrl, category, HttpUtility.UrlEncode(query.GetQueryString())); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = response.Content; var rows = dom["table > tbody > tr"]; foreach (var row in rows) { CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var qLink = row.ChildElements.ElementAt(1).FirstElementChild.Cq(); release.Title = qLink.Text().Trim(); release.Comments = new Uri(qLink.Attr("href")); release.Guid = release.Comments; var qDownload = row.ChildElements.ElementAt(3).FirstElementChild.Cq(); release.Link = new Uri(qDownload.Attr("href")); var dateStr = row.ChildElements.ElementAt(5).Cq().Text().Trim(); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); var sizeStr = row.ChildElements.ElementAt(6).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).Cq().Text()) + release.Seeders; var cat = row.Cq().Find("td:eq(0) i").First().Attr("class") .Replace("gi gi-film", "1") .Replace("gi gi-tv", "2") .Replace("gi gi-music", "3"); release.Category = MapTrackerCatToNewznab(cat); releases.Add(release); } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var results = await RequestStringWithCookiesAndRetry(string.Format(SearchUrl, query.GetQueryString())); try { CQ dom = results.Content; var rows = dom["#torrents-table > tbody > tr.tt_row"]; foreach (var row in rows) { CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 129600; release.Title = qRow.Find(".ttr_name > a").Text(); release.Description = release.Title; release.Guid = new Uri(SiteLink + "/" + qRow.Find(".ttr_name > a").Attr("href")); release.Comments = release.Guid; release.Link = new Uri(SiteLink + "/" + qRow.Find(".td_dl > a").Attr("href")); var sizeStr = qRow.Find(".ttr_size").Contents()[0].NodeValue; release.Size = ReleaseInfo.GetBytes(sizeStr); var timeStr = qRow.Find(".ttr_added").Text(); DateTime time; if (DateTime.TryParseExact(timeStr, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out time)) { release.PublishDate = time; } release.Seeders = ParseUtil.CoerceInt(qRow.Find(".ttr_seeders").Text()); release.Peers = ParseUtil.CoerceInt(qRow.Find(".ttr_leechers").Text()) + release.Seeders; var cat = qRow.Find(".ttr_type a").Attr("href"); if (cat == "?cat=27") { release.Category = TorznabCatType.TVHD.ID; } else if (cat == "?cat=17") { release.Category = TorznabCatType.TVSD.ID; } releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(query.GetQueryString())); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); var results = response.Content; try { CQ dom = results; var rows = dom["table.lista > tbody > tr"]; foreach (var row in rows) { // this tracker has horrible markup, find the result rows by looking for the style tag before each one var prev = row.PreviousElementSibling; if (prev == null || prev.NodeName.ToLowerInvariant() != "style") continue; CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var qLink = row.ChildElements.ElementAt(1).FirstElementChild.Cq(); release.Title = qLink.Text().Trim(); release.Comments = new Uri(SiteLink + qLink.Attr("href")); release.Guid = release.Comments; var qDownload = row.ChildElements.ElementAt(3).FirstElementChild.Cq(); release.Link = new Uri(SiteLink + qDownload.Attr("href")); //"July 11, 2015, 13:34:09", "Today at 20:04:23" var dateStr = row.ChildElements.ElementAt(4).Cq().Text().Trim(); if (dateStr.StartsWith("Today")) release.PublishDate = DateTime.Today + TimeSpan.ParseExact(dateStr.Replace("Today at ", ""), "hh\\:mm\\:ss", CultureInfo.InvariantCulture); else if (dateStr.StartsWith("Yesterday")) release.PublishDate = DateTime.Today - TimeSpan.FromDays(1) + TimeSpan.ParseExact(dateStr.Replace("Yesterday at ", ""), "hh\\:mm\\:ss", CultureInfo.InvariantCulture); else release.PublishDate = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MMMM dd, yyyy, HH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Local); var sizeStr = row.ChildElements.ElementAt(5).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text()); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(results, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var searchString = query.GetQueryString(); var releases = new List<ReleaseInfo>(); var parameters = new JArray(); parameters.Add(new JValue(configData.Key.Value)); parameters.Add(new JValue(searchString.Trim())); parameters.Add(new JValue(100)); parameters.Add(new JValue(0)); var response = await PostDataWithCookiesAndRetry(APIBASE, null, null, null, new Dictionary<string, string>() { { "Accept", "application/json-rpc, application/json"}, {"Content-Type", "application/json-rpc"} }, JsonRPCRequest("getTorrents", parameters),false); try { var btnResponse = JsonConvert.DeserializeObject<BTNRPCResponse>(response.Content); if (btnResponse != null && btnResponse.Result != null) { foreach (var itemKey in btnResponse.Result.Torrents) { var btnResult = itemKey.Value; var item = new ReleaseInfo(); if (!string.IsNullOrEmpty(btnResult.SeriesBanner)) item.BannerUrl = new Uri(btnResult.SeriesBanner); item.Category = TorznabCatType.TV.ID; item.Comments = new Uri($"https://broadcasthe.net/torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}"); item.Description = btnResult.ReleaseName; item.Guid = new Uri(btnResult.DownloadURL); if (!string.IsNullOrWhiteSpace(btnResult.ImdbID)) item.Imdb = ParseUtil.CoerceLong(btnResult.ImdbID); item.Link = new Uri(btnResult.DownloadURL); item.MinimumRatio = 1; item.PublishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time); item.RageID = btnResult.TvrageID; item.Seeders = btnResult.Seeders; item.Peers = btnResult.Seeders + btnResult.Leechers; item.Size = btnResult.Size; item.TVDBId = btnResult.TvdbID; item.Title = btnResult.ReleaseName; releases.Add(item); } } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var isTv = Array.IndexOf(query.Categories, TorznabCatType.TV.ID) > -1; var releases = new List<ReleaseInfo>(); var searchQuery = query.GetQueryString(); await GetReleases(releases, query, searchQuery); // Search for torrent groups if (isTv) { var seasonMatch = new Regex(@".*\s[Ss]{1}\d{2}").Match(query.GetQueryString()); if (seasonMatch.Success) { var newSearchQuery = Regex.Replace(searchQuery, @"[Ss]{1}\d{2}", $"Season {query.Season}"); await GetReleases(releases, query, newSearchQuery); } } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim())); var xmlDoc = new XmlDocument(); string xml = string.Empty; var result = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { xmlDoc.LoadXml(result.Content); ReleaseInfo release; TorrentzHelper td; string serie_title; foreach (XmlNode node in xmlDoc.GetElementsByTagName("item")) { release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; serie_title = node.SelectSingleNode("title").InnerText; release.Title = serie_title; release.Comments = new Uri(node.SelectSingleNode("link").InnerText); int category = 0; int.TryParse(node.SelectSingleNode("category").InnerText, out category); release.Category = category; release.Guid = new Uri(node.SelectSingleNode("guid").InnerText); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); td = new TorrentzHelper(node.SelectSingleNode("description").InnerText); release.Description = td.Description; release.InfoHash = td.hash; release.Size = td.Size; release.Seeders = td.Seeders; release.Peers = td.Peers + release.Seeders; release.MagnetUri = TorrentzHelper.createMagnetLink(td.hash, serie_title); releases.Add(release); } } catch (Exception ex) { OnParseError(xml, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { List<ReleaseInfo> releases = new List<ReleaseInfo>(); var searchTerm = string.IsNullOrEmpty(query.SanitizedSearchTerm) ? "2015" : query.SanitizedSearchTerm; var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(query.GetQueryString())); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl, string.Empty); try { var jResults = JObject.Parse(results.Content); foreach (JObject result in (JArray)jResults["torrents"]) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = (string)result["torrent_title"]; release.Description = release.Title; release.Seeders = (int)result["seeds"]; release.Peers = (int)result["leeches"] + release.Seeders; release.Size = (long)result["size"]; // "Apr 2, 2015", "Apr 12, 2015" (note the spacing) // some are unix timestamps, some are not.. :/ var dateString = string.Join(" ", ((string)result["upload_date"]).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); float dateVal; if (ParseUtil.TryCoerceFloat(dateString, out dateVal)) release.PublishDate = DateTimeUtil.UnixTimestampToDateTime(dateVal); else release.PublishDate = DateTime.ParseExact(dateString, "MMM d, yyyy", CultureInfo.InvariantCulture); release.Guid = new Uri((string)result["page"]); release.Comments = release.Guid; release.InfoHash = (string)result["torrent_hash"]; release.MagnetUri = new Uri((string)result["magnet_uri"]); release.Link = new Uri(string.Format(DownloadUrl, release.InfoHash)); releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(query.GetQueryString())); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = response.Content; var rows = dom["table > tbody > tr.browse"]; foreach (var row in rows) { CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var qLink = row.ChildElements.ElementAt(1).Cq().Find("a").First(); release.Title = qLink.Text().Trim(); if (qLink.Find("span").Count() == 1 && release.Title.StartsWith("NEW! |")) { release.Title = release.Title.Substring(6).Trim(); } release.Comments = new Uri(SiteLink + qLink.Attr("href")); release.Guid = release.Comments; var qDownload = row.ChildElements.ElementAt(2).Cq().Find("a").First(); release.Link = new Uri(SiteLink + qDownload.Attr("href")); var dateStr = row.ChildElements.ElementAt(5).InnerHTML.Replace("<br>", " "); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); var sizeStr = row.ChildElements.ElementAt(7).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).InnerText); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(10).InnerText) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(query.GetQueryString()); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; dom["#needseed"].Remove(); var rows = dom["table[width='750'] > tbody"].Children(); foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qLink = qRow.Children().ElementAt(2).Cq().Children("a").First(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = release.Title; release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; release.Link = new Uri(string.Format(DownloadUrl, qLink.Attr("href").Split('=')[1])); var dateString = qRow.Children().ElementAt(5).Cq().Text().Trim(); var pubDate = DateTime.ParseExact(dateString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); release.PublishDate = DateTime.SpecifyKind(pubDate, DateTimeKind.Local); var sizeStr = qRow.Children().ElementAt(6).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qRow.Children().ElementAt(8).Cq().Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Children().ElementAt(9).Cq().Text().Trim()) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var results = await PostDataWithCookiesAndRetry(SearchUrl, GetSearchFormData(query.GetQueryString())); try { CQ dom = results.Content; var rows = dom["tr.browse"]; foreach (var row in rows) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var descCol = row.ChildElements.ElementAt(1); var qDescCol = descCol.Cq(); var qLink = qDescCol.Find("a"); release.Title = qLink.Text(); release.Description = release.Title; release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href")); release.Guid = release.Comments; var torrentId = qLink.Attr("href").Split('=')[1]; release.Link = new Uri(string.Format(DownloadUrl, torrentId)); release.PublishDate = DateTimeUtil.FromTimeAgo(descCol.ChildNodes.Last().InnerText); var sizeStr = row.ChildElements.ElementAt(5).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(6).Cq().Text().Trim()); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text().Trim()) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; var rows = dom["#torrent_table > tbody > tr.torrent"]; foreach (var row in rows) { CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qRow.Find(".torrent_name_link").Text(); release.Description = release.Title; release.Guid = new Uri(SiteLink + "/" + qRow.Find(".torrent_name_link").Parent().Attr("href")); release.Comments = release.Guid; release.Link = new Uri(SiteLink + "/" + qRow.Find(".torrent_handle_links > a").First().Attr("href")); var dateStr = qRow.Find(".time").Text().Trim(); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); var sizeStr = qRow.Find(".size")[0].ChildNodes[0].NodeValue; release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qRow.Children().ElementAt(6).InnerText.Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Children().ElementAt(7).InnerText.Trim()) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(query.GetQueryString())); var response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = response.Cookies; var rows = dom[".results_index ul"]; foreach (var row in rows) { var release = new ReleaseInfo(); CQ qRow = row.Cq(); CQ qLink = qRow.Find("li.torrents_name > .torrents_name_link").First(); CQ qDlLink = qRow.Find("li.torrents_download > a").First(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qLink.Text().Trim(); release.Description = release.Title; release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href").TrimStart('/')); release.Guid = release.Comments; release.Link = new Uri(SiteLink + "/" + qDlLink.Attr("href").TrimStart('/')); release.PublishDate = DateTime.Now; release.Seeders = ParseUtil.CoerceInt(qRow.Find("li.torrents_seeders").Text()); release.Peers = ParseUtil.CoerceInt(qRow.Find("li.torrents_leechers").Text()) + release.Seeders; var sizeParts = qRow.Find("li.torrents_size").Text(); release.Size = ReleaseInfo.GetBytes(sizeParts); releases.Add(release); } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var loggedInCheck = await RequestStringWithCookies(SearchUrl); if (!loggedInCheck.Content.Contains("logout.php")) { //Cookie appears to expire after a period of time or logging in to the site via browser await DoLogin(); } string Url; if (string.IsNullOrEmpty(query.GetQueryString())) Url = SearchUrl; else { Url = $"{SearchUrl}&searchtext={HttpUtility.UrlEncode(query.GetQueryString())}"; } var response = await RequestStringWithCookiesAndRetry(Url); List<ReleaseInfo> releases = ParseResponse(response.Content); return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { NameValueCollection qParams = new NameValueCollection(); qParams.Add("cata", "yes"); qParams.Add("sec", "jax"); List<string> catList = MapTorznabCapsToTrackers(query); foreach (string cat in catList) { qParams.Add("c" + cat, "1"); } if (!string.IsNullOrEmpty(query.SanitizedSearchTerm)) { qParams.Add("search", query.GetQueryString()); } string torrentSearchUrl = $"{SearchUrl}?{qParams.GetQueryString()}"; var results = await RequestStringWithCookiesAndRetry(torrentSearchUrl); List<ReleaseInfo> releases = ParseResponse(results.Content); return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var queryCollection = new NameValueCollection(); if (!string.IsNullOrWhiteSpace(searchString)) { queryCollection.Add("search", searchString); } var searchUrl = SearchUrl + queryCollection.GetQueryString(); var trackerCats = MapTorznabCapsToTrackers(query, mapChildrenCatsToParent: true); var results = await RequestStringWithCookiesAndRetry(searchUrl); try { CQ dom = results.Content; dom["#needseed"].Remove(); var rows = dom["table[width='750'] > tbody"].Children(); foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qLink = qRow.Children().ElementAt(2).Cq().Children("a").First(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = release.Title; release.Guid = new Uri(SiteLink + qLink.Attr("href").TrimStart('/')); release.Comments = release.Guid; release.Link = new Uri(string.Format(DownloadUrl, qLink.Attr("href").Split('=')[1])); var catUrl = qRow.Children().ElementAt(1).FirstElementChild.Cq().Attr("href"); var catNum = catUrl.Split(new char[] { '=', '&' })[1]; release.Category = MapTrackerCatToNewznab(catNum); // This tracker cannot search multiple cats at a time, so search all cats then filter out results from different cats if (trackerCats.Count > 0 && !trackerCats.Contains(catNum)) continue; var dateString = qRow.Children().ElementAt(5).Cq().Text().Trim(); var pubDate = DateTime.ParseExact(dateString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); release.PublishDate = DateTime.SpecifyKind(pubDate, DateTimeKind.Local); var sizeStr = qRow.Children().ElementAt(6).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qRow.Children().ElementAt(8).Cq().Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Children().ElementAt(9).Cq().Text().Trim()) + release.Seeders; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var searchUrl = SearchUrl; var queryCollection = new NameValueCollection(); if (!string.IsNullOrWhiteSpace(searchString)) { queryCollection.Add("searchstr", searchString); } foreach (var cat in MapTorznabCapsToTrackers(query)) { queryCollection.Add("filter_cat[" + cat + "]", "1"); } searchUrl += queryCollection.GetQueryString(); var response = await RequestStringWithCookiesAndRetry(searchUrl); if (response.IsRedirect) { await ApplyConfiguration(null); response = await RequestStringWithCookiesAndRetry(searchUrl); } try { var json = JObject.Parse(response.Content); foreach (JObject r in json["response"]["results"]) { DateTime pubDate = DateTime.MinValue; double dateNum; if (double.TryParse((string)r["groupTime"], out dateNum)) pubDate = UnixTimestampToDateTime(dateNum); var groupName = (string)r["groupName"]; if (r["torrents"] is JArray) { foreach (JObject t in r["torrents"]) { var release = new ReleaseInfo(); release.PublishDate = pubDate; release.Title = groupName; release.Description = groupName; FillReleaseInfoFromJson(release, t); releases.Add(release); } } else { var release = new ReleaseInfo(); release.PublishDate = pubDate; release.Title = groupName; release.Description = groupName; FillReleaseInfoFromJson(release, r); releases.Add(release); } } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var loggedInCheck = await RequestStringWithCookies(SearchUrl); if (!loggedInCheck.Content.Contains("/logout.php")) { //Cookie appears to expire after a period of time or logging in to the site via browser await DoLogin(); } var releases = new List<ReleaseInfo>(); NameValueCollection qParams = new NameValueCollection(); if (!string.IsNullOrEmpty(query.GetQueryString())) { qParams.Add("search", query.GetQueryString()); } List<string> catList = MapTorznabCapsToTrackers(query); foreach (string cat in catList) { qParams.Add("c" + cat, "1"); } string urlSearch = SearchUrl; if (qParams.Count > 0) { urlSearch += $"?{qParams.GetQueryString()}"; } var response = await RequestStringWithCookiesAndRetry(urlSearch); try { CQ dom = response.Content; var rows = dom["div[id='torrentTable'] > div[class='box torrentBox'] > div[class='boxContent'] > table > tbody > tr"]; foreach (IDomObject row in rows) { CQ torrentData = row.OuterHTML; CQ cells = row.Cq().Find("td"); string title = torrentData.Find("a[class='torrent']").First().Text().Trim(); Uri link = new Uri(SiteLink + torrentData.Find("img[class='icos save']").First().Parent().Attr("href").Trim()); Uri guid = new Uri(SiteLink + torrentData.Find("a[class='torrent']").First().Attr("href").Trim().TrimStart('/')); long size = ReleaseInfo.GetBytes(cells.Elements.ElementAt(4).Cq().Text()); int seeders = ParseUtil.CoerceInt(cells.Elements.ElementAt(5).Cq().Text()); int leechers = ParseUtil.CoerceInt(cells.Elements.ElementAt(6).Cq().Text()); string pubDateStr = torrentData.Find("span[class^='elapsedDate']").First().Attr("title").Trim().Replace(" at", ""); DateTime publishDate = DateTime.ParseExact(pubDateStr, "dddd, MMMM d, yyyy h:mmtt", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); long category = 0; string cat = torrentData.Find("a[class='cat']").First().Attr("id").Trim(); long.TryParse(cat, out category); var release = new ReleaseInfo(); release.Title = title; release.Guid = guid; release.Link = link; release.PublishDate = publishDate; release.Size = size; release.Description = release.Title; release.Seeders = seeders; release.Peers = seeders + leechers; release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Category = MapTrackerCatToNewznab(category.ToString()); release.Comments = guid; releases.Add(release); } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
/// <summary> /// Execute our search query /// </summary> /// <param name="query">Query</param> /// <returns>Releases</returns> public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var torrentRowList = new List<CQ>(); var searchTerm = query.GetQueryString(); var searchUrl = SearchUrl; // Check login before performing a query await CheckLogin(); // Check cache first so we don't query the server (if search term used or not in dev mode) if (!DevMode && !string.IsNullOrEmpty(searchTerm)) { lock (cache) { // Remove old cache items CleanCache(); // Search in cache var cachedResult = cache.FirstOrDefault(i => i.Query == searchTerm); if (cachedResult != null) return cachedResult.Results.Select(s => (ReleaseInfo)s.Clone()).ToArray(); } } // Build our query var request = BuildQuery(searchTerm, query, searchUrl); // Getting results & Store content var response = await RequestStringWithCookiesAndRetry(request, ConfigData.CookieHeader.Value); _fDom = response.Content; try { var firstPageRows = FindTorrentRows(); // Add them to torrents list torrentRowList.AddRange(firstPageRows.Select(fRow => fRow.Cq())); // If pagination available int nbResults; int pageLinkCount; nbResults = 1; pageLinkCount = 1; // Check if we have a minimum of one result if (firstPageRows.Length > 1) { // Retrieve total count on our alone page nbResults = firstPageRows.Count(); } else { // Check if no result if(torrentRowList.First().Find("td").Length == 1) { // No results found Output("\nNo result found for your query, please try another search term ...\n", "info"); // No result found for this query return releases; } } Output("\nFound " + nbResults + " result(s) (+/- " + firstPageRows.Length + ") in " + pageLinkCount + " page(s) for this query !"); Output("\nThere are " + firstPageRows.Length + " results on the first page !"); // Loop on results foreach (var tRow in torrentRowList) { Output("Torrent #" + (releases.Count + 1)); // ID var id = tRow.Find("td:eq(1) > a:eq(0)").Attr("href").Split('=').Last(); Output("ID: " + id); // Release Name var name = tRow.Find("td:eq(1) > a:eq(0)").Attr("title"); // Category var categoryId = tRow.Find("td:eq(0) > div > a:eq(0)").Attr("href").Split('?').Last(); var categoryName = tRow.Find("td:eq(0) > div > a:eq(0)").Attr("title"); var MainCat = tRow.Find("td:eq(0) > div > a:eq(0)").Attr("href").Split('?').Last(); var SubCat1 = "none"; var SubCat2 = "none"; var testcat = MainCat; if (tRow.Find("td:eq(0) > div > a:eq(1)").Length == 1) { SubCat1 = tRow.Find("td:eq(0) > div > a:eq(1)").Attr("href").Split('?').Last(); } if (tRow.Find("td:eq(0) > div > a:eq(2)").Length == 1) { SubCat2 = tRow.Find("td:eq(0) > div > a:eq(2)").Attr("href").Split('?').Last(); testcat = MainCat + '&' + SubCat2; } Output("Category: " + testcat + " - " + categoryName); // Seeders var seeders = 1; if (tRow.Find("td:eq(10) > a").Length > 0) { seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(9) > a").Text(), @"\d+").Value); Output("Seeders: " + seeders); } else { seeders = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(9)").Text(), @"\d+").Value); Output("Seeders: " + seeders); } // Leechers var leechers = 1; if (tRow.Find("td:eq(10) > a").Length > 0) { leechers = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(10) > a").Text(), @"\d+").Value); Output("Leechers: " + leechers); } else { leechers = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(10)").Text(), @"\d+").Value); Output("Leechers: " + leechers); } // Completed Regex regexObj = new Regex(@"[^\d]"); var completed2 = tRow.Find("td:eq(7)").Text(); var completed = regexObj.Replace(completed2, ""); Output("Completed: " + completed); // Files var files = 1; if (tRow.Find("td:eq(2) > a").Length == 1) { files = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(2) > a").Text(), @"\d+").Value); } Output("Files: " + files); // Health var percent = ParseUtil.CoerceInt(Regex.Match(tRow.Find("td:eq(8)").Text(), @"\d+").Value.Trim()); Output("Health: " + percent + "%"); // Size var humanSize = tRow.Find("td:eq(6)").Text().ToLowerInvariant(); var size = ReleaseInfo.GetBytes(humanSize); Output("Size: " + humanSize + " (" + size + " bytes)"); // --> Date var dateTimeOrig = tRow.Find("td:eq(4)").Text(); var dateTime = Regex.Replace(dateTimeOrig, @"<[^>]+>| ", "").Trim(); var date = DateTime.ParseExact(dateTime, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); Output("Released on: " + date); // Torrent Details URL var detailsLink = new Uri(TorrentDescriptionUrl.Replace("{id}", id.ToString())); Output("Details: " + detailsLink.AbsoluteUri); // Torrent Comments URL var commentsLink = new Uri(TorrentCommentUrl.Replace("{id}", id.ToString())); Output("Comments Link: " + commentsLink.AbsoluteUri); // Torrent Download URL var passkey = tRow.Find("td:eq(1) > a:eq(1)").Attr("href"); var key = Regex.Match(passkey, "(?<=passkey\\=)([a-zA-z0-9]*)"); Uri downloadLink = new Uri(TorrentDownloadUrl.Replace("{id}", id.ToString()).Replace("{passkey}", key.ToString())); Output("Download Link: " + downloadLink.AbsoluteUri); // Building release infos var release = new ReleaseInfo { Category = MapTrackerCatToNewznab(testcat.ToString()), Title = name, Seeders = seeders, Peers = seeders + leechers, MinimumRatio = 1, MinimumSeedTime = 172800, PublishDate = date, Size = size, Guid = detailsLink, Comments = commentsLink, Link = downloadLink }; releases.Add(release); } } catch (Exception ex) { OnParseError("Error, unable to parse result \n" + ex.StackTrace, ex); } // Return found releases return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var searchUrl = BrowseUrl; var trackerCats = MapTorznabCapsToTrackers(query); var queryCollection = new NameValueCollection(); // Tracker can only search OR return things in categories if (!string.IsNullOrWhiteSpace(searchString)) { queryCollection.Add("search", searchString); queryCollection.Add("cat", "0"); queryCollection.Add("sc", "1"); } else { foreach (var cat in MapTorznabCapsToTrackers(query)) { queryCollection.Add("c" + cat, "1"); } queryCollection.Add("incldead", "0"); } searchUrl += "?" + queryCollection.GetQueryString(); // 15 results per page - really don't want to call the server twice but only 15 results per page is a bit crap! await ProcessPage(releases, searchUrl); await ProcessPage(releases, searchUrl + "&page=1"); return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchUrl = BrowseUrl; var searchString = query.GetQueryString(); var cats = MapTorznabCapsToTrackers(query); string cat = "0"; if (cats.Count == 1) { cat = cats[0]; } if (!string.IsNullOrWhiteSpace(searchString) || cat != "0") searchUrl += string.Format("?search={0}&cat={1}&searchin=0&sort=0", HttpUtility.UrlEncode(searchString), cat); var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); var results = response.Content; try { CQ dom = results; var rows = dom[".torrentrow"]; foreach (var row in rows) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qTitleLink = qRow.Find(".torrenttable:eq(1) a").First(); release.Title = qRow.Find(".torrenttable:eq(1) a b").Text().Trim(); release.Description = release.Title; release.Guid = new Uri(SiteLink + qTitleLink.Attr("href")); release.Comments = release.Guid; //22:05:3716/02/2013 var dateStr = qRow.Find(".torrenttable:eq(5)").Text().Trim(); release.PublishDate = DateTime.ParseExact(dateStr, "H:mm:ssdd/MM/yyyy", CultureInfo.InvariantCulture).AddHours(-2); var qLink = qRow.Find(".torrenttable:eq(2) a").First(); release.Link = new Uri(SiteLink + qLink.Attr("href")); var sizeStr = qRow.Find(".torrenttable:eq(6)").Text().Trim(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qRow.Find(".torrenttable:eq(8)").Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Find(".torrenttable:eq(9)").Text().Trim()) + release.Seeders; var catId = qRow.Find(".torrenttable:eq(0) a").First().Attr("href").Substring(15); release.Category = MapTrackerCatToNewznab(catId); // Skip other if (release.Category != 0) { // Skip Romanian releases if (release.Category == TorznabCatType.MoviesForeign.ID && !configData.IncludeRomanianReleases.Value) continue; releases.Add(release); } } } catch (Exception ex) { OnParseError(results, ex); } return releases; }
// private readonly int CAT_OTHER = 3; public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var searchCategory = CAT_ANY; if (query.Categories.Contains(TorznabCatType.TV.ID) || query.Categories.Contains(TorznabCatType.TVHD.ID) || query.Categories.Contains(TorznabCatType.TVSD.ID)) { searchCategory = CAT_TV_SERIES; } if ((searchCategory == CAT_ANY) && (query.Categories.Contains(TorznabCatType.Movies.ID) || query.Categories.Contains(TorznabCatType.MoviesForeign.ID) || query.Categories.Contains(TorznabCatType.MoviesHD.ID) || query.Categories.Contains(TorznabCatType.MoviesSD.ID))) { searchCategory = CAT_FOREIGN_MOVIE; } if ((searchCategory == CAT_ANY) && (query.Categories.Contains(TorznabCatType.TVAnime.ID))) { searchCategory = CAT_ANIME; } if ((searchCategory == CAT_ANY) && (query.Categories.Contains(TorznabCatType.Books.ID))) { searchCategory = CAT_BOOKS; } if ((searchCategory == CAT_ANY) && (query.Categories.Contains(TorznabCatType.Audio.ID) || query.Categories.Contains(TorznabCatType.AudioLossless.ID) || query.Categories.Contains(TorznabCatType.AudioMP3.ID))) { searchCategory = CAT_MUSIC; } string queryUrl = string.Empty; if (string.IsNullOrWhiteSpace(searchString)) { queryUrl = string.Format(BrowseUrl, searchCategory); } else { queryUrl = string.Format(SearchUrl, searchCategory, HttpUtility.UrlEncode(searchString.Trim())); } var results = await RequestStringWithCookiesAndRetry(queryUrl, string.Empty); try { CQ dom = results.Content; var rows = dom["#index table tr"]; foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var date = StringUtil.StripNonAlphaNumeric(row.Cq().Find("td:eq(0)").Text().Trim() .Replace("Янв", "01") .Replace("Фев", "02") .Replace("Мар", "03") .Replace("Апр", "04") .Replace("Май", "05") .Replace("Июн", "06") .Replace("Июл", "07") .Replace("Авг", "08") .Replace("Сен", "09") .Replace("Окт", "10") .Replace("Ноя", "11") .Replace("Дек", "12")); release.PublishDate = DateTime.ParseExact(date, "ddMMyy", CultureInfo.InvariantCulture); var hasTorrent = row.Cq().Find("td:eq(1) a").Length == 3; var titleIndex = 1; if (hasTorrent) titleIndex++; release.Title = row.Cq().Find("td:eq(" + titleIndex + ")").Text().Trim(); if (configData.StripRussian.Value) { var split = release.Title.IndexOf('/'); if (split > -1) { release.Title = release.Title.Substring(split + 1).Trim(); } } release.Description = release.Title; var hasComments = row.Cq().Find("td:eq(2) img").Length > 0; var sizeCol = 2; if (hasComments) sizeCol++; var sizeStr = StringUtil.StripRegex(row.Cq().Find("td:eq(" + sizeCol + ")").Text(), "[^a-zA-Z0-9\\. -]", " ").Trim(); string[] sizeSplit = sizeStr.Split(' '); release.Size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0])); release.Seeders = ParseUtil.CoerceInt(row.Cq().Find(".green").Text().Trim()); release.Peers = ParseUtil.CoerceInt(row.Cq().Find(".red").Text().Trim()) + release.Seeders; release.Guid = new Uri(configData.Url.Value + row.Cq().Find("td:eq(1) a:eq(" + titleIndex + ")").Attr("href").Substring(1)); release.Comments = release.Guid; if (hasTorrent) { release.Link = new Uri(row.Cq().Find("td:eq(1) a:eq(0)").Attr("href")); release.MagnetUri = new Uri(row.Cq().Find("td:eq(1) a:eq(1)").Attr("href")); } else { release.MagnetUri = new Uri(row.Cq().Find("td:eq(1) a:eq(0)").Attr("href")); } releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { List<ReleaseInfo> releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var searchUrl = SearchUrl; var queryCollection = new NameValueCollection(); queryCollection.Add("action", "torrentstable"); queryCollection.Add("viewtype", "0"); queryCollection.Add("visiblecategories", "Action,Adventure,Animation,Biography,Comedy,Crime,Documentary,Drama,Eastern,Family,Fantasy,History,Holiday,Horror,Kids,Musical,Mystery,Romance,Sci-Fi,Short,Sports,Thriller,War,Western"); queryCollection.Add("page", "1"); queryCollection.Add("visibility", "showall"); queryCollection.Add("compression", "showall"); queryCollection.Add("sort", "added"); queryCollection.Add("order", "DESC"); queryCollection.Add("titleonly", "true"); queryCollection.Add("packs", "showall"); queryCollection.Add("bookmarks", "showall"); queryCollection.Add("subscriptions", "showall"); queryCollection.Add("skw", "showall"); queryCollection.Add("advancedsearchparameters", ""); if (!string.IsNullOrWhiteSpace(searchString)) { // search keywords use OR by default and it seems like there's no way to change it, expect unwanted results queryCollection.Add("searchstring", searchString); } var cats = MapTorznabCapsToTrackers(query); var hiddenqualities = ""; if (cats.Count > 0) { hiddenqualities = String.Join(",", categories.Where(cat => !cats.Contains(cat))); } queryCollection.Add("hiddenqualities", hiddenqualities); searchUrl += "?" + queryCollection.GetQueryString(); var results = await RequestStringWithCookiesAndRetry(searchUrl); try { CQ dom = results.Content; /* // parse logic for viewtype=1, unfortunately it's missing the release time so we can't use it var movieBlocks = dom["table.main"]; foreach (var movieBlock in movieBlocks) { var qMovieBlock = movieBlock.Cq(); var movieLink = qMovieBlock.Find("tr > td[class=colhead] > a").First(); var movieName = movieLink.Text(); var qDetailsBlock = qMovieBlock.Find("tr > td.torrentstd > table > tbody > tr"); var qDetailsHeader = qDetailsBlock.ElementAt(0); var qDetailsTags = qDetailsBlock.ElementAt(1); var qTorrents = qDetailsBlock.Find("td.moviestorrentstd > table > tbody > tr:eq(0)"); foreach (var torrent in qTorrents) { var qTorrent = torrent.Cq(); var qCatIcon = qTorrent.Find("td:eq(0) > img"); var qDetailsLink = qTorrent.Find("td:eq(1) > a:eq(0)"); var qSeeders = qTorrent.Find("td:eq(1) > b > a[alt=\"Number of Seeders\"]"); var qLeechers = qTorrent.Find("td:eq(1) > span[alt=\"Number of Leechers\"]"); var qDownloadLink = qTorrent.Find("td:eq(1) > a:has(img[alt=\"Download Torrent\"])"); } } */ var rows = dom["table.main > tbody > tr"]; foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 72 * 60 * 60; var qRow = row.Cq(); var qDetailsLink = qRow.Find("td:eq(1) > a:eq(0)"); // link to the movie, not the actual torrent release.Title = qDetailsLink.Attr("alt"); var qCatIcon = qRow.Find("td:eq(0) > img"); var qSeeders = qRow.Find("td:eq(8)"); var qLeechers = qRow.Find("td:eq(9)"); var qDownloadLink = qRow.Find("td > a:has(img[alt=\"Download Torrent\"])"); var qPudDate = qRow.Find("td:eq(5) > nobr"); var qSize = qRow.Find("td:eq(6)"); var catStr = qCatIcon.Attr("alt"); release.Category = MapTrackerCatToNewznab(catStr); release.Link = new Uri(SiteLink + qDownloadLink.Attr("href").Substring(1)); release.Title = qDetailsLink.Attr("alt"); release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href")); release.Guid = release.Link; var dateStr = qPudDate.Text().Trim(); DateTime pubDateUtc; var Timeparts = dateStr.Split(new char[] { ' ' }, 2)[1]; if (dateStr.StartsWith("Today ")) pubDateUtc = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + DateTime.ParseExact(dateStr.Split(new char[] { ' ' }, 2)[1], "hh:mm tt", System.Globalization.CultureInfo.InvariantCulture).TimeOfDay; else if (dateStr.StartsWith("Yesterday ")) pubDateUtc = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + DateTime.ParseExact(dateStr.Split(new char[] { ' ' }, 2)[1], "hh:mm tt", System.Globalization.CultureInfo.InvariantCulture).TimeOfDay - TimeSpan.FromDays(1); else pubDateUtc = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MMM d yyyy hh:mm tt", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); release.PublishDate = pubDateUtc.ToLocalTime(); var sizeStr = qSize.Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; var files = qRow.Find("td:nth-child(4)").Text(); release.Files = ParseUtil.CoerceInt(files); var grabs = qRow.Find("td:nth-child(8)").Text(); release.Grabs = ParseUtil.CoerceInt(grabs); release.DownloadVolumeFactor = 0; // ratioless release.UploadVolumeFactor = 1; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public ManualSearchResult Search([FromBody]AdminSearch value) { var results = new List<TrackerCacheResult>(); var query = new TorznabQuery() { SearchTerm = value.Query, Categories = value.Category == 0 ? new int[0] : new int[1] { value.Category } }; query.ExpandCatsToSubCats(); var trackers = indexerService.GetAllIndexers().Where(t => t.IsConfigured).ToList(); if (!string.IsNullOrWhiteSpace(value.Tracker)) { trackers = trackers.Where(t => t.ID == value.Tracker).ToList(); } if (value.Category != 0) { trackers = trackers.Where(t => t.TorznabCaps.Categories.Select(c => c.ID).Contains(value.Category)).ToList(); } Parallel.ForEach(trackers.ToList(), indexer => { try { var searchResults = indexer.PerformQuery(query).Result; searchResults = indexer.CleanLinks(searchResults); cacheService.CacheRssResults(indexer, searchResults); searchResults = indexer.FilterResults(query, searchResults); lock (results) { foreach (var result in searchResults) { var item = Mapper.Map<TrackerCacheResult>(result); item.Tracker = indexer.DisplayName; item.TrackerId = indexer.ID; item.Peers = item.Peers - item.Seeders; // Use peers as leechers results.Add(item); } } } catch (Exception e) { logger.Error(e, "An error occured during manual search on " + indexer.DisplayName + ": " + e.Message); } }); ConfigureCacheResults(results); if (trackers.Count > 1) { results = results.OrderByDescending(d => d.PublishDate).ToList(); } var manualResult = new ManualSearchResult() { Results = results, Indexers = trackers.Select(t => t.DisplayName).ToList() }; if (manualResult.Indexers.Count == 0) manualResult.Indexers = new List<string>() { "None" }; logger.Info(string.Format("Manual search for \"{0}\" on {1} with {2} results.", query.GetQueryString(), string.Join(", ", manualResult.Indexers), manualResult.Results.Count)); return manualResult; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var trackerCats = MapTorznabCapsToTrackers(query); var cat = (trackerCats.Count == 1 ? trackerCats.ElementAt(0) : "0"); var episodeSearchUrl = string.Format(SearchUrl, cat, HttpUtility.UrlEncode(query.GetQueryString())); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); if (results.Content.Contains("No torrents found")) { return releases; } try { CQ dom = results.Content; var rows = dom[".ctable_content_no_pad > table > tbody > tr"].ToArray(); DateTime lastDateTime = default(DateTime); for (var i = 0; i < rows.Length; i++) { var rowA = rows[i]; var rAlign = rowA.Attributes["align"]; if (rAlign == "right" || rAlign == "center") continue; if (rAlign == "left") { // ex: "Monday, Jun 01, 2015", "Monday, Aug 03, 2015" var dateStr = rowA.Cq().Text().Trim().Replace("Added on ", ""); if (dateStr.ToLowerInvariant().Contains("today")) lastDateTime = DateTime.Now; else lastDateTime = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dddd, MMM dd, yyyy", CultureInfo.InvariantCulture), DateTimeKind.Utc).ToLocalTime(); continue; } if (rowA.ChildElements.Count() < 2) continue; var rowB = rows[++i]; var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.PublishDate = lastDateTime; var qLink = rowA.ChildElements.ElementAt(1).FirstElementChild.Cq(); release.Title = qLink.Text().Trim(); release.Description = release.Title; release.Comments = new Uri(SiteLink + qLink.Attr("href")); release.Guid = release.Comments; var qDownload = rowB.ChildElements.ElementAt(2).ChildElements.ElementAt(0).Cq(); release.Link = new Uri(SiteLink + qDownload.Attr("href")); var sizeStr = rowB.ChildElements.ElementAt(3).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(rowB.ChildElements.ElementAt(6).Cq().Text()); release.Peers = ParseUtil.CoerceInt(rowB.ChildElements.ElementAt(6).Cq().Text()) + release.Seeders; var grabs = rowB.Cq().Find("td:nth-child(6)").Text(); release.Grabs = ParseUtil.CoerceInt(grabs); release.DownloadVolumeFactor = 0; // ratioless release.UploadVolumeFactor = 1; releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var breakWhile = false; var page = 0; while (page < 3) { string episodeSearchUrl; if (string.IsNullOrEmpty(query.GetQueryString())) { episodeSearchUrl = SearchUrl + "?page=" + page; breakWhile = true; } else { var cats = MapTorznabCapsToTrackers(query); var catsUrlPart = string.Join("&", cats.Select(c => $"c{c}=1")); episodeSearchUrl = string.Format("{0}?search={1}&cat=0&incldead=0&{2}&page={3}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()), catsUrlPart, page); } page++; var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; var rows = dom["#torrent-table-wrapper > div"]; foreach (var row in rows.Skip(1)) { var release = new ReleaseInfo(); var qRow = row.Cq(); var qLink = qRow.Find("#torrent-udgivelse2-users > a").First(); var qDesc = qRow.Find("#torrent-udgivelse2-users > p").FirstOrDefault(); var moviesCats = new[] { 47, 38, 5, 23, 22, 33, 17, 9 }; var seriesCats = new[] { 46, 26, 43 }; var catUrl = qRow.Find(".torrent-icon > a").Attr("href"); var cat = catUrl.Substring(catUrl.LastIndexOf('=') + 1); var catNo = int.Parse(cat); if (moviesCats.Contains(catNo)) release.Category = TorznabCatType.Movies.ID; else if (seriesCats.Contains(catNo)) release.Category = TorznabCatType.TV.ID; else continue; releases.Add(release); var torrentUrl = qLink.Attr("href"); var torrentId = torrentUrl.Substring(torrentUrl.LastIndexOf('=') + 1); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qLink.Attr("title"); release.Description = qDesc != null ? qDesc.InnerText : release.Title; release.Guid = new Uri(SiteLink + torrentUrl); release.Comments = new Uri(release.Guid + "#startcomments"); var downloadUrl = $"{SiteLink}download.php?id={torrentId}&rss&passkey={configData.RSSKey.Value}"; release.Link = new Uri(downloadUrl); var qAdded = qRow.Find("#torrent-added").First(); var addedStr = qAdded.Text().Trim(); release.PublishDate = DateTime.ParseExact(addedStr, "dd-MM-yyyyHH:mm:ss", CultureInfo.InvariantCulture); release.Seeders = ParseUtil.CoerceInt(qRow.Find("#torrent-seeders").Text().Trim()); release.Peers = ParseUtil.CoerceInt(qRow.Find("#torrent-leechers").Text().Trim()) + release.Seeders; var sizeStr = qRow.Find("#torrent-size").First().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); var infoLink = qRow.Find("#infolink"); var linkContainer = infoLink.Children().First().Children().First(); var url = linkContainer.Attr("href"); var img = linkContainer.Children().First(); var imgUrl = img.Attr("src"); if (imgUrl == "/pic/imdb.png") { release.Imdb = long.Parse(url.Substring(url.LastIndexOf('t') + 1)); } else if (imgUrl == "/pic/TV.png") { release.TVDBId = long.Parse(url.Substring(url.LastIndexOf('=') + 1)); } } var nextPage = dom["#torrent-table-wrapper + p[align=center]"].Children().Last(); if (!nextPage.Is("a")) breakWhile = true; } catch (Exception ex) { OnParseError(results.Content, ex); } if (breakWhile) break; } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(query.GetQueryString()); WebClientStringResult response = null; response = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { var json = JObject.Parse(response.Content); foreach (JObject r in json["response"]["results"]) { DateTime pubDate = DateTime.MinValue; double dateNum; if (double.TryParse((string)r["groupTime"], out dateNum)) { pubDate = DateTimeUtil.UnixTimestampToDateTime(dateNum); pubDate = DateTime.SpecifyKind(pubDate, DateTimeKind.Utc).ToLocalTime(); } var groupName = (string)r["groupName"]; if (r["torrents"] is JArray) { foreach (JObject t in r["torrents"]) { var release = new ReleaseInfo(); release.PublishDate = pubDate; release.Title = groupName; release.Description = groupName; FillReleaseInfoFromJson(release, t); releases.Add(release); } } else { var release = new ReleaseInfo(); release.PublishDate = pubDate; release.Title = groupName; release.Description = groupName; FillReleaseInfoFromJson(release, r); releases.Add(release); } } } catch (Exception ex) { OnParseError(response.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.GetQueryString(); var queryUrl = SearchUrl; var queryCollection = new NameValueCollection(); if (!string.IsNullOrWhiteSpace(searchString)) queryCollection.Add("search", searchString); foreach (var cat in MapTorznabCapsToTrackers(query)) queryCollection.Add("c" + cat, "1"); if (queryCollection.Count > 0) queryUrl += "?" + queryCollection.GetQueryString(); var results = await RequestStringWithCookiesAndRetry(queryUrl); // Check for being logged out if (results.IsRedirect) throw new AuthenticationException(); try { CQ dom = results.Content; var rows = dom["#torrentTable > tbody > tr.browse"]; foreach (var row in rows) { CQ qRow = row.Cq(); var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Title = qRow.Find(".torrentName").Text(); release.Description = release.Title; release.Guid = new Uri(SiteLink + qRow.Find(".torrentName").Attr("href")); release.Comments = release.Guid; release.Link = new Uri(SiteLink + qRow.Find(".dlLinksInfo > a").Attr("href")); var sizeStr = qRow.Find(".sizeInfo").Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); var dateStr = qRow.Find(".ulInfo").Text().Split('|').Last().Trim(); var agoIdx = dateStr.IndexOf("ago"); if (agoIdx > -1) { dateStr = dateStr.Substring(0, agoIdx); } release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seedersInfo").Text()); release.Peers = ParseUtil.CoerceInt(qRow.Find(".leechersInfo").Text()) + release.Seeders; var cat = qRow.Find("td:eq(0) a").First().Attr("href").Substring(15);//browse.php?cat=24 release.Category = MapTrackerCatToNewznab(cat); releases.Add(release); } } catch (Exception ex) { OnParseError(results.Content, ex); } return releases; }