Exemple #1
0
 void DescribeDomNode(CsQuery.IDomNode domnode, TreeNode parentTreeNode)
 {
     var treeNode = new TreeNode(domnode.ToString());
     parentTreeNode.Nodes.Add(treeNode);
     if (domnode.HasChildren)
     {
         foreach (var child in domnode.ChildNodes)
         {
             DescribeDomNode(child, treeNode);
         }
     }
 }
Exemple #2
0
        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;
        }
Exemple #3
0
        public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
        {
            TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 3, 5, DayOfWeek.Sunday);
            TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 10, 5, DayOfWeek.Sunday);
            TimeSpan delta = new TimeSpan(1, 0, 0);
            TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition);
            TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment };
            TimeZoneInfo denmarkTz = TimeZoneInfo.CreateCustomTimeZone("Denmark Time", new TimeSpan(1, 0, 0), "(GMT+01:00) Denmark Time", "Denmark Time", "Denmark DST", adjustments);

            var releasesPerPage = 100;
            var releases = new List<ReleaseInfo>();

            var page = (query.Offset/releasesPerPage) + 1;

            string episodeSearchUrl;
            if (string.IsNullOrEmpty(query.GetQueryString()))
            {
                episodeSearchUrl = SearchUrl + "?page=" + page;
            }
            else
            {
                var cats = MapTorznabCapsToTrackers(query);
                var catsUrlPart = string.Join("&", cats.Select(c => $"filter_{c}=on"));
                episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type=";
            }
            var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
            if (string.IsNullOrEmpty(results.Content))
            {
                CookieHeader = string.Empty;
                var pairs = new Dictionary<string, string>
                {
                    {"username", configData.Username.Value},
                    {"password", configData.Password.Value},
                    {"langlang", null},
                    {"login", "login"}
                };
                var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, CookieHeader, true, null, LoginUrl);

                await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("logout.php"), () =>
                {
                    CQ dom = response.Content;
                    var messageEl = dom["#loginform .warning"];
                    var errorMessage = messageEl.Text().Trim();
                    throw new ExceptionWithConfigData(errorMessage, configData);
                });
                results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
            }
            try
            {
                CQ dom = results.Content;
                var rows = dom["#torrent_table tr.torrent"];
                foreach (var row in rows)
                {
                    var qRow = row.Cq();
                    var release = new ReleaseInfo
                    {
                        MinimumRatio = 1,
                        MinimumSeedTime = 172800
                    };

                    var catAnchor = row.FirstChild.FirstChild;
                    var catUrl = catAnchor.GetAttribute("href");
                    var catStr = Regex.Match(catUrl, "filter_(?<catNo>[0-9]+)=on").Groups["catNo"].Value;
                    var catNo = int.Parse(catStr);
                    var moviesCatsDanish = new[] { 2,3,10,28,29,31 };
                    var moviesCatsIntl = new[] { 8,9,11,22,24 };
                    var moviesCats = configData.OnlyDanishCategories.Value
                        ? moviesCatsDanish
                        : moviesCatsDanish.Concat(moviesCatsIntl);
                    var seriesCatsDanish = new[] { 1,4,30 };
                    var seriesCatsIntl = new[] { 20,21 };
                    var seriesCats = configData.OnlyDanishCategories.Value
                        ? seriesCatsDanish
                        : seriesCatsDanish.Concat(seriesCatsIntl);
                    if (moviesCats.Contains(catNo))
                        release.Category = TorznabCatType.Movies.ID;
                    else if (seriesCats.Contains(catNo))
                        release.Category = TorznabCatType.TV.ID;
                    else if (catNo == 12)
                        release.Category = TorznabCatType.BooksEbook.ID;
                    else if (catNo == 6)
                        release.Category = TorznabCatType.AudioAudiobook.ID;
                    else
                        continue;

                    var titleAnchor = qRow.Find("div.croptorrenttext a").FirstElement();
                    var title = titleAnchor.GetAttribute("title");
                    release.Title = title;

                    var dlUrlAnchor = qRow.Find("span.right a[title=\"Direkte download link\"]").FirstElement();
                    var dlUrl = dlUrlAnchor.GetAttribute("href");
                    release.Link = new Uri(SiteLink + dlUrl);

                    var torrentLink = titleAnchor.GetAttribute("href");
                    release.Guid = new Uri(SiteLink + torrentLink);
                    release.Comments = new Uri(SearchUrl + torrentLink);

                    var addedElement = qRow.Find("span.time").FirstElement();
                    var addedStr = addedElement.GetAttribute("title");
                    release.PublishDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.ParseExact(addedStr, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture), denmarkTz).ToLocalTime();
                    
                    var columns = qRow.Children();
                    var seedersElement = columns.Reverse().Skip(1).First();
                    release.Seeders = int.Parse(seedersElement.InnerText);

                    var leechersElement = columns.Last().FirstElement();
                    release.Peers = release.Seeders + int.Parse(leechersElement.InnerText);

                    var sizeElement = columns.Skip(2).First();
                    var sizeStr = sizeElement.InnerText;
                    release.Size = ReleaseInfo.GetBytes(sizeStr);

                    var imdbAnchor = qRow.Find(".torrentnotes a")
                        .FirstOrDefault(a => a.GetAttribute("href").Contains("imdb.com"));
                    if (imdbAnchor != null)
                    {
                        var referrerUrl = imdbAnchor.GetAttribute("href");
                        release.Imdb = long.Parse(Regex.Match(referrerUrl, "tt(?<imdbId>[0-9]+)").Groups["imdbId"].Value);
                    }

                    var Files = qRow.Find("td:nth-child(3) > div");
                    release.Files = ParseUtil.CoerceLong(Files.Text().Split(' ')[0]);

                    var Grabs = qRow.Find("td:nth-child(6)");
                    release.Grabs = ParseUtil.CoerceLong(Grabs.Text());

                    if (qRow.Find("span.freeleech, img[src=\"/static/common/torrents/gratis.png\"]").Length >= 1)
                        release.DownloadVolumeFactor = 0;
                    else
                        release.DownloadVolumeFactor = 1;

                    if (qRow.Find("img[src=\"/static/common/torrents/toxupload.png\"]").Length >= 1)
                        release.UploadVolumeFactor = 2;
                    else
                        release.UploadVolumeFactor = 1;

                    releases.Add(release);
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }
            return releases;
        }
Exemple #4
0
        public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
        {
            var releasesPerPage = 100;
            var releases = new List<ReleaseInfo>();

            var page = (query.Offset/releasesPerPage) + 1;

            string episodeSearchUrl;
            if (string.IsNullOrEmpty(query.GetQueryString()))
            {
                episodeSearchUrl = SearchUrl + "?page=" + page;
            }
            else
            {
                var cats = MapTorznabCapsToTrackers(query);
                var catsUrlPart = string.Join("&", cats.Select(c => $"filter_{c}=on"));
                episodeSearchUrl = $"{SearchUrl}?page={page}&group=0&{catsUrlPart}&search={HttpUtility.UrlEncode(query.GetQueryString())}&pre_type=torrents&type=";
            }
            var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
            if (string.IsNullOrEmpty(results.Content))
            {
                CookieHeader = string.Empty;
                var pairs = new Dictionary<string, string>
                {
                    {"username", configData.Username.Value},
                    {"password", configData.Password.Value},
                    {"langlang", null},
                    {"login", "login"}
                };
                var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, CookieHeader, true, null, LoginUrl);

                await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("logout.php"), () =>
                {
                    CQ dom = response.Content;
                    var messageEl = dom["#loginform .warning"];
                    var errorMessage = messageEl.Text().Trim();
                    throw new ExceptionWithConfigData(errorMessage, configData);
                });
                results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
            }
            try
            {
                CQ dom = results.Content;
                var rows = dom["#torrent_table tr.torrent"];
                foreach (var row in rows)
                {
                    var qRow = row.Cq();
                    var release = new ReleaseInfo
                    {
                        MinimumRatio = 1,
                        MinimumSeedTime = 172800
                    };

                    var catAnchor = row.FirstChild.FirstChild;
                    var catUrl = catAnchor.GetAttribute("href");
                    var catStr = Regex.Match(catUrl, "filter_(?<catNo>[0-9]+)=on").Groups["catNo"].Value;
                    var catNo = int.Parse(catStr);
                    var moviesCatsDanish = new[] { 2,3,10,28,29,31 };
                    var moviesCatsIntl = new[] { 8,9,11,22,24 };
                    var moviesCats = configData.OnlyDanishCategories.Value
                        ? moviesCatsDanish
                        : moviesCatsDanish.Concat(moviesCatsIntl);
                    var seriesCatsDanish = new[] { 1,4,30 };
                    var seriesCatsIntl = new[] { 20,21 };
                    var seriesCats = configData.OnlyDanishCategories.Value
                        ? seriesCatsDanish
                        : seriesCatsDanish.Concat(seriesCatsIntl);
                    if (moviesCats.Contains(catNo))
                        release.Category = TorznabCatType.Movies.ID;
                    else if (seriesCats.Contains(catNo))
                        release.Category = TorznabCatType.TV.ID;
                    else if (catNo == 12)
                        release.Category = TorznabCatType.BooksEbook.ID;
                    else if (catNo == 6)
                        release.Category = TorznabCatType.AudioAudiobook.ID;
                    else
                        continue;

                    var titleAnchor = qRow.Find("div.croptorrenttext a").FirstElement();
                    var title = titleAnchor.GetAttribute("title");
                    release.Title = title;

                    var dlUrlAnchor = qRow.Find("span.right a").FirstElement();
                    var dlUrl = dlUrlAnchor.GetAttribute("href");
                    var authkey = Regex.Match(dlUrl, "authkey=(?<authkey>[0-9a-zA-Z]+)").Groups["authkey"].Value;
                    var torrentPass = Regex.Match(dlUrl, "torrent_pass=(?<torrent_pass>[0-9a-zA-Z]+)").Groups["torrent_pass"].Value;
                    var torrentId = Regex.Match(dlUrl, "id=(?<id>[0-9]+)").Groups["id"].Value;
                    release.Link = new Uri($"{SearchUrl}/{title}.torrent/?action=download&authkey={authkey}&torrent_pass={torrentPass}&id={torrentId}");

                    var torrentLink = titleAnchor.GetAttribute("href");
                    release.Guid = new Uri(SiteLink + torrentLink);
                    release.Comments = new Uri(SearchUrl + torrentLink);

                    var addedElement = qRow.Find("span.time").FirstElement();
                    var addedStr = addedElement.GetAttribute("title");
                    release.PublishDate = DateTime.ParseExact(addedStr, "MMM dd yyyy, HH:mm",
                        CultureInfo.InvariantCulture);

                    var columns = qRow.Children();
                    var seedersElement = columns.Reverse().Skip(1).First();
                    release.Seeders = int.Parse(seedersElement.InnerText);

                    var leechersElement = columns.Last().FirstElement();
                    release.Peers = release.Seeders + int.Parse(leechersElement.InnerText);

                    var sizeElement = columns.Skip(2).First();
                    var sizeStr = sizeElement.InnerText;
                    release.Size = ReleaseInfo.GetBytes(sizeStr);

                    var imdbAnchor = qRow.Find(".torrentnotes a")
                        .FirstOrDefault(a => a.GetAttribute("href").Contains("imdb.com"));
                    if (imdbAnchor != null)
                    {
                        var referrerUrl = imdbAnchor.GetAttribute("href");
                        release.Imdb = long.Parse(Regex.Match(referrerUrl, "tt(?<imdbId>[0-9]+)").Groups["imdbId"].Value);
                    }
                    releases.Add(release);
                }
            }
            catch (Exception ex)
            {
                OnParseError(results.Content, ex);
            }
            return releases;
        }
Exemple #5
0
        private bool ContainsMusicCategories(int[] categories)
        {
            var music = new[]
            {
                TorznabCatType.Audio.ID,
                TorznabCatType.AudioMP3.ID,
                TorznabCatType.AudioLossless.ID,
                TorznabCatType.AudioOther.ID,
                TorznabCatType.AudioForeign.ID
            };

            return categories.Length == 0 || music.Any(categories.Contains);
        }
Exemple #6
0
		public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
		{
			var releases = new List<ReleaseInfo>();
			var episodeSearchUrl = string.Format("{0}?&searchstr={1}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()));
			var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl);
			if (results.Content.Contains("Din søgning gav intet resultat."))
			{
				return releases;
			}
			try
			{
				CQ dom = results.Content;

				var rows = dom["#torrent_table > tbody > tr"].ToArray();

				foreach (var row in rows.Skip(1))
				{
					var release = new ReleaseInfo();
					release.MinimumRatio = 1;
					release.MinimumSeedTime = 172800;

					var seriesCats = new[] { 92, 93, 57, 74 };
					var qCat = row.ChildElements.ElementAt(0).ChildElements.ElementAt(0).Cq();
					var catUrl = qCat.Attr("href");
					var cat = catUrl.Substring(catUrl.LastIndexOf('[') + 1);
					var catNo = int.Parse(cat.Trim(']'));
					if (seriesCats.Contains(catNo))
						release.Category = TorznabCatType.TV.ID;
					else
						continue;

					var qAdded = row.ChildElements.ElementAt(4).ChildElements.ElementAt(0).Cq();
					var addedStr = qAdded.Attr("title");
					release.PublishDate = DateTime.ParseExact(addedStr, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture);

					var qLink = row.ChildElements.ElementAt(1).ChildElements.ElementAt(2).Cq();
					release.Title = qLink.Text().Trim();
					release.Description = release.Title;

					release.Comments = new Uri(SiteLink + qLink.Attr("href"));
					release.Guid = release.Comments;

					var qDownload = row.ChildElements.ElementAt(1).ChildElements.ElementAt(1).ChildElements.ElementAt(0).Cq();
					release.Link = new Uri(SiteLink + qDownload.Attr("href"));

					var sizeStr = row.ChildElements.ElementAt(5).Cq().Text();
					release.Size = ReleaseInfo.GetBytes(sizeStr);

					release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(6).Cq().Text());
					release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text()) + release.Seeders;

					releases.Add(release);
				}
			}
			catch (Exception ex)
			{
				OnParseError(results.Content, ex);
			}

			return releases;
		}
        /// <summary>
        /// Sanitizes the style.
        /// </summary>
        /// <param name="styles">The styles.</param>
        /// <param name="baseUrl">The base URL.</param>
        protected void SanitizeStyle(CsQuery.Implementation.CSSStyleDeclaration styles, string baseUrl)
        {
            if (styles == null || !styles.Any()) return;

            var removeStyles = new List<KeyValuePair<string, string>>();
            var setStyles = new Dictionary<string, string>();

            foreach (var style in styles)
            {
                var key = DecodeCss(style.Key);
                var val = DecodeCss(style.Value);

                if (!AllowedCssPropertiesSet.Contains(key) || CssExpression.IsMatch(val) || DisallowCssPropertyValue.IsMatch(val))
                    removeStyles.Add(style);
                else
                {
                    var urls = CssUrl.Matches(val);

                    if (urls.Count > 0)
                    {
                        if (urls.Cast<Match>().Any(m => GetSafeUri(m.Groups[1].Value) == null))
                            removeStyles.Add(style);
                        else
                        {
                            var s = CssUrl.Replace(val, m => "url(" + SanitizeUrl(m.Groups[1].Value, baseUrl));
                            if (s != val)
                            {
                                if (key != style.Key) removeStyles.Add(style);
                                setStyles[key] = s;
                            }
                        }
                    }
                }
            }

            foreach (var style in removeStyles)
            {
                var e = new RemovingStyleEventArgs { Style = style };
                OnRemovingStyle(e);
                if (!e.Cancel) styles.RemoveStyle(style.Key);
            }

            foreach (var kvp in setStyles)
            {
                styles.SetStyle(kvp.Key, kvp.Value);
            }
        }