public override List<StoryInfo> GetLastestUpdates()
        {
            string lastestUpdateUrl = "http://eatmanga.com/latest/";
            List<StoryInfo> stories = new List<StoryInfo>();
            var html = NetworkHelper.GetHtml(lastestUpdateUrl);

            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(html);
            var nodes = htmlDoc.DocumentNode.SelectNodes("//th[@class=\"title\"]/a");

            foreach (HtmlNode node in nodes)
            {
                string chapterUrl = HostUrl + node.Attributes["href"].Value.Substring(0, node.Attributes["href"].Value.LastIndexOf("/"));
                string pageUrl = chapterUrl.Substring(0, chapterUrl.LastIndexOf("/"));
                StoryInfo info;

                if (stories.Any(p => p.Url == pageUrl))
                {
                    info = stories.Where(p => p.Url == pageUrl).Single();
                }
                else
                {
                    info = new StoryInfo()
                    {
                        Url = pageUrl,
                        Name = pageUrl.Substring(pageUrl.LastIndexOf("/") + 1).Replace("-"," "),
                        Chapters = new List<ChapterInfo>()
                    };

                    stories.Add(info);
                }

                var chapter = new ChapterInfo()
                {
                    Url = chapterUrl,
                    Name = node.InnerText.Trim()
                };

                info.Chapters.Add(chapter);
            }
            return stories;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"mangaproperties\"]/h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Trim(),
            };

            //var match = Regex.Match(html,"<table id=\"listing\"");
            //var index = match.Captures[0].Index;
            //var table = html.Substring(index, html.IndexOf("</table>", index)-index+9);
            //htmlDoc.LoadHtml(table);
            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"listing\"]//td//a");

            if (chapterNodes != null)
            {
                foreach (HtmlNode chapter in chapterNodes)
                {
                    ChapterInfo chap = new ChapterInfo()
                    {
                        Name = chapter.InnerText.Trim(),
                        Url = HostUrl + chapter.Attributes["href"].Value,
                        ChapId = ExtractID(chapter.InnerText)
                    };
                    info.Chapters.Add(chap);
                }
                info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            }
            return info;
        }
        public override StoryInfo RequestInfo(string url)
        {
            StoryInfo info = new StoryInfo();

            // LockControl(false);
            //string url = string.Format(StoryUrlPattern, urlSegment);

            var html = NetworkHelper.GetHtml(url);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);

            var node = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"fontsize-chitiet\"]/span[1]");
            info.Name = node.InnerText;
            var node2 = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"fontsize-chitiet\"]/span[2]");
            info.AltName = node2.InnerText;
            var node3 = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"fontsize-chitiet\"]/span[2]");
            info.Categories = node3.InnerText;
            info.Url = url;

            var ccontentmain = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"content-main\"]");
            

            htmlDoc.LoadHtml(ccontentmain.InnerHtml);

            var chapterLinks = htmlDoc.DocumentNode.SelectNodes("//a[@href!='']");

            info.ChapterCount = chapterLinks.Count;
            foreach (HtmlNode item in chapterLinks)
            {

                ChapterInfo chapter = new ChapterInfo()
                {
                    Url = string.Format("{0}{1}doc-truyen/", HostUrl, item.Attributes["href"].Value),
                    Name = item.InnerText
                    ,
                    ChapId = ExtractID(item.InnerText)

                };
               

                info.Chapters.Add(chapter);
            }

            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();

            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);
            //detect hentai
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class=\"tuade\"]/a");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Trim(),
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"listing\"]//td[1]/h6/a");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText.Trim(),
                    Url =  chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText)
                };
                chap.Url = chap.Url.Substring(chap.Url.IndexOf("/http")+1);
                info.Chapters.Add(chap);

                
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            StoryInfo info = new StoryInfo
            {
                Url = storyUrl,
            };

            var html = NetworkHelper.GetHtml(storyUrl);
            var htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);
            
            var node = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"post\"]/div[1]/h1/a");
            info.Name = node.InnerText.Replace("&nbsp;", string.Empty);

            //var chapters = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"post\"]//a[contains(@href,'x2.blogtruyen.com')]");
            var chapters = htmlDoc.DocumentNode
                .Descendants("a")
                .Where(x => x.Attributes.Contains("href") &&
                          ( x.Attributes["href"].Value.Contains("x1.blogtruyen.com") ||
                            x.Attributes["href"].Value.Contains("x2.blogtruyen.com") ||
                            x.Attributes["href"].Value.Contains("x3.blogtruyen.com")))
                .ToList();

            foreach (HtmlNode item in chapters)
            {

                var chapInfo = new ChapterInfo()
                {
                    Url = item.Attributes["href"].Value,
                    Name = item.FirstChild.InnerText,
                    ChapId = ExtractID(item.FirstChild.InnerText)
                };


                info.Chapters.Add(chapInfo);

            }

            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        private Downloader GetDownloader(ChapterInfo chapInfo)
        {
            var downloaders = Downloader.GetAllDownloaders();
            string pattern = @"https?://(?<DOMAIN>.*.com|me|net|info)";
            foreach (var item in downloaders)
            {
                var m = Regex.Match(item.HostUrl, pattern);
                string domain = m.Groups["DOMAIN"].Value;

                var arr = domain.Split(".".ToCharArray());
                var root = arr[arr.Length - 2] + "." + arr[arr.Length - 1];

                if(m!=null) {

                    if (chapInfo.Url.Contains(root)) return item;
                }
            }
            throw new Exception("No Downloader found for this chapter with url "+ chapInfo.Url);
        }
        private void CreateChapterFolder(ChapterInfo chapInfo)
        {
            try
            {
                if (Directory.Exists(chapInfo.Folder))
                {
                    Directory.Delete(chapInfo.Folder, true);
                }
                Directory.CreateDirectory(chapInfo.Folder);
            }
            finally
            {

            }
        }
        public override StoryInfo RequestInfo(string url)
        {
            StoryInfo story = new StoryInfo()
            {
                Url = url
            };
            var html = NetworkHelper.GetHtml(url);

            var htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);

            var nodeHtml = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"vcfix\"]");

            var match = Regex.Match(nodeHtml.InnerHtml, "<strong>(.*?)</strong>");
            if (match != null)
            {
                story.Name = match.Groups[1].Value;
            }

            htmlDoc.LoadHtml(nodeHtml.InnerHtml);

            var nodes = htmlDoc.DocumentNode.SelectNodes("//p/a");
            if (nodes != null)
                foreach (HtmlNode node in nodes)
                {
                    ChapterInfo chap = new ChapterInfo()
                    {
                        Url = node.Attributes["href"].Value,
                        Name = node.InnerText,
                        ChapId = ExtractID(node.InnerText)
                    };

                    story.Chapters.Add(chap);
                }
            story.Chapters = story.Chapters.OrderBy(p => p.ChapId).ToList();
            return story;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {

            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var table = htmlDoc.DocumentNode.SelectNodes("//td[@class=\"page\"]/table[@class=\"tborder\"]")[1];

            htmlDoc.LoadHtml(table.OuterHtml);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//b");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Substring(0,nameNode.InnerText.IndexOf("-"))
            };

            var chapNodes = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href,'view_book_detail')]");

            foreach (HtmlNode node in chapNodes)
            {
                ChapterInfo chapInfo = new ChapterInfo()
                {
                    //Name = node.InnerText.Trim(),
                    Url = HostUrl+ node.Attributes["href"].Value.Trim(),
                    //ChapId = ExtractID(node.InnerText.Trim())
                };
                var t = node.ParentNode.ParentNode.ParentNode.NextSibling.NextSibling.NextSibling.NextSibling;
                chapInfo.Name = t.InnerText.Trim();
                chapInfo.ChapId = ExtractID(t.InnerText.Trim(), @"tap([\d]*)");
                info.Chapters.Add(chapInfo);
            }

            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;

        }
        private void DownloadChapter(ChapterInfo chapInfo)
        {
            if (chapInfo.Pages == null) return;

            CreateChapterFolder(chapInfo);

            int count = 0;
            long size = 0;
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            int toProcess = chapInfo.Pages.Count;

            SmartThreadPool smartThreadPool = new SmartThreadPool()
            {
                MaxThreads = 8
            };

            int index = 1;
            List<IWorkItemResult> wi = new List<IWorkItemResult>();

            foreach (string pageUrl in chapInfo.Pages)
            {
                IWorkItemResult wir1 = smartThreadPool.QueueWorkItem(new
                       WorkItemCallback(delegate(object state)
                {

                    DownloadPageParam param = (DownloadPageParam)state;
                    try
                    {
                        string filename = Downloader.DownloadPage(param.PageUrl, Settings.RenamePattern.Replace("{{PAGENUM}}", param.Index.ToString("D2")), chapInfo.Folder, chapInfo.Url);

                        var file = File.Open(filename, FileMode.Open);


                        lock (updateUIObj)
                        {
                            size += file.Length;
                            total += file.Length;
                            file.Close();
                            count++;
                            this.Invoke((MethodInvoker)delegate
                            {

                                this.progess.Value = count;
                                lblPageCount.Text = string.Format("{0:D2}/{1:D2}", count, chapInfo.PageCount);

                                var listItem = listHistory.Items[listHistory.Items.Count - 1];
                                listItem.SubItems[3].Text = size.ToKB();
                                lblTotalDownloadCount.Text = total.ToKB();
                                var subItem = listItem.SubItems[4] as EXControlListViewSubItem;
                                var pp = subItem.MyControl as ProgressBar;
                                pp.Value = count;


                            });
                        }


                    }
                    catch (Exception ex)
                    {
                        MyLogger.Log(ex);
                    }
                    finally
                    {

                        if (Interlocked.Decrement(ref toProcess) == 0)
                            resetEvent.Set();
                    }

                    return 1;
                }), new DownloadPageParam() { Index = index++, PageUrl = pageUrl});


                wi.Add(wir1);

            }

            SmartThreadPool.WaitAll(wi.ToArray());
            
        }
        private void DisplayChap(ChapterInfo chapInfo, int chapCount)
        {
            this.Invoke((MethodInvoker)delegate
            {
                this.progess.Minimum = 1;
                this.progess.Value = 1;
                this.progess.Maximum = chapInfo.PageCount;
                var listItem = new EXListViewItem(chapCount.ToString());
                listItem.SubItems.Add(chapInfo.Name.Replace('"',' ').Replace('.',' '));
                listItem.SubItems.Add(chapInfo.PageCount.ToString());
                listItem.SubItems.Add("0");
                EXControlListViewSubItem cs = new EXControlListViewSubItem();
                ProgressBar b = new ProgressBar();
                //b.Tag = item;
                b.Minimum = 0;
                b.Maximum = chapInfo.PageCount;
                b.Step = 1;

                listItem.SubItems.Add(cs);
                this.listHistory.AddControlToSubItem(b, cs);

                //Add button to view folder

                EXControlListViewSubItem openFolderCol = new EXControlListViewSubItem();
                Button bntOpenFolder = new Button()
                {
                    Image = global::ComicDownloader.Properties.Resources._1364392872_slideshow,
                    //Location = new System.Drawing.Point(248, 123);
                    //Name = "button2";
                    Size = new System.Drawing.Size(24, 24),

                    TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay,
                    UseVisualStyleBackColor = true,
                    Tag = openFolderCol,
                    //Text = chapInfo.PdfPath,
                    Enabled = true,

                };

                bntOpenFolder.Click += new EventHandler(delegate
                {
                     MainWindow window = new MainWindow(new string[] { chapInfo.Folder+"/dum.trick","0"});
                     window.WindowState = FormWindowState.Maximized;
                    window.ShowDialog();
                    //window.SubStartSlideShow();
                });
                // llbl.LinkClicked += new LinkLabelLinkClickedEventHandler(llbl_LinkClicked);
                listItem.SubItems.Add(openFolderCol);
                listHistory.AddControlToSubItem(bntOpenFolder, openFolderCol);


                //listItem.SubItems.Add(chapInfo.Folder);

                EXControlListViewSubItem pdfLinkCol = new EXControlListViewSubItem();
                Button bntOpenPDF = new Button()
                {


                    Image = global::ComicDownloader.Properties.Resources._1364326694_stock_save_pdf_24,
                    //Location = new System.Drawing.Point(248, 123);
                    //Name = "button2";
                    Size = new System.Drawing.Size(24, 24),

                    TextImageRelation = System.Windows.Forms.TextImageRelation.Overlay,
                    UseVisualStyleBackColor = true,
                    Tag = pdfLinkCol,
                    //Text = chapInfo.PdfPath,
                    Enabled = false,
                    
                };

                bntOpenPDF.Click += new EventHandler(bntOpenPDF_Click);
               
                listItem.SubItems.Add(pdfLinkCol);
                listHistory.AddControlToSubItem(bntOpenPDF, pdfLinkCol);

                listItem.SubItems.Add(chapInfo.PdfPath);
                this.listHistory.Items.Add(listItem);
                lblPageCount.Text = string.Format("{0:D2}/{1:D2}", "0", chapInfo.PageCount);

            });
        }
        private void GeneratePDF(ChapterInfo chapInfo)
        {
            if (!Settings.CreatePDF)
            {
                return;
            }
            try
            {
                PDFHelper.CreatePDF(chapInfo.Folder, chapInfo.PdfPath, chapInfo.Name, Settings);

                this.Invoke((MethodInvoker)delegate
                {
                    var listItem = listHistory.Items[listHistory.Items.Count - 1];

                    var subItem = listItem.SubItems[6] as EXControlListViewSubItem;
                    var pp = subItem.MyControl as Button;
                    pp.Enabled = true;
                    pp.Tag = chapInfo.PdfPath;

                });

            }
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }
            finally
            {

            }

        }
        public override StoryInfo RequestInfo(string storyUrl)
        {

            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//a[@class=\"bigChar\"]");



            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText
            };

            var chapNodes = htmlDoc.DocumentNode.SelectNodes("//table[@class=\"listing\"]//td[1]/a");

            foreach (HtmlNode node in chapNodes)
            {
                ChapterInfo chapInfo = new ChapterInfo()
                {
                    Name = node.InnerText.Trim(),
                    Url = HostUrl+node.Attributes["href"].Value.Trim(),
                    ChapId = ExtractID(node.InnerText.Trim())   
                };
                
                info.Chapters.Add(chapInfo);
            }

            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;

        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//section[@class=\"manga\"]//h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Trim().Replace("Manga",""),
            };

            
            var chapters = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"list\"]//li/span/a");
            var links = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"list\"]//em/a[last()]");

            for (int i = 0; i < chapters.Count; i++)
            {
            
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapters[i].ChildNodes[0].InnerText + chapters[i].ChildNodes[1].InnerText,
                    Url = HostUrl + links[i].Attributes["href"].Value.Trim()
                    //ChapId = ExtractID(chapter.InnerText)
                };
                chap.ChapId = ExtractID(chap.Name, "Ch.(\\d*)");
                info.Chapters.Add(chap);
            }
            
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override List<StoryInfo> GetLastestUpdates()
        {
            string lastestUpdateUrl = HostUrl;
            List<StoryInfo> stories = new List<StoryInfo>();
            var html = NetworkHelper.GetHtml(lastestUpdateUrl);

            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(html);

            var chapters = htmlDoc.DocumentNode.SelectNodes("//ul[@id=\"news\"]/li/a[contains(@href,\"en-manga\")]");
            if (chapters != null)
            {
                foreach (HtmlNode chap in chapters)
                {
                    var item = new ChapterInfo()
                    {
                        Name = chap.InnerText.Trim(),
                        Url = HostUrl + chap.Attributes["href"].Value
                    };

                    var page = chap.ParentNode.SelectSingleNode("div[position()=1]/a[position()=1]");
                    var pageUrl = page.Attributes["href"].Value;
                    if (pageUrl.Contains("it-manga"))
                    {
                        pageUrl = pageUrl.Replace("it-manga", "en-manga");
                    }

                    if (stories.Any(p => p.Url == page.Attributes["href"].Value))
                    {
                        stories.Where(p => p.Url == page.Attributes["href"].Value).Single().Chapters.Add(item);
                    }
                    else
                    {
                        StoryInfo info = new StoryInfo()
                        {
                            Url = HostUrl + pageUrl,
                            Name = page.InnerText.Trim(),
                            Chapters = new List<ChapterInfo>() { item }
                        };

                        stories.Add(info);
                    }
                }
            }
                
            return stories;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"box2\"]/h2");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.FirstChild.InnerText.Trim(),
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"files\"]//table[1]//a");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText.Trim(),
                    Url =  HostUrl.Substring(0,HostUrl.Length-1) + chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText)
                };
                info.Chapters.Add(chap);
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
 private void RefreshData(ChapterInfo chap)
 {
     var dsItem = DataSource.FirstOrDefault(p => p.Identify == chap.UniqueIdentify);
     if (dsItem != null)
     {
             //Progress = (new Random()).Next(1,100),
             dsItem.ChapterUrl = chap.Url;
             dsItem.Pages = chap.PageCount;
             dsItem.Size = chap.Size.ToKB();
             dsItem.Status = ((float)chap.DownloadedCount / chap.PageCount).ToString("p");
             if (chap.Status != DownloadStatus.Downloading)
             {
                 dsItem.Status = chap.Status.ToString();
             }
             else
             {
                 dsItem.Status = ((float)chap.DownloadedCount / chap.PageCount).ToString("p");
                 if (dsItem.Status == "NaN") dsItem.Status = "Initializing...";
             }
             lsvItems.RefreshObject(dsItem);
     }
     
 }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);
            //detect hentai
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var testNode = htmlDoc.DocumentNode.SelectSingleNode("//a[@class=\"xacnhan\"]");
            if (testNode!= null)
            {
                var url = testNode.Attributes["href"].Value;
                 url = System.Web.HttpUtility.UrlDecode(url);
                storyUrl = url.Substring(url.IndexOf("/http://") + 1);
                html = NetworkHelper.GetHtml(storyUrl);
                htmlDoc.LoadHtml(html);
            }
            

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class=\"barContent\"]//a");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"listing\"]//td[1]/a");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText,
                    Url =  chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText)
                };
                info.Chapters.Add(chap);
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        private void GeneratePDF(ChapterInfo chapInfo)
        {
            if (!Settings.CreatePDF)
            {
                return;
            }
            try{
                PDFHelper.CreatePDF(chapInfo.Folder, chapInfo.PdfPath, chapInfo.Name, Settings);
            }
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }
            finally
            {
            }

        }
        public override List<StoryInfo> GetLastestUpdates()
        {
            string lastestUpdateUrl = HostUrl;
            List<StoryInfo> stories = new List<StoryInfo>();
            var html = NetworkHelper.GetHtml(lastestUpdateUrl);

            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(html);
            var nodes = htmlDoc.DocumentNode.SelectNodes("//fieldset[@class=\"most most_latest\"]/table//tr/td/a");

            foreach (HtmlNode node in nodes)
            {
                string chapterUrl = HostUrl + node.Attributes["href"].Value;
                string pageUrl = HostUrl + "/serie-archive/mangas-" + node.Attributes["href"].Value.Substring(1, node.Attributes["href"].Value.LastIndexOf("/"));
                var chapterTitle = node.ChildNodes[2].InnerText.Trim();
                StoryInfo info;

                if (stories.Any(p => p.Url == pageUrl))
                {
                    info = stories.Where(p => p.Url == pageUrl).Single();
                }
                else
                {
                    var pageTitle = chapterTitle.Substring(0, chapterTitle.LastIndexOf(' '));
                    info = new StoryInfo()
                    {
                        Url = pageUrl,
                        Name = pageTitle,
                        Chapters = new List<ChapterInfo>()
                    };

                    stories.Add(info);
                }

                var chapter = new ChapterInfo()
                {
                    Url = chapterUrl,
                    Name = chapterTitle
                };

                info.Chapters.Add(chapter);
            }
            return stories;
        }
        private void DownloadChapter(ChapterInfo chapInfo, Downloader downloader)
        {
            if (chapInfo.Pages == null) return;

            SmartThreadPool smartThreadPool = new SmartThreadPool()
            {
                MaxThreads = Settings.UseMultiThreadToDownloadChapter?Settings.Threads:1
            };

            List<IWorkItemResult> workerItems = new List<IWorkItemResult>();

           CreateChapterFolder(chapInfo);

           this.Invoke(new MethodInvoker(delegate()
           {
               lblStatus.Text = "Downloading : " + chapInfo.Name + "[" + chapInfo.Url + "]";
           }));
            int count = 0;
            long size = 0;
            
            int toProcess = chapInfo.Pages.Count;
            int index = 1;
           
            foreach (string pageUrl in chapInfo.Pages)
            {
                IWorkItemResult wir1 = smartThreadPool.QueueWorkItem(new
                        WorkItemCallback(delegate(object state)
                        {

                            try
                            {
                                string filename = downloader.DownloadPage(state.ToString(), Settings.RenamePattern.Replace("{{PAGENUM}}", (index++).ToString("D2")), chapInfo.Folder, chapInfo.Url);

                                var file = File.Open(filename, FileMode.Open);

                                lock (updateUIObj)
                                {
                                    size += file.Length;
                                    //total += file.Length;
                                    file.Close();
                                    count++;
                                    chapInfo.Size = size;
                                    chapInfo.DownloadedCount = count;
                                    RefreshData(chapInfo);
                                }
                            }
                            catch{
                            }
                            finally
                            {
                                RefreshData(chapInfo);
                            }
                            return 0;
                        }), pageUrl);
                workerItems.Add(wir1);

            }

            bool success = SmartThreadPool.WaitAll(workerItems.ToArray());

            smartThreadPool.Shutdown();
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"title\"]//h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Replace("Manga",""),
            };

            var volumns = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"slide\"]");
            foreach (HtmlNode item in volumns)
	        {
		    string vol = item.SelectSingleNode("h3").InnerText;
            vol = Regex.Replace(vol, "(Volume \\d*).*", "$1");
            var chapterNodes = item.NextSibling.SelectNodes("li//a[@class=\"tips\"]");
            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name =vol+" - "+ chapter.InnerText,
                    Url = chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText)
                };
                info.Chapters.Add(chap);
            }
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);
            //detect hentai
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

           
            

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"sct_content\"]//h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText
            };

            List<string> urls = new List<string>();

            var pagingNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class=\"pgg\"]");

            if (pagingNode == null) urls.Add(storyUrl);
            else
            {
                var paging = pagingNode.Descendants("a");
                foreach (HtmlNode pNode  in paging)
                {
                    if (!urls.Contains(pNode.Attributes["href"].Value.Trim()))
                        urls.Add(pNode.Attributes["href"].Value.Trim());
                }
            }
            foreach (var pageUrl in urls)
            {
                html = NetworkHelper.GetHtml(pageUrl);
                htmlDoc.LoadHtml(html);

                var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//ul[@class=\"lst\"][1]//a");

                foreach (HtmlNode chapter in chapterNodes)
                {
                    ChapterInfo chap = new ChapterInfo()
                    {
                        Name = chapter.ChildNodes[1].InnerText.Trim(),
                        Url = chapter.Attributes["href"].Value,
                        
                    };
                    var p = @"&(\d*); (.*)";
                    chap.Name = Regex.Replace(chap.Name, @"&#(\d*);(.*)", "$2");
                    chap.ChapId = ExtractID(chap.Name);
                    info.Chapters.Add(chap);
                }
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override List<StoryInfo> GetLastestUpdates()
        {
            string lastestUpdateUrl = HostUrl;
            List<StoryInfo> stories = new List<StoryInfo>();
            var html = NetworkHelper.GetHtml(lastestUpdateUrl);

            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(html);
            var nodes = htmlDoc.DocumentNode.SelectNodes("//div[@id=\"inner_page\"]/div[position()>2]//a");

            foreach (HtmlNode node in nodes)
            {
                string chapterUrl = HostUrl + node.Attributes["href"].Value;
                string pageUrl;
                if (chapterUrl.Contains("chapter"))
                {
                    pageUrl = chapterUrl.Substring(0, chapterUrl.LastIndexOf("/"));
                    pageUrl = pageUrl.Substring(0, pageUrl.LastIndexOf("/"));
                }
                else
                {
                    pageUrl = chapterUrl;
                }
                StoryInfo info;

                if (stories.Any(p => p.Url == pageUrl))
                {
                    info = stories.Where(p => p.Url == pageUrl).Single();
                }
                else
                {
                    info = new StoryInfo()
                    {
                        Url = pageUrl,
                        Name = node.ChildNodes[0].InnerText.Trim(),
                        Chapters = new List<ChapterInfo>()
                    };

                    stories.Add(info);
                }

                var chapter = new ChapterInfo()
                {
                    Url = chapterUrl,
                    Name = node.ChildNodes[0].InnerText.Trim() + ' ' + node.ChildNodes[1].InnerText.Trim() + ' ' + node.ChildNodes[2].NextSibling.InnerText.Trim()
                };

                info.Chapters.Add(chapter);
            }

            
            return stories;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);
            
            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class=\"cmtList\"]//h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Trim().Replace("Manga",""),
            };


            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"chapter_list\"]//td[1]/a");
            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText.Trim(),
                    Url = HostUrl+ chapter.Attributes["href"].Value,
                    //ChapId = ExtractID(chapter.InnerText)
                };
                chap.ChapId = ExtractID(chap.Name);
                info.Chapters.Add(chap);
            }
            
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"bc\"]//a[last()]");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText.Trim(),
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"download-link\"]");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText ,//+ " " + chapter.ChildNodes[0].InnerText + " " + chapter.ChildNodes[1].InnerText,
                    Url = HostUrl + chapter.Attributes["href"].Value,
                    
                };
                chap.ChapId = ExtractID(chap.Name);
                info.Chapters.Add(chap);
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string url)
        {

            var html = NetworkHelper.GetHtml(url);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
            htmlDoc.LoadHtml(html);
            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"mangainfo\"]//h3");

            StoryInfo info = new StoryInfo()
            {
                Url = url,
                Name = nameNode.InnerText.Trim()
            };

            var chapterLinks = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"manga_chapters\"]//span[1]/a");

            info.ChapterCount = chapterLinks.Count;
            foreach (HtmlNode item in chapterLinks)
            {

                ChapterInfo chapter = new ChapterInfo()
                {
                    Url = item.Attributes["href"].Value,
                    Name = item.InnerText
                    ,
                    ChapId = ExtractID(item.InnerText, @"Chapter (\d*)")

                };


                info.Chapters.Add(chapter);
            }

            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();

            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            

            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//h1[@itemprop=\"name\"]");

            
             
            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText
            };

              var chapNodes = htmlDoc.DocumentNode.SelectNodes("//*[@itemprop=\"itemListElement\"]");

              foreach (HtmlNode node in chapNodes)
              {
                  ChapterInfo chapInfo = new ChapterInfo()
                  {
                      Name = node.Descendants("strong").FirstOrDefault().InnerText,
                      Url = node.Descendants("a").FirstOrDefault().Attributes["href"].Value.Trim(),
                      ChapId = ExtractID(node.Descendants("strong").FirstOrDefault().InnerText)
                  };
                  info.Chapters.Add(chapInfo);
              }

              info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id=\"main\"]//h1");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.ChildNodes[1].InnerText.Trim(),
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"detail_list\"]//li//a");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText.Trim(),
                    Url = chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText.Trim())
                };
                info.Chapters.Add(chap);
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }
        public override StoryInfo RequestInfo(string storyUrl)
        {
            var html = NetworkHelper.GetHtml(storyUrl);

            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(html);

            var nameNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class=\"bgTitle\"]//b");

            StoryInfo info = new StoryInfo()
            {
                Url = storyUrl,
                Name = nameNode.InnerText
            };

            var chapterNodes = htmlDoc.DocumentNode.SelectNodes("//*[@class=\"cellChapter\"]//a");

            foreach (HtmlNode chapter in chapterNodes)
            {
                ChapterInfo chap = new ChapterInfo()
                {
                    Name = chapter.InnerText,
                    Url = HostUrl + chapter.Attributes["href"].Value,
                    ChapId = ExtractID(chapter.InnerText)
                };
                info.Chapters.Add(chap);
            }
            info.Chapters = info.Chapters.OrderBy(p => p.ChapId).ToList();
            return info;
        }