Пример #1
0
        public void GetListChapters(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                return;
            }
            if (File.Exists(Path.Combine(Cfg.StoryDirectory, "chapters.json")))
            {
                return;
            }

            List <LinkPage> linkPages = new List <LinkPage>();

            linkPages.Add(new LinkPage()
            {
                Link = url
            });
            while (linkPages.Any(o => !o.Processed))
            {
                var page = linkPages.FirstOrDefault(o => !o.Processed);
                //ClearCurrentConsoleLine();

                //using (var wc = new WebClient())
                if (page != null)
                {
                    Cfg.LogQueue.Enqueue($"{page.Link}");
                    try
                    {
                        //wc.Headers.Add("User-Agent", Cfg.StrUserAgent);

                        //if (url != null)
                        {
                            //var bytes = wc.DownloadData(url);
                            //var html = Encoding.UTF8.GetString(bytes);
                            var html   = Util.DownloadUrl(page.Link);
                            var parser = new HtmlParser();
                            var doc    = parser.Parse(html);
                            var chaps  = doc.QuerySelectorAll(".list-chapter")
                                         .Where(o =>
                            {
                                var f = o.QuerySelector("h2");
                                if (f != null)
                                {
                                    return(Regex.Match(f.TextContent, "Danh sách chương", RegexOptions.IgnoreCase)
                                           .Success);
                                }
                                return(false);
                            })
                                         .Select(o => o.QuerySelector("ul"))

                                         .SelectMany(o => o.QuerySelectorAll("a")
                                                     .Select(p => new ChapterInfo()
                            {
                                Title = p.Text(),
                                Link  = p.Attributes["href"]?.Value
                            }).ToList())
                                         .Where(o => !string.IsNullOrEmpty(o.Link))
                                         .ToList();
                            AllStories.AddRange(chaps);

                            // get chapters link
                            // get next list chapters
                            var foundUrls = doc
                                            .QuerySelectorAll(".pagination > ul > li > a")
                                            .Where(o =>
                            {
                                int.TryParse(o.Text(), out var i);
                                return(i > 0);
                            })
                                            .Select(o => o.Attributes["href"]?.Value)
                                            .Where(o => !string.IsNullOrEmpty(o))
                                            .ToList()
                                            .Except(linkPages.Select(o => o.Link).ToList())
                                            .Select(o => new LinkPage()
                            {
                                Link = o
                            })
                                            .ToList();
                            linkPages.AddRange(foundUrls);
                        }
                        page.Processed = true;
                    }
                    catch (Exception ex)
                    {
                        Cfg.LogQueue.Enqueue($"download error:{ex.StackTrace}");
                        Task.Delay(1000).Wait();
                    }
                }
            }
        }
Пример #2
0
        public void GetListChapters(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                return;
            }
            if (File.Exists(Path.Combine(Cfg.StoryDirectory, "chapters.json")))
            {
                return;
            }
            var found = true;

            while (found)
            {
                //ClearCurrentConsoleLine();
                var url2 = url;
                Cfg.LogQueue.Enqueue($"{url2}");
                using (var wc = new WebClient())
                {
                    try
                    {
                        wc.Headers.Add("User-Agent", Cfg.StrUserAgent);

                        if (url != null)
                        {
                            var bytes  = wc.DownloadData(url);
                            var html   = Encoding.UTF8.GetString(bytes);
                            var parser = new HtmlParser();
                            var doc    = parser.Parse(html);
                            var chaps  = doc.QuerySelectorAll("#list-chapter")
                                         .SelectMany(o => o.QuerySelectorAll("ul")
                                                     .Where(p => p.Attributes["class"]?.Value?.ToString()
                                                            .Contains("list-chapter") ??
                                                            false)
                                                     .ToList()
                                                     )
                                         .Where(o => o != null)
                                         .SelectMany(o => o.QuerySelectorAll("a")
                                                     .Select(p => new ChapterInfo()
                            {
                                Title = p.Text(),
                                Link  = p.Attributes["href"]?.Value
                            }).ToList())
                                         .Where(o => !string.IsNullOrEmpty(o.Link))
                                         .ToList();
                            AllStories.AddRange(chaps);

                            // get chapters link
                            // get next list chapters
                            url = doc
                                  .QuerySelectorAll(".pagination > li")
                                  .ToList()
                                  .Where(o => o.QuerySelectorAll(".glyphicon-menu-right").Length > 0)
                                  .Select(o => o.QuerySelector("a"))
                                  .Select(o => o.Attributes["href"]?.Value.Split('#').FirstOrDefault())
                                  .FirstOrDefault(o => o != null);
                        }

                        found = !string.IsNullOrEmpty(url);
                    }
                    catch (Exception ex)
                    {
                        Cfg.LogQueue.Enqueue($"Error {url} -{ex.StackTrace}");

                        //Task.Delay(1000).Wait();
                    }
                }
            }
        }