예제 #1
0
        public override async void HitomiPanel_Loaded(object sender, RoutedEventArgs e)
        {
            this.nameLabel.Content = h.name + " (로딩중)";
            InternetP parser = new InternetP();

            parser.index = int.Parse(h.id);
            h            = await parser.HitomiData();

            //h = await parser.HitomiData2(h, int.Parse(h.id));
            if (Global.config.origin_thumb.Get <bool>() && h.files != null && h.files.Length >= 1 && h.files[0] != null)
            {
                this.pageLabel.Content = h.files.Length;
                this.nameLabel.Content = h.name + " (썸네일 로딩중)";
                ImageProcessor.ProcessAsync(h.files[0].url).then((byte[] image) =>
                {
                    h.thumbnail.preview_img = image;
                    base.h = this.h;
                    this.nameLabel.Content = h.name;
                }, null, sourceName: MethodBase.GetCurrentMethod().FullName());
            }
            else
            {
                var preview_image = await ImageProcessor.ProcessAsync(h.thumbnail.preview_url).@catch(null, MethodBase.GetCurrentMethod().FullName());

                h.thumbnail.preview_img = preview_image;
                base.h = this.h;
                this.nameLabel.Content = h.name;
            }
            BitmapImage image = h.thumbnail.preview_img.ToImage();

            thumbNail.Source       = image;
            thumbBrush.ImageSource = image;
            thumbNail.MouseEnter  += (object _, MouseEventArgs __) => thumbNail.ToolTip = GetToolTip(panel.Height);
            Init();
        }
예제 #2
0
        private async void HitomiPanel_Loaded(object sender, RoutedEventArgs e)
        {
            if (!afterLoad)
            {
                return;
            }
            if (h.type == Hitomi.Type.Hiyobi)
            {
                this.nameLabel.Content = h.name + " (로딩중)";
                h.files = new string[0];
                InternetP parser = new InternetP(index: int.Parse(h.id));
                this.h.files           = (await parser.HiyobiFiles()).Select(x => x.url).ToArray();
                this.h.page            = h.files.Length;
                this.nameLabel.Content = h.name;
                Init();
            }
            if (h.type == Hitomi.Type.Hitomi)
            {
                this.nameLabel.Content = h.name + " (로딩중)";
                InternetP parser = new InternetP();
                parser.url = $"https://ltn.hitomi.la/galleries/{h.id}.js";
                JObject info = await parser.HitomiGalleryInfo();

                h.type  = Hitomi.Type.Hitomi;
                h.tags  = parser.HitomiTags(info);
                h.files = parser.HitomiFiles(info).ToArray();
                h.page  = h.files.Length;
                h.thumb = ImageProcessor.LoadWebImage("https:" + h.thumbpath);
                h.Json  = info;
                h       = await parser.HitomiGalleryData(h);

                this.nameLabel.Content = h.name;
                Init();
            }
        }
예제 #3
0
        private async void DownloadData_Click(object sender, RoutedEventArgs e)
        {
            bool hiyobi = ftype == Hitomi.Type.Hiyobi;

            if (ftype == Hitomi.Type.Folder)
            {
                bool result = await new InternetP(index: int.Parse(h.id)).isHiyobi();
                hiyobi = result;
            }
            if (hiyobi)
            {
                Hitomi h2 = await new HiyobiLoader(text: h.id).Parser();
                if (h2.name == "정보없음" && h2.id == "0")
                {
                    MessageBox.Show("데이터를 받아오는데 실패했습니다.");
                    return;
                }
                string folder = h.dir;
                if (h.type != Hitomi.Type.Folder)
                {
                    folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Global.DownloadFolder, File2.GetDownloadTitle(File2.SaftyFileName(h2.name)));
                }
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }
                File.WriteAllText(Path.Combine(folder, "info.json"), JObject.FromObject(h2).ToString());
                MessageBox.Show("데이터를 성공적으로 받았습니다.");
                authorsPanel.Children.Clear();
                authorsPanel.Children.Add(new Label {
                    Content = "작가 :"
                });
                tagPanel.Children.Clear();
                Init();
            }
            if (!hiyobi)
            {
                InternetP parser = new InternetP();
                parser.index = int.Parse(h.id);
                Hitomi h2 = await parser.HitomiData2();

                string folder = h.dir;
                if (h.type != Hitomi.Type.Folder)
                {
                    folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Global.DownloadFolder, File2.GetDownloadTitle(File2.SaftyFileName(h2.name)));
                }
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }
                File.WriteAllText(Path.Combine(folder, "info.json"), JObject.FromObject(h2).ToString());
                MessageBox.Show("데이터를 성공적으로 받았습니다.");
                authorsPanel.Children.Clear();
                authorsPanel.Children.Add(new Label {
                    Content = "작가 :"
                });
                tagPanel.Children.Clear();
                Init();
            }
        }
예제 #4
0
        private void Folder_Hiyobi_Search_Click(object sender, RoutedEventArgs e)
        {
            MainWindow.MainPanel.Children.Clear();
            MainWindow.label.Visibility = Visibility.Visible;
            MainWindow.label.FontSize   = 100;
            InternetP parser = new InternetP();

            parser.keyword = h.name.Replace("|", "|").Split(' ').ToList();
            parser.index   = 1;
            parser.HiyobiSearch(data => new InternetP(data: data).ParseJObject(async jobject =>
            {
                MainWindow.label.Content = 0 + "/" + jobject["list"].ToList().Count;
                foreach (JToken tk in jobject["list"])
                {
                    MainWindow.label.Content = jobject["list"].ToList().IndexOf(tk) + "/" + jobject["list"].ToList().Count;
                    parser      = new InternetP();
                    parser.url  = $"https://cdn.hiyobi.me/data/json/{tk["id"]}_list.json";
                    JArray imgs = await parser.TryLoadJArray();
                    if (imgs == null)
                    {
                        continue;
                    }
                    Hitomi h = new Hitomi
                    {
                        id        = tk["id"].ToString(),
                        name      = tk["title"].ToString(),
                        dir       = $"https://hiyobi.me/reader/{tk["id"]}",
                        page      = imgs.Count,
                        thumbpath = $"https://cdn.hiyobi.me/tn/{tk["id"]}.jpg",
                        thumb     = await ImageProcessor.LoadWebImageAsync($"https://cdn.hiyobi.me/tn/{tk["id"]}.jpg"),
                        type      = Hitomi.Type.Hiyobi
                    };
                    Int64 size    = 0;
                    h.files       = imgs.ToList().Select(x => $"https://cdn.hiyobi.me/data/{tk["id"]}/{x["name"]}").ToArray();
                    h.FolderByte  = size;
                    h.SizePerPage = size / imgs.Count;
                    foreach (JToken tags in tk["tags"])
                    {
                        Tag tag = new Tag();
                        if (tags["value"].ToString().Contains(":"))
                        {
                            tag.types = (Tag.Types)Enum.Parse(typeof(Tag.Types), tags["value"].ToString().Split(':')[0]);
                            tag.name  = tags["display"].ToString();
                        }
                        else
                        {
                            tag.types = Structs.Tag.Types.tag;
                            tag.name  = tags["display"].ToString();
                        }
                        h.tags.Add(tag);
                    }
                    MainWindow.MainPanel.Children.Add(new HitomiPanel(h, MainWindow));
                    Console.WriteLine($"Completed: https://cdn.hiyobi.me/tn/{tk["id"]}.jpg");
                }
                MainWindow.label.Visibility = Visibility.Hidden;
            }));
        }
예제 #5
0
        private void MenuHiyobi_Click(object sender, RoutedEventArgs e)
        {
            MainPanel.Children.Clear();
            LabelSetup();
            InternetP    parser = new InternetP(url: "https://api.hiyobi.me/list/" + GetPage());
            HiyobiLoader hiyobi = new HiyobiLoader();

            hiyobi.FastDefault();
            parser.LoadJObject(hiyobi.FastParser);
        }
예제 #6
0
        public void Hiyobi_Search_Button_Click(object sender, RoutedEventArgs e)
        {
            MainPanel.Children.Clear();
            LabelSetup();
            InternetP    parser = new InternetP(keyword: Hiyobi_Search_Text.Text.Split(' ').ToList(), index: 1);
            HiyobiLoader hiyobi = new HiyobiLoader();

            hiyobi.FastDefault();
            parser.HiyobiSearch(data => new InternetP(data: data).ParseJObject(hiyobi.FastParser));
        }
예제 #7
0
        public async Task Parser(int[] ids)
        {
            start(ids.Length);
            InternetP parser = new InternetP();

            for (int i = 0; i < ids.Length; i++)
            {
                parser.index = ids[i];
                Hitomi h = await parser.HitomiData2();

                update(h, i, ids.Count());
            }
            end();
        }
예제 #8
0
        public async void FastParser(int[] ids)
        {
            start(ids.Length);
            for (int i = 0; i < ids.Length; i++)
            {
                InternetP parser = new InternetP();
                parser.index = ids[i];
                Hitomi h = await parser.HitomiData();

                h.type = Hitomi.Type.Hitomi;
                h.id   = ids[i].ToString();
                update(h, i, ids.Count());
            }
            end();
        }
예제 #9
0
        public async Task <Hitomi> Parser()
        {
            InternetP parser;

            parser = new InternetP(url: $"https://api.hiyobi.me/gallery/{text}");
            JObject obj = await parser.LoadJObject();

            parser = new InternetP(url: $"https://cdn.hiyobi.me/data/json/{text}_list.json");
            JArray imgs = await parser.TryLoadJArray();

            if (imgs == null)
            {
                return(null);
            }
            Hitomi h = new Hitomi
            {
                id         = obj.StringValue("id"),
                name       = obj.StringValue("title"),
                type       = type,
                page       = imgs.Count,
                dir        = $"https://hiyobi.me/reader/{text}",
                thumb      = ImageProcessor.LoadWebImage($"https://cdn.hiyobi.me/tn/{text}.jpg"),
                thumbpath  = $"https://cdn.hiyobi.me/tn/{text}.jpg",
                files      = imgs.ToList().Select(x => $"https://cdn.hiyobi.me/data/{text}/{x["name"]}").ToArray(),
                author     = string.Join(", ", obj["artists"].Select(x => x["display"].ToString())),
                authors    = obj["artists"].Select(x => x["display"].ToString()).ToArray(),
                Json       = obj,
                designType = new InternetP().DesignTypeFromInt(obj.IntValue("type") ?? 0),
                language   = obj.StringValue("language")
            };

            foreach (JToken tags in obj["tags"])
            {
                Tag tag = new Tag();
                if (tags["value"].ToString().Contains(":"))
                {
                    tag.types = (Tag.Types)Enum.Parse(typeof(Tag.Types), tags["value"].ToString().Split(':')[0]);
                }
                else
                {
                    tag.types = Tag.Types.tag;
                }
                tag.name = tags["display"].ToString();
                h.tags.Add(tag);
            }
            return(h);
        }
예제 #10
0
        public async void Parser(JObject jobject)
        {
            start(jobject["list"].Count());
            foreach (JToken tk in jobject["list"])
            {
                InternetP parser = new InternetP(url: $"https://cdn.hiyobi.me/data/json/{tk["id"]}_list.json");
                JArray    imgs   = await parser.TryLoadJArray();

                if (imgs == null)
                {
                    continue;
                }
                Hitomi h = new Hitomi
                {
                    id        = tk["id"].ToString(),
                    name      = tk["title"].ToString(),
                    type      = type,
                    page      = imgs.Count,
                    dir       = $"https://hiyobi.me/reader/{tk["id"]}",
                    thumb     = ImageProcessor.LoadWebImage($"https://cdn.hiyobi.me/tn/{tk["id"]}.jpg"),
                    thumbpath = $"https://cdn.hiyobi.me/tn/{tk["id"]}.jpg",
                    files     = imgs.ToList().Select(x => $"https://cdn.hiyobi.me/data/{tk["id"]}/{x["name"]}").ToArray(),
                    author    = string.Join(", ", tk["artists"].Select(x => x["display"].ToString())),
                    authors   = tk["artists"].Select(x => x["display"].ToString()).ToArray(),
                    Json      = tk//tk.ToString()
                };
                foreach (JToken tags in tk["tags"])
                {
                    Tag tag = new Tag();
                    if (tags["value"].ToString().Contains(":"))
                    {
                        tag.types = (Tag.Types)Enum.Parse(typeof(Tag.Types), tags["value"].ToString().Split(':')[0]);
                    }
                    else
                    {
                        tag.types = Tag.Types.tag;
                    }
                    tag.name = tags["display"].ToString();
                    h.tags.Add(tag);
                }
                update(h,
                       jobject["list"].ToList().IndexOf(tk),
                       jobject["list"].Count());
            }
            end();
        }
예제 #11
0
        private async void Hitomi_Search_TagOnly_Button_Click(object sender, RoutedEventArgs e)
        {
            string[] tags     = Hitomi_Search_TagOnly_Text.Text.Split(' ');
            string[] tagstart = Enum.GetNames(typeof(Tag.Types));
            tags = tags.Where(x => HiyobiTags.Tags.Select(y => y.name).Contains(x))
                   .Where(x => tagstart.Any(x.ToLower().StartsWith)).ToArray();
            if (tags.Length <= 0)
            {
                MessageBox.Show("검색 가능한 태그가 없습니다.");
                return;
            }
            List <int> idlist = new List <int>();
            int        index  = GetPage();

            foreach (string tag in tags)
            {
                InternetP parser = new InternetP();
                parser.url   = $"https://ltn.hitomi.la/tag/{tag}-all.nozomi";
                parser.index = index - 1;
                parser.count = (int)1000;
                int[] ids = parser.ByteArrayToIntArray(await parser.LoadNozomi());
                idlist = idlist.Concat(ids).ToList();
            }
            List <int> new_idlist = new List <int>();

            for (int i = 0; i < idlist.Count; i++)
            {
                int count = idlist.Count(y => y == idlist[i]);
                if (count == tags.Length)
                {
                    new_idlist.Add(idlist[i]);
                }
                if (new_idlist.Count >= (int)Page_itemCount)
                {
                    break;
                }
            }
            //idlist = idlist.Where(x => idlist.Count(y => y == x) == tags.Length).ToList();
            //_ = idlist;
            MainPanel.Children.Clear();
            LabelSetup();
            HitomiLoader hitomi = new HitomiLoader();

            hitomi.FastDefault();
            hitomi.FastParser(new_idlist.ToArray());
        }
예제 #12
0
        public async void Test()
        {
            Hitomi.HTag tag    = Hitomi.HTag.Parse("artist:2gou");
            InternetP   parser = new InternetP();

            byte[] data = await parser.LoadNozomiTag(tag.type.ToString(), tag.tag, false, 0, 9999);

            int[] ids;
            if (tag.type == Hitomi.HTag.TType.artists.Name)
            {
                ids = parser.ByteArrayToIntArrayBig(data);
            }
            else
            {
                ids = parser.ByteArrayToIntArrayBig(data);
            }
            Console.WriteLine(ids);
        }
예제 #13
0
        public async void Parser()
        {
            InternetP parser = new InternetP();

            parser.index = (index - 1) * count;
            parser.count = count;
            parser.url   = "https://ltn.hitomi.la/index-all.nozomi";
            int[] ids = parser.ByteArrayToIntArray(await parser.LoadNozomi());
            start(ids.Count());
            foreach (int id in ids)
            {
                parser.index = id;
                Hitomi h = await parser.HitomiData2();

                update(h, ids.ToList().IndexOf(id), ids.Count());
            }
            end();
        }
예제 #14
0
        public void FastParser(JObject jobject)
        {
            start(jobject["list"].Count());
            JArray arr = jobject["list"] as JArray;

            for (int i = 0; i < arr.Count; i++)
            {
                Hitomi h = new InternetP().HiyobiParse(arr[i]);
                h.type = Hitomi.Type.Hiyobi;
                Config config = new Config();
                config.Load();
                if (!config.ArrayValue <string>(Settings.except_tags).Any(x => h.tags.Select(y => y.name).Contains(x)) || !(config.BoolValue(Settings.block_tags) ?? false))
                {
                    update(h, i, arr.Count);
                }
            }
            end();
        }
예제 #15
0
        private async void FavoriteBtn_Click(object sender, RoutedEventArgs e)
        {
            MainPanel.Children.Clear();
            label.Visibility = Visibility.Visible;
            label.FontSize   = 100;
            Config cfg = new Config();

            cfg.Load();
            List <string> favs = cfg.ArrayValue <string>(Settings.favorites).ToList();

            favs = favs.Where(x => Directory.Exists(x) || x.isUrl()).Distinct().ToList();
            InternetP parser = new InternetP();

            parser.start  = (int count) => label.Content = "0/" + count;
            parser.update = (Hitomi h, int index, int max) =>
            {
                label.Content = $"{index}/{max}";
                MainPanel.Children.Add(new HitomiPanel(h, this));
            };
            parser.end = () => label.Visibility = Visibility.Collapsed;
            await parser.LoadCompre(favs);

            label.Visibility = Visibility.Collapsed;
        }
예제 #16
0
        public async void FastParser()
        {
            InternetP parser = new InternetP();

            parser.index = (index - 1) * count;
            parser.count = count;
            parser.url   = "https://ltn.hitomi.la/index-all.nozomi";
            int[] ids = parser.ByteArrayToIntArray(await parser.LoadNozomi());
            FastParser(ids);

            /*
             * start(ids.Count());
             * for (int i = 0; i < ids.Length; i++)
             * {
             *  InternetP parser2 = new InternetP();
             *  parser2.index = ids[i];
             *  Hitomi h = await parser2.HitomiData();
             *  h.type = Hitomi.Type.Hitomi;
             *  h.id = ids[i].ToString();
             *  update(h, i, ids.Count());
             * }
             * end();
             */
        }
예제 #17
0
        private async void Search_Button_Click(object sender, RoutedEventArgs e)
        {
            string SearchText = Search_Text.Text;
            int    number     = 0;

            if (int.TryParse(SearchText, out number))
            {
                MainPanel.Children.Clear();
                InternetP            parser = new InternetP(index: number);
                Tuple <bool, Hitomi> data   = await parser.isHiyobiData();

                bool   result = data.Item1;
                Hitomi h      = data.Item2;
                if (!result)
                {
                    h = await parser.HitomiData();
                }
                MainPanel.Children.Add(new HitomiPanel(h, this, true));
            }
            else
            {
                File_Search_Button_Click(sender, e);
            }
        }
예제 #18
0
 public void TagCache()
 {
     if (HiyobiTags.Tags == null)
     {
         HiyobiTags.LoadTags();
     }
     try
     {
         List <Hitomi.HTag> tags        = HiyobiTags.Tags;
         Dispatcher         patcher     = Global.dispatcher;
         ProgressBox        progressBox = null;
         patcher.Invoke(() => {
             progressBox       = new ProgressBox();
             progressBox.Title = "태그 캐시 다운로드";
             progressBox.Show();
             progressBox.ProgressBar.Maximum = tags.Count;
         });
         for (int i = 0; i < tags.Count; i++)
         {
             Hitomi.HTag tag = tags[i];
             Thread      th  = new Thread(new ThreadStart(async() =>
             {
                 try
                 {
                     string dir  = Path.Combine(rootDir, tag.type.ToString());
                     string file = Path.Combine(dir, tag.tag + ".json");
                     if (!Directory.Exists(dir))
                     {
                         Directory.CreateDirectory(dir);
                     }
                     if (File.Exists(file))
                     {
                         //patcher.Invoke(() => progressBox.ProgressBar.Value++);
                         return;
                     }
                     InternetP parser = new InternetP();
                     int[] ids        = parser.ByteArrayToIntArrayBig(await parser.LoadNozomiTag(tag.type.ToString(), tag.tag, false, 0, 9999));
                     JArray arr       = JArray.FromObject(ids);
                     File.WriteAllText(file, arr.ToString());
                     Console.WriteLine("{0}/{1}: {2}", i, tags.Count, tag.full);
                 }
                 catch (IOException) { Console.WriteLine("Faild {0}/{1}: {2}", i, tags.Count, tag.full); }
                 catch (Exception ex) { Console.WriteLine("Error {0} : {1}", tag.full, ex.Message); }
                 finally
                 {
                     patcher.Invoke(() =>
                     {
                         progressBox.ProgressBar.Value++;
                         if (progressBox.ProgressBar.Value == progressBox.ProgressBar.Maximum)
                         {
                             progressBox.Close();
                             MessageBox.Show("캐시 다운로드가 끝났습니다.");
                         }
                     });
                 }
             }));
             th.Start();
         }
     }
     catch (Exception ex) { Console.WriteLine(ex.Message); }
 }
예제 #19
0
        public void Search()
        {
            InternetP parser = new InternetP(keyword: text.Split(' ').ToList(), index: index);

            parser.HiyobiSearch(data => new InternetP(data: data).ParseJObject(Parser));
        }
예제 #20
0
        public override void DownloadImage_Click(object sender, RoutedEventArgs e)
        {
            base.DownloadImage_Click(sender, e);
            string filename = CF.File.GetDownloadTitle(CF.File.SaftyFileName(h.name));

            for (int i = 0; i < h.files.Length; i++)
            {
                Hitomi.HFile file = h.files[i];
                WebClient    wc   = new WebClient();
                wc.Headers.Add("referer", "https://hitomi.la/");
                string folder = Global.config.download_folder.Get <string>();
                if (!File.Exists($"{AppDomain.CurrentDomain.BaseDirectory}/{folder}/{filename}/{i}.jpg"))
                {
                    bool fileen = Global.config.download_file_encrypt.Get <bool>();
                    h.FileInfo.encrypted = fileen;
                    string path = $"{AppDomain.CurrentDomain.BaseDirectory}/{folder}/{filename}/{file.name}.{InternetP.GetDirFromHFileS(file)}.lock";
                    if (fileen)
                    {
                        FileEncrypt.DownloadAsync(wc, new Uri(file.url), path + ".lock");
                    }
                    else
                    {
                        wc.DownloadFileAsync(new Uri(file.url), path);
                    }
                }
            }
        }
예제 #21
0
        public void HitomiSearch()
        {
            List <int> idlist    = new List <int>();
            int        compcount = 0;

            if (cache.Keys.Any(x => x.ItemsEqual(tags)))
            {
                string[] key = cache.Keys.Where(x => x.ItemsEqual(tags)).First();
                this.start(0);
                idlist    = cache[key].ToList();
                compcount = tags.Length;
            }
            else
            {
                List <Task> tasks = new List <Task>();
                this.start(tags.Length);
                Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
                foreach (string tag in tags)
                {
                    Hitomi.HTag tag2 = Hitomi.HTag.Parse(tag);
                    string      path = Path.Combine(Global.rootDir, "Cache", tag2.type, tag2.tag + ".json");
                    if (Global.config.cache_search.Get <bool>())
                    {
                        if (File.Exists(path))
                        {
                            JArray arr = JArray.Parse(File.ReadAllText(path));
                            int[]  ids = arr.Select(x => int.Parse(x.ToString())).ToArray();
                            idlist = idlist.Concat(ids).ToList();
                            compcount++;
                            continue;
                        }
                    }
                    Thread th = new Thread(new ThreadStart(async() =>
                    {
                        int[] ids;
                        InternetP parser = new InternetP();
                        parser.index     = index - 1;
                        parser.Count     = search_count;
                        if (HiyobiTags.Tags.Select(y => y.full).Contains(tag))
                        {
                            try
                            {
                                ids = parser.ByteArrayToIntArrayBig(await parser.LoadNozomiTag(tag2.type.ToString(), tag2.tag, range: !Global.config.cache_search.Get <bool>(), start: 0, end: 99));
                            }
                            catch
                            {
                                ids = new int[0];
                            }
                        }
                        else
                        {
                            ids = await parser.LoadQuery(tag);
                        }
                        if (Global.config.cache_search.Get <bool>() && !File.Exists(path))
                        {
                            if (!Directory.Exists(Path.GetDirectoryName(path)))
                            {
                                Directory.CreateDirectory(Path.GetDirectoryName(path));
                            }
                            File.WriteAllText(path, JArray.FromObject(ids).ToString());
                        }
                        dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
                                                                                idlist = idlist.Concat(ids).ToList()));
                        compcount++;
                        dispatcher.Invoke(() => update(compcount, tags.Length));
                    }));
                    th.Start();
                }
            }
            int start     = (index - 1) * itemCount;
            int PageCount = start + itemCount;

            Task.Factory.StartNew(() =>
            {
                while (compcount != tags.Length)
                {
                }
                if (!cache.Keys.Any(x => x.ItemsEqual(tags)))
                {
                    cache.Add(tags, idlist.ToArray());
                }
                List <int> new_idlist = new List <int>();
                for (int i = 0; i < idlist.Count; i++)
                {
                    int count = idlist.Count(y => y == idlist[i]);
                    if (count == tags.Length)
                    {
                        new_idlist.Add(idlist[i]);
                    }
                    if (new_idlist.Count >= PageCount)
                    {
                        break;
                    }
                }
                new_idlist = new_idlist.Skip(start).ToList();
                Global.dispatcher.Invoke(delegate
                {
                    HitomiLoader hitomi = new HitomiLoader();
                    hitomi.Default();
                    LoaderDefaults.Hitomis.Setup(hitomi);
                    hitomi.Parser(new_idlist.ToArray());
                });
            });
        }