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) { 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") .Replace("text-pink", string.Empty); release.Category = MapTrackerCatToNewznab(cat.Trim()); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format("{0}?search={1}&cat=0", SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; var table = dom["tbody > tr > .latest"].Parent().Parent(); foreach (var row in table.Children().Skip(1)) { var release = new ReleaseInfo(); CQ qDetailsCol = row.ChildElements.ElementAt(1).Cq(); CQ qLink = qDetailsCol.Children("a").First(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; release.Comments = new Uri(SiteLink + "/" + qLink.Attr("href")); release.Guid = release.Comments; release.Title = qLink.Attr("title"); release.Description = release.Title; //"Tuesday, June 11th 2013 at 03:52:53 AM" to... //"Tuesday June 11 2013 03:52:53 AM" var timestamp = qDetailsCol.Children("font").Text().Trim() + " "; var timeParts = new List<string>(timestamp.Replace(" at", "").Replace(",", "").Split(' ')); timeParts[2] = Regex.Replace(timeParts[2], "[^0-9.]", ""); var formattedTimeString = string.Join(" ", timeParts.ToArray()).Trim(); var date = DateTime.ParseExact(formattedTimeString, "dddd MMMM d yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); release.PublishDate = DateTime.SpecifyKind(date, DateTimeKind.Utc).ToLocalTime(); release.Link = new Uri(SiteLink + "/" + row.ChildElements.ElementAt(2).Cq().Children("a.index").Attr("href")); 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; //if (!release.Title.ToLower().Contains(title.ToLower())) // continue; 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.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); 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 TestIndexer(string name) { var indexer = GetIndexer(name); var browseQuery = new TorznabQuery(); var results = await indexer.PerformQuery(browseQuery); logger.Info(string.Format("Found {0} releases from {1}", results.Count(), indexer.DisplayName)); if (results.Count() == 0) throw new Exception("Found no results while trying to browse this tracker"); cacheService.CacheRssResults(indexer.DisplayName, results); }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); 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 static TorznabQuery FromHttpQuery(NameValueCollection query) { //{t=tvsearch&cat=5030%2c5040&extended=1&apikey=test&offset=0&limit=100&rid=24493&season=5&ep=1} var q = new TorznabQuery(); q.QueryType = query["t"]; if (query["q"] == null) { q.SearchTerm = string.Empty; } else { q.SearchTerm = query["q"]; } if (query["cat"] != null) { q.Categories = query["cat"].Split(',').Select(s => int.Parse(s)).ToArray(); }else { q.Categories = new int[0]; } if (query["extended"] != null) { q.Extended = ParseUtil.CoerceInt(query["extended"]); } q.ApiKey = query["apikey"]; if (query["limit"] != null) { q.Limit = ParseUtil.CoerceInt(query["limit"]); } if (query["offset"] != null) { q.Offset = ParseUtil.CoerceInt(query["offset"]); } int rageId; if (int.TryParse(query["rid"], out rageId)) { q.RageID = rageId; } int season; if (int.TryParse(query["season"], out season)) { q.Season = season; } q.Episode = query["ep"]; return q; }
async Task<ReleaseInfo[]> PerformQuery(TorznabQuery query, string baseUrl) { List<ReleaseInfo> releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim())); XmlDocument xmlDoc = new XmlDocument(); string xml = string.Empty; WebClient wc = getWebClient(); try { using (wc) { xml = await wc.DownloadStringTaskAsync(new Uri(episodeSearchUrl)); xmlDoc.LoadXml(xml); } 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); release.Category = node.SelectSingleNode("category").InnerText; 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.ToArray(); }
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 releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); try { CQ dom = results.Content; CQ qRows = dom["#torrenttable > tbody > tr"]; foreach (var row in qRows) { var release = new ReleaseInfo(); var qRow = row.Cq(); var debug = qRow.Html(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; CQ qLink = qRow.Find(".title > a").First(); release.Guid = new Uri(SiteLink + qLink.Attr("href")); release.Comments = release.Guid; release.Title = qLink.Text(); release.Description = release.Title; release.Link = new Uri(SiteLink + qRow.Find(".quickdownload > a").Attr("href")); var dateString = qRow.Find(".name")[0].InnerText.Trim().Replace(" ", string.Empty).Replace("Addedinon", string.Empty); //"2015-04-25 23:38:12" //"yyyy-MMM-dd hh:mm:ss" release.PublishDate = DateTime.ParseExact(dateString, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture); var sizeStr = qRow.Children().ElementAt(4).InnerText; release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seeders").Text()); release.Peers = release.Seeders + ParseUtil.CoerceInt(qRow.Find(".leechers").Text()); 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 searchTerm = string.IsNullOrEmpty(query.SanitizedSearchTerm) ? "2015" : query.SanitizedSearchTerm; var searchString = searchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim())); 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 searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); 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) { List<ReleaseInfo> releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); await FollowIfRedirect(results); try { CQ dom = results.Content; var rows = dom["table.torrenttable > tbody > tr.browse_color"]; foreach (var row in rows) { var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; var qRow = row.Cq(); var qLink = row.ChildElements.ElementAt(2).FirstChild.Cq(); release.Link = new Uri(SiteLink + "/" + qLink.Attr("href")); var torrentID = qLink.Attr("href").Split('=').Last(); var descCol = row.ChildElements.ElementAt(3); var qCommentLink = descCol.FirstChild.Cq(); release.Title = qCommentLink.Text(); release.Description = release.Title; release.Comments = new Uri(SiteLink + "/" + qCommentLink.Attr("href")); release.Guid = release.Comments; var dateStr = descCol.ChildElements.Last().Cq().Text().Split('|').Last().ToLowerInvariant().Replace("ago.", "").Trim(); 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).Cq().Text()); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(10).Cq().Text()) + 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.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) { 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; }
async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query, string baseUrl) { var releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(searchAllUrl); var result = await RequestStringWithCookiesAndRetry(episodeSearchUrl, string.Empty); var xmlDoc = new XmlDocument(); try { xmlDoc.LoadXml(result.Content); ReleaseInfo release; 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("title").InnerText, out category); release.Category = category; var test = node.SelectSingleNode("enclosure"); release.Guid = new Uri(test.Attributes["url"].Value); release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); release.Description = node.SelectSingleNode("description").InnerText; release.InfoHash = node.SelectSingleNode("description").InnerText; release.Size = 0; release.Seeders = 1; release.Peers = 1; release.MagnetUri = new Uri(node.SelectSingleNode("link").InnerText); releases.Add(release); } } catch (Exception ex) { OnParseError(result.Content, ex); } return releases; }
public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) { var releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var results = await PostDataWithCookiesAndRetry(SearchUrl, GetSearchFormData(searchString)); 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)); var dateStr = descCol.ChildNodes.Last().NodeValue.Trim(); var euDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); var timezoneString = Environment.OSVersion.Platform == PlatformID.Unix ? "Europe/Berlin" : "Central European Standard Time"; var localDate = TimeZoneInfo.ConvertTimeToUtc(euDate, TimeZoneInfo.FindSystemTimeZoneById(timezoneString)).ToLocalTime(); release.PublishDate = localDate; 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.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = SearchUrl + HttpUtility.UrlEncode(searchString); 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) { List<ReleaseInfo> releases = new List<ReleaseInfo>(); var searchString = query.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); 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; var qLink = row.ChildElements.ElementAt(1).Cq().Children("a")[0].Cq(); var linkStr = qLink.Attr("href"); release.Title = qLink.Text(); release.Comments = new Uri(BaseUrl + "/" + linkStr); release.Guid = release.Comments; var qDownload = row.ChildElements.ElementAt(1).Cq().Find("a[title='Download']")[0].Cq(); release.Link = new Uri(BaseUrl + "/" + qDownload.Attr("href")); var dateStr = row.ChildElements.ElementAt(3).Cq().Text().Trim().Replace(" and", ""); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); var sizeStr = row.ChildElements.ElementAt(4).Cq().Text(); release.Size = ReleaseInfo.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text().Trim()); release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).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 formData = HttpUtility.ParseQueryString(SearchFormData); var formDict = formData.AllKeys.ToDictionary(t => t, t => formData[t]); formDict.Add("search", query.SanitizedSearchTerm); var response = await PostDataWithCookiesAndRetry(SearchUrl, formDict); try { var jsonResult = JObject.Parse(response.Content); var resultArray = ((JArray)jsonResult["Fs"])[0]["Cn"]["torrents"]; foreach (var jobj in resultArray) { var release = new ReleaseInfo(); var id = (int)jobj["id"]; release.Comments = new Uri(string.Format(CommentsUrl, id)); release.Guid = release.Comments; release.Link = new Uri(string.Format(DownloadUrl, id)); release.Title = Regex.Replace((string)jobj["name"], "<.*?>", String.Empty); var SizeStr = ((string)jobj["size"]); release.Size = ReleaseInfo.GetBytes(SizeStr); release.Seeders = ParseUtil.CoerceInt((string)jobj["seed"]); release.Peers = ParseUtil.CoerceInt((string)jobj["leech"]) + release.Seeders; // ex: Tuesday, May 26, 2015 at 6:00pm var dateStr = new Regex("title=\"(.*?)\"").Match((string)jobj["added"]).Groups[1].ToString(); dateStr = dateStr.Replace(" at", ""); var dateTime = DateTime.ParseExact(dateStr, "dddd, MMMM d, yyyy h:mmtt", CultureInfo.InvariantCulture); release.PublishDate = dateTime; 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 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.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); 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(); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); release.Seeders = ParseUtil.CoerceInt(qRow.Find(".seedersInfo").Text()); release.Peers = ParseUtil.CoerceInt(qRow.Find(".leechersInfo").Text()) + release.Seeders; 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.SanitizedSearchTerm + " " + query.GetEpisodeSearchString(); var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); 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 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 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 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; }
protected List<string> MapTorznabCapsToTrackers(TorznabQuery query, bool mapChildrenCatsToParent = false) { var result = new List<string>(); foreach (var cat in query.Categories) { var queryCats = new List<int> { cat }; var newznabCat = TorznabCatType.AllCats.FirstOrDefault(c => c.ID == cat); if (newznabCat != null) { queryCats.AddRange(newznabCat.SubCategories.Select(c => c.ID)); } if (mapChildrenCatsToParent) { var parentNewznabCat = TorznabCatType.AllCats.FirstOrDefault(c => c.SubCategories.Contains(newznabCat)); if (parentNewznabCat != null) { queryCats.Add(parentNewznabCat.ID); } } foreach (var mapping in categoryMapping.Where(c => queryCats.Contains(c.NewzNabCategory))) { result.Add(mapping.TrackerCategory); } } return result.Distinct().ToList(); }
public static TorznabQuery FromHttpQuery(NameValueCollection query) { //{t=tvsearch&cat=5030%2c5040&extended=1&apikey=test&offset=0&limit=100&rid=24493&season=5&ep=1} var q = new TorznabQuery(); q.QueryType = query["t"]; if (query["q"] == null) { q.SearchTerm = string.Empty; } else { q.SearchTerm = query["q"]; } if (query["cat"] != null) { q.Categories = query["cat"].Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => int.Parse(s)).ToArray(); } else { if (q.QueryType == "movie" && string.IsNullOrWhiteSpace(query["imdbid"])) { q.Categories = new int[] { TorznabCatType.Movies.ID } } ; else { q.Categories = new int[0]; } } if (query["extended"] != null) { q.Extended = ParseUtil.CoerceInt(query["extended"]); } q.ApiKey = query["apikey"]; if (query["limit"] != null) { q.Limit = ParseUtil.CoerceInt(query["limit"]); } if (query["offset"] != null) { q.Offset = ParseUtil.CoerceInt(query["offset"]); } q.ImdbID = query["imdbid"]; int rageId; if (int.TryParse(query["rid"], out rageId)) { q.RageID = rageId; } int season; if (int.TryParse(query["season"], out season)) { q.Season = season; } q.Episode = query["ep"]; return(q); }