Beispiel #1
0
 public void AddRange(MoeItems items)
 {
     foreach (var moeItem in items)
     {
         Add(moeItem);
     }
 }
Beispiel #2
0
        public async Task <MoeItems> GetRealPageImagesAsyncFromXml(SearchPara para, CancellationToken token)
        {
            var client = new NetOperator(Settings).Client;
            var query  = GetPageQuery(para);
            var xmlRes = await client.GetAsync(query, token);

            var xmlStr = await xmlRes.Content.ReadAsStreamAsync();

            var xml        = XDocument.Load(xmlStr);
            var imageItems = new MoeItems();

            if (xml.Root == null)
            {
                return(imageItems);
            }
            foreach (var post in xml.Root.Elements())
            {
                token.ThrowIfCancellationRequested();
                var img  = new MoeItem(this, para);
                var tags = post.Attribute("tags")?.Value ?? "";
                foreach (var tag in tags.Split(' '))
                {
                    if (!tag.IsEmpty())
                    {
                        img.Tags.Add(tag.Trim());
                    }
                }

                img.Id         = post.Attribute("id")?.Value.ToInt() ?? 0;
                img.Width      = post.Attribute("width")?.Value.ToInt() ?? 0;
                img.Height     = post.Attribute("height")?.Value.ToInt() ?? 0;
                img.Uploader   = post.Attribute("author")?.Value;
                img.Source     = post.Attribute("source")?.Value;
                img.IsExplicit = post.Attribute("rating")?.Value.ToLower() != "s";
                img.DetailUrl  = GetDetailPageUrl(img);
                img.Date       = post.Attribute("created_at")?.Value.ToDateTime();
                if (img.Date == null)
                {
                    img.DateString = post.Attribute("created_at")?.Value;
                }
                img.Score = post.Attribute("score")?.Value.ToInt() ?? 0;
                img.Urls.Add(1, $"{UrlPre}{post.Attribute("preview_url")?.Value}", GetThumbnailReferer(img));
                img.Urls.Add(2, $"{UrlPre}{post.Attribute("sample_url")?.Value}", GetThumbnailReferer(img));
                img.Urls.Add(3, $"{UrlPre}{post.Attribute("jpeg_url")?.Value}", GetThumbnailReferer(img));
                img.Urls.Add(4, $"{UrlPre}{post.Attribute("file_url")?.Value}", img.DetailUrl);
                img.OriginString = $"{post}";
                if (GetDetailTaskFunc != null)
                {
                    img.GetDetailTaskFunc = async() => await GetDetailTaskFunc(img, para, token);
                }
                imageItems.Add(img);
            }

            var count  = xml.Root.Attribute("count")?.Value.ToInt();
            var offset = xml.Root.Attribute("offset")?.Value.ToInt();

            Extend.ShowMessage($"共搜索到{count}张图片,当前第{offset+1}张,第{para.PageIndex}页,共{count / para.Count}页", null, Extend.MessagePos.InfoBar);
            return(imageItems);
        }
Beispiel #3
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net?.HttpClientHandler?.CookieContainer == null)
            {
                Net = new NetOperator(Settings, HomeUrl);
                Net.HttpClientHandler.AllowAutoRedirect = true;
                Net.HttpClientHandler.UseCookies        = true;
                var cc = GetCookies();
                if (cc == null)
                {
                    Extend.ShowMessage("需要重新登录Pixiv站点", null, Extend.MessagePos.Window);
                    Net = null;
                    return(null);
                }
                Net.HttpClientHandler.CookieContainer = cc;
                Net.SetTimeOut(40);
            }
            else
            {
                Net = Net.CloneWithOldCookie();
            }

            var imgs = new MoeItems();

            switch ((SearchTypeEnum)para.SubMenuIndex)
            {
            case SearchTypeEnum.TagOrNew:
                await SearchByNewOrTag(imgs, para, token);

                break;

            case SearchTypeEnum.Author:     // 作者 member id  word = "4338012"; // test
                if (para.Keyword.ToInt() == 0)
                {
                    Extend.ShowMessage("参数错误,必须在关键词中指定画师 id(纯数字)", null, Extend.MessagePos.Window);
                }
                else
                {
                    await SearchByAuthor(imgs, para.Keyword.Trim(), para, token);
                }
                break;

            case SearchTypeEnum.Rank:
                await SearchByRank(imgs, para, token);

                break;
            }

            token.ThrowIfCancellationRequested();
            return(imgs);
        }
Beispiel #4
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var imgs = new MoeItems();

            if (para.Keyword.IsEmpty())
            {
                await SearchByNewOrHot(para, token, imgs);
            }
            else
            {
                await SearchByKeyword(para, token, imgs);
            }
            return(imgs);
        }
Beispiel #5
0
        public async Task <MoeItems> GetRealPageImagesAsyncFromJson(SearchPara para, CancellationToken token)
        {
            var list = await new NetOperator(Settings).GetJsonAsync(GetPageQuery(para), token);

            return(await Task.Run(() =>
            {
                token.ThrowIfCancellationRequested();
                var imageItems = new MoeItems();
                if (list == null)
                {
                    return imageItems;
                }
                foreach (var item in list)
                {
                    token.ThrowIfCancellationRequested();
                    var img = new MoeItem(this, para);
                    img.Width = $"{item.image_width}".ToInt();
                    img.Height = $"{item.image_height}".ToInt();
                    img.Id = $"{item.id}".ToInt();
                    img.Score = $"{item.score}".ToInt();
                    img.Uploader = $"{item.uploader_name}";
                    foreach (var tag in $"{item.tag_string}".Split(' ').SkipWhile(string.IsNullOrWhiteSpace))
                    {
                        img.Tags.Add(tag.Trim());
                    }

                    img.IsExplicit = $"{item.rating}" == "e";
                    img.DetailUrl = GetDetailPageUrl(img);
                    img.Date = $"{item.created_at}".ToDateTime();
                    if (img.Date == null)
                    {
                        img.DateString = $"{item.created_at}";
                    }
                    img.Urls.Add(1, $"{item.preview_file_url}", GetThumbnailReferer(img));
                    img.Urls.Add(2, $"{item.large_file_url}", GetThumbnailReferer(img));
                    img.Urls.Add(4, $"{item.file_url}", img.DetailUrl);
                    img.Copyright = $"{item.tag_string_copyright}";
                    img.Character = $"{item.tag_string_character}";
                    img.Artist = $"{item.tag_string_artist}";
                    img.OriginString = $"{item}";
                    if (GetDetailTaskFunc != null)
                    {
                        img.GetDetailTaskFunc = async() => await GetDetailTaskFunc(img, para, token);
                    }
                    imageItems.Add(img);
                }

                return imageItems;
            }, token));
        }
Beispiel #6
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (!_isIdolLogin)
            {
                await LoginAsync(token);
            }
            if (!_isIdolLogin)
            {
                return(new MoeItems());
            }
            var query = $"{_idolQuery}page={para.PageIndex}&limit={para.Count}&tags={para.Keyword.ToEncodedUrl()}";
            var list  = await Net.GetJsonAsync(query, token);

            if (list == null)
            {
                return new MoeItems {
                           Message = "获取Json失败"
                }
            }
            ;
            var          imgs  = new MoeItems();
            const string https = "https:";

            foreach (var item in list)
            {
                var img = new MoeItem(this, para);

                img.Width     = $"{item.width}".ToInt();
                img.Height    = $"{item.height}".ToInt();
                img.Id        = $"{item.id}".ToInt();
                img.Score     = $"{item.fav_count}".ToInt();
                img.Uploader  = $"{item.uploader_name}";
                img.DetailUrl = $"{HomeUrl}/post/show/{img.Id}";
                img.Date      = $"{item.created_at?.s}".ToDateTime();
                foreach (var tag in Extend.GetList(item.tags))
                {
                    img.Tags.Add($"{tag.name}");
                }
                img.IsExplicit = $"{item.rating}" == "e";
                img.Net        = Net.CloneWithOldCookie();
                img.Urls.Add(1, $"{https}{item.preview_url}", img.DetailUrl);
                img.Urls.Add(2, $"{https}{item.sample_url}", img.DetailUrl);
                img.Urls.Add(4, $"{https}{item.file_url}", img.DetailUrl);
                img.OriginString = $"{item}";
                imgs.Add(img);
            }

            return(imgs);
        }
Beispiel #7
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var          imgs = new MoeItems();
            const string api  = "https://capi-v2.sankakucomplex.com";
            const string beta = "https://beta.sankakucomplex.com";

            Net = Net == null ? new NetDocker(Settings, api) : Net.CloneWithOldCookie();

            Net.SetReferer(beta);
            var pairs = new Pairs
            {
                { "lang", "en" },
                { "page", $"{para.PageIndex}" },
                { "limit", $"{para.Count}" },
                { "hide_posts_in_books", "in-larger-tags" },
                { "default_threshold", "1" },
                { "tags", para.Keyword.ToEncodedUrl() }
            };
            var json = await Net.GetJsonAsync($"{api}/posts", token, pairs);

            foreach (var jitem in Extend.CheckListNull(json))
            {
                var img = new MoeItem(this, para)
                {
                    Net    = Net.CloneWithOldCookie(),
                    Id     = $"{jitem.id}".ToInt(),
                    Width  = $"{jitem.width}".ToInt(),
                    Height = $"{jitem.height}".ToInt(),
                    Score  = $"{jitem.total_score}".ToInt()
                };
                img.Urls.Add(1, $"{jitem.preview_url}", beta);
                img.Urls.Add(2, $"{jitem.sample_url}", beta);
                img.Urls.Add(4, $"{jitem.file_url}", $"{beta}/post/show/{img.Id}");
                img.IsExplicit = $"{jitem.rating}" != "s";
                img.Date       = $"{jitem.created_at?.s}".ToDateTime();
                img.Uploader   = $"{jitem.author?.name}";
                img.DetailUrl  = $"{beta}/post/show/{img.Id}";
                foreach (var tag in Extend.CheckListNull(jitem.tags))
                {
                    img.Tags.Add($"{tag.name_en}");
                }

                img.OriginString = $"{jitem}";
                imgs.Add(img);
            }

            return(imgs);
        }
Beispiel #8
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var pairs = new Pairs
            {
                { "page", $"{para.PageIndex}" },
                { "limit", $"{para.Count}" },
                { "tags", para.Keyword.ToEncodedUrl() }
            };
            var query = $"{HomeUrl}/post.json{pairs.ToPairsString()}";
            var net   = new NetOperator(Settings);
            var json  = await net.GetJsonAsync(query, token);

            var imageItems = new MoeItems();

            foreach (var item in Extend.GetList(json))
            {
                var img = new MoeItem(this, para);
                img.Width      = $"{item.width}".ToInt();
                img.Height     = $"{item.height}".ToInt();
                img.Id         = $"{item.id}".ToInt();
                img.Score      = $"{item.score}".ToInt();
                img.Uploader   = $"{item.author}";
                img.UploaderId = $"{item.creator_id}";
                foreach (var tag in $"{item.tags}".Split(' ').SkipWhile(string.IsNullOrWhiteSpace))
                {
                    img.Tags.Add(tag.Trim());
                }

                img.IsExplicit = $"{item.rating}" == "e";
                img.DetailUrl  = $"{HomeUrl}/post/show/{img.Id}";
                img.Date       = $"{item.created_at}".ToDateTime();
                if (img.Date == null)
                {
                    img.DateString = $"{item.created_at}";
                }
                img.Urls.Add(1, $"{item.preview_url}");
                img.Urls.Add(2, $"{item.sample_url}");
                img.Urls.Add(4, $"{item.file_url}", img.DetailUrl);
                img.Source       = $"{item.source}";
                img.OriginString = $"{item}";
                imageItems.Add(img);
            }

            return(imageItems);
        }
Beispiel #9
0
    public async Task SearchByKeyword(SearchPara para, MoeItems imgs, CancellationToken token)
    {
        const string api              = "https://api.bilibili.com/x/web-interface/search/type";
        var          newOrHotOrder    = para.Lv3MenuIndex == 0 ? "pubdate" : "stow";
        var          drawOrPhotoCatId = para.Lv2MenuIndex == 0 ? "1" : "2";
        var          pairs            = new Pairs
        {
            { "search_type", "photo" },
            { "page", $"{para.PageIndex}" },
            { "order", newOrHotOrder },
            { "keyword", para.Keyword.ToEncodedUrl() },
            { "category_id", drawOrPhotoCatId }
        };
        var net  = new NetOperator(Settings, this);
        var json = await net.GetJsonAsync(api, pairs, token : token);

        if (json == null)
        {
            return;
        }
        foreach (var item in Ex.GetList(json.data?.result))
        {
            var img = new MoeItem(this, para);
            img.Urls.Add(1, $"{item.cover}@336w_336h_1e_1c.jpg");
            img.Urls.Add(2, $"{item.cover}@1024w_768h.jpg");
            img.Urls.Add(4, $"{item.cover}");
            img.Id                = $"{item.id}".ToInt();
            img.Score             = $"{item.like}".ToInt();
            img.Rank              = $"{item.rank_offset}".ToInt();
            img.Title             = $"{item.title}";
            img.Uploader          = $"{item.uname}";
            img.GetDetailTaskFunc = async cancellationToken =>
                                    await GetSearchByKeywordDetailTask(img, para, cancellationToken);

            img.DetailUrl    = $"https://h.bilibili.com/{img.Id}";
            img.OriginString = $"{item}";
            imgs.Add(img);
        }

        var c = $"{json.data?.numResults}".ToInt();

        Ex.ShowMessage($"共搜索到{c}张,已加载至{para.PageIndex}页,共{c / para.CountLimit}页", null, Ex.MessagePos.InfoBar);
    }
Beispiel #10
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                Net = new NetOperator(Settings, HomeUrl);
            }
            const string api   = "https://api.yuriimg.com/posts";
            var          pairs = new Pairs
            {
                { "page", $"{para.PageIndex}" },
                { "tags", para.Keyword.ToEncodedUrl() }
            };
            var json = await Net.GetJsonAsync(api, token, pairs);

            if (json?.posts == null)
            {
                return(null);
            }
            var imgs = new MoeItems();

            foreach (var post in json.posts)
            {
                var img = new MoeItem(this, para);
                img.IsExplicit = $"{post.rating}" == "e";
                if (CurrentSiteSetting.LoginCookie.IsEmpty() && img.IsExplicit)
                {
                    continue;
                }
                img.Id     = $"{post.pid}".ToInt();
                img.Sid    = $"{post.id}";
                img.Width  = $"{post.width}".ToInt();
                img.Height = $"{post.height}".ToInt();
                img.Urls.Add(1, $"https://i.yuriimg.com/{post.src}/yuriimg.com%20{post.id}%20contain.jpg");
                img.DetailUrl         = $"{HomeUrl}/show/{post.id}";
                img.GetDetailTaskFunc = async() => await GetDetailTask(img, $"{post.id}", token);

                img.OriginString = $"{post}";

                imgs.Add(img);
            }

            return(imgs);
        }
 public void AddImages(MoeItems imgs)
 {
     foreach (var img in imgs)
     {
         var itemCtrl = new ImageControl(Settings, img);
         itemCtrl.DownloadButton.Click    += (sender, args) => { ImageItemDownloadButtonClicked?.Invoke(itemCtrl.ImageItem, itemCtrl.PreviewImage.Source); };
         itemCtrl.PreviewButton.Click     += (sender, args) => { MoeItemPreviewButtonClicked?.Invoke(itemCtrl.ImageItem, itemCtrl.PreviewImage.Source); };
         itemCtrl.MouseEnter              += (sender, args) => MouseOnImageControl = itemCtrl;
         itemCtrl.ImageCheckBox.Checked   += (sender, args) => SelectedImageControls.Add(itemCtrl);
         itemCtrl.ImageCheckBox.Unchecked += (sender, args) => SelectedImageControls.Remove(itemCtrl);
         ImageItemsWrapPanel.Children.Add(itemCtrl);
         itemCtrl.Sb("ShowSb").Begin();
         if (ImageLoadingPool.Count < Settings.MaxOnLoadingImageCount)
         {
             ImageLoadingPool.Add(itemCtrl);
         }
         else
         {
             ImageWaitForLoadingPool.Add(itemCtrl);
         }
         itemCtrl.MouseRightButtonUp += ItemCtrlOnMouseRightButtonUp;
     }
 }
Beispiel #12
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var          imgs = new MoeItems();
            const string api  = "https://capi-v2.sankakucomplex.com";
            const string beta = "https://beta.sankakucomplex.com";

            if (Net == null)
            {
                Net = new NetOperator(Settings, api);
                var cc = GetCookies();

                if (cc != null)
                {
                    Net.SetCookie(cc);
                }
            }
            else
            {
                Net.CloneWithOldCookie();
            }

            Net.SetReferer(beta);
            var pairs = new Pairs
            {
                { "lang", "en" },
                { "next", $"{para.NextPagePara}" },
                { "limit", $"{para.Count}" },
                { "hide_posts_in_books", "in-larger-tags" },
                { "default_threshold", "1" },
                { "tags", para.Keyword.ToEncodedUrl() }
            };
            var json = await Net.GetJsonAsync($"{api}/posts/keyset", token, pairs);

            para.NextPagePara = $"{json.meta.next}";
            foreach (var jitem in Extend.GetList(json.data))
            {
                var img = new MoeItem(this, para)
                {
                    Net    = Net.CloneWithOldCookie(),
                    Id     = $"{jitem.id}".ToInt(),
                    Width  = $"{jitem.width}".ToInt(),
                    Height = $"{jitem.height}".ToInt(),
                    Score  = $"{jitem.total_score}".ToInt()
                };
                img.Urls.Add(1, $"{jitem.preview_url}", beta);
                img.Urls.Add(2, $"{jitem.sample_url}", beta);
                img.Urls.Add(4, $"{jitem.file_url}", $"{beta}/post/show/{img.Id}");
                img.IsExplicit = $"{jitem.rating}" != "s";
                img.Date       = $"{jitem.created_at?.s}".ToDateTime();
                img.Uploader   = $"{jitem.author?.name}";
                img.DetailUrl  = $"{beta}/post/show/{img.Id}";
                if ($"{jitem.redirect_to_signup}".ToLower() == "true")
                {
                    img.Tip = "此图片需要登录查看";
                }
                foreach (var tag in Extend.GetList(jitem.tags))
                {
                    img.Tags.Add($"{tag.name_en}");
                }

                img.OriginString = $"{jitem}";
                imgs.Add(img);
            }

            return(imgs);
        }
Beispiel #13
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                Net = new NetOperator(Settings);
                Net.SetReferer(HomeUrl);
                await Net.Client.GetAsync(HomeUrl, token);
            }
            var size = "";

            if (para.IsFilterResolution)
            {
                var s = para.MinWidth > para.MinHeight ? para.MinWidth : para.MinHeight;
                size = $"{s}";
            }
            var orient = "";

            switch (para.Orientation)
            {
            case ImageOrientation.Portrait:
                orient = "p";
                break;

            case ImageOrientation.Landscape:
                orient = "l";
                break;
            }
            var pair = new Pairs
            {
                { "tags", para.Keyword.ToEncodedUrl() },
                { "size", size },
                { "orient", orient },
                { "page", $"{para.PageIndex}" }
            };
            var imageItems = new MoeItems();
            var json       = await Net.GetJsonAsync($"{HomeUrl}/index.json", token, pair);

            if (json?.images == null)
            {
                return(imageItems);
            }
            foreach (var image in json.images)
            {
                var img = new MoeItem(this, para);
                var id  = (int)image.id;
                img.Id = id;
                var sub = $"https://{id % 10}.s.kawaiinyan.com/i";
                img.Uploader = $"{image.user_name}";
                img.Source   = $"{image.adv_link}";
                img.Score    = (int)image.yes;
                var tags = $"{image.tags}";
                foreach (var s in tags.Split(','))
                {
                    if (s.IsEmpty())
                    {
                        continue;
                    }
                    img.Tags.Add(s);
                }
                var small = $"{image.small}";
                img.Urls.Add(1, $"{sub}{UrlInner($"{id}")}/small.{small}");
                var orig = $"{image.orig}";
                var big  = $"{image.big}";
                if (!orig.IsEmpty())
                {
                    img.Urls.Add(4, $"{sub}{UrlInner($"{id}")}/orig.{orig}");
                }
                else if (!big.IsEmpty())
                {
                    img.Urls.Add(4, $"{sub}{UrlInner($"{id}")}/big.{big}");
                }
                img.DetailUrl = $"{HomeUrl}/image?id={id}";

                img.Site         = this;
                img.OriginString = $"{image}";

                imageItems.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imageItems);
        }
Beispiel #14
0
        /// <summary>
        /// 搜索下一页
        /// </summary>
        public async Task SearchNextPageAsync(CancellationToken token)
        {
            var        newVPage = new SearchedPage(); // 建立虚拟页信息
            var        images   = new MoeItems();
            SearchPara tempPara;

            if (LoadedPages.Count == 0)
            {
                tempPara = CurrentSearchPara.Clone(); // 浅复制一份参数
                newVPage.LastRealPageIndex = tempPara.PageIndex;
                // 搜索起始页的所有图片(若网站查询参数有支持的条件过滤,则在搜索时就已自动过滤相关条件)
                var sb = new StringBuilder();
                sb.AppendLine($"正在搜索站点 {tempPara.Site.DisplayName} 第 {tempPara.PageIndex} 页图片");
                sb.Append($"(参数:kw:{(!tempPara.Keyword.IsEmpty() ? tempPara.Keyword : "N/A")},num:{tempPara.Count})");
                Extend.ShowMessage(sb.ToString(), null, Extend.MessagePos.Searching);
                var imagesOrg = await tempPara.Site.GetRealPageImagesAsync(tempPara, token);

                if (imagesOrg == null || imagesOrg.Count == 0)
                {
                    Extend.ShowMessage("无搜索结果", null, Extend.MessagePos.Searching);
                    return;
                }
                for (var i = 0; i < imagesOrg.Count; i++)
                {
                    var item = imagesOrg[i];
                    if (i < tempPara.Count)
                    {
                        images.Add(item);
                    }
                    else
                    {
                        newVPage.PreLoadNextPageItems.Add(item);
                        if (!newVPage.HasNextPage)
                        {
                            newVPage.HasNextPage = true;
                        }
                    }
                }
            }
            else if (!LoadedPages.Last().HasNextPage) // 若无下一页则返回
            {
                return;
            }
            else
            {
                tempPara           = CurrentSearchPara.Clone(); // 浅复制一份参数
                tempPara.PageIndex = LoadedPages.Last().LastRealPageIndex;

                // 若不是第一页则使用上一页搜索多出来的图片作为本页基数
                images = new MoeItems();
                for (var i = 0; i < LoadedPages.Last().PreLoadNextPageItems.Count; i++)
                {
                    var item = LoadedPages.Last().PreLoadNextPageItems[i];
                    if (i < tempPara.Count)
                    {
                        images.Add(item);
                    }
                    else
                    {
                        newVPage.PreLoadNextPageItems.Add(item);
                        newVPage.HasNextPage = true;
                    }
                }
            }

            Filter(images); // 本地过滤,images数量有可能减少

            // 进入 loop 循环
            var startTime = DateTime.Now;

            while (images.Count < tempPara.Count)                             // 当images数量不够搜索参数数量时循环
            {
                token.ThrowIfCancellationRequested();                         // 整体Task的取消Token,取消时会抛出异常
                tempPara.PageIndex++;                                         // 设置新搜索参数为下一页(真)
                tempPara.LastId            = images.LastOrDefault()?.Id ?? 0; // 设置新搜索参数为最后ID(真)
                newVPage.LastRealPageIndex = tempPara.PageIndex;
                var sb = new StringBuilder();
                sb.AppendLine($"正在搜索站点 {tempPara.Site.DisplayName} 第 {tempPara.PageIndex} 页图片");
                sb.AppendLine($"已获取第{tempPara.PageIndex - 1}页{images.Count}张图片,还需{tempPara.Count - images.Count}张");
                sb.Append($"(参数:kw:{(!tempPara.Keyword.IsEmpty() ? tempPara.Keyword : "N/A")},num:{tempPara.Count})");
                Extend.ShowMessage(sb.ToString(), null, Extend.MessagePos.Searching);
                var imagesNextRPage = await tempPara.Site.GetRealPageImagesAsync(tempPara, token); // 搜索下一页(真)的所有图片

                if (imagesNextRPage == null || imagesNextRPage.Count == 0)                         // 当下一页(真)的搜索到的未进行本地过滤图片数量为0时,表示已经搜索完了
                {
                    newVPage.HasNextPage       = false;                                            // 没有下一页
                    newVPage.LastRealPageIndex = tempPara.PageIndex;
                    break;
                }
                else // 当下一页(真)未过滤图片数量不为0时
                {
                    Filter(imagesNextRPage); // 本地过滤下一页(真)

                    foreach (var item in imagesNextRPage)
                    {
                        if (images.Count < tempPara.Count)
                        {
                            images.Add(item);                                // 添加图片数量直到够参数设定的图片数量为止
                        }
                        else
                        {
                            newVPage.PreLoadNextPageItems.Add(item);  // 多出来的图片存在另一个对象中,下一虚拟页可以调用
                        }
                    }
                    if (images.Count >= tempPara.Count)
                    {
                        break;                                 // 数量已够参数数量,当前虚拟页完成任务
                    }
                }
                if (DateTime.Now - startTime > TimeSpan.FromSeconds(30))
                {
                    break;                                                      // loop超时跳出循环(即使不够数量也跳出)
                }
            }
            token.ThrowIfCancellationRequested();
            // Load end
            newVPage.ImageItems = images;
            LoadedPages.Add(newVPage);
            if (images.Message != null)
            {
                Extend.ShowMessage(images.Message);
            }
            if (images.Ex != null)
            {
                Extend.ShowMessage(images.Ex.Message, images.Ex.ToString(), Extend.MessagePos.Window);
            }
            Extend.ShowMessage("搜索完毕", null, Extend.MessagePos.Searching);
        }
Beispiel #15
0
        /// <summary>
        /// 本地过滤图片
        /// </summary>
        public void Filter(MoeItems items)
        {
            if (items == null)
            {
                return;
            }
            var para = CurrentSearchPara;

            for (var i = 0; i < items.Count; i++)
            {
                var del   = false;
                var item  = items[i];
                var state = item.Site.SupportState;
                if (state.IsSupportRating) // 过滤r18评级图片
                {
                    if ((!Settings.IsXMode || !para.IsShowExplicit) && item.IsExplicit)
                    {
                        del = true;
                    }
                    if (Settings.IsXMode && para.IsShowExplicitOnly && item.IsExplicit == false)
                    {
                        del = true;
                    }
                }
                if (state.IsSupportResolution && para.IsFilterResolution) // 过滤分辨率
                {
                    if (item.Width < para.MinWidth || item.Height < para.MinHeight)
                    {
                        del = true;
                    }
                }
                if (state.IsSupportResolution) // 过滤图片方向
                {
                    switch (para.Orientation)
                    {
                    case ImageOrientation.Landscape:
                        if (item.Height >= item.Width)
                        {
                            del = true;
                        }
                        break;

                    case ImageOrientation.Portrait:
                        if (item.Height <= item.Width)
                        {
                            del = true;
                        }
                        break;
                    }
                }
                if (para.IsFilterFileType) // 过滤图片扩展名
                {
                    foreach (var s in para.FilterFileTypeText.Split(';'))
                    {
                        if (s.IsEmpty())
                        {
                            continue;
                        }
                        if (string.Equals(item.FileType, s, StringComparison.CurrentCultureIgnoreCase))
                        {
                            if (!para.IsFileTypeShowSpecificOnly)
                            {
                                del = true;
                            }
                        }
                        else if (para.IsFileTypeShowSpecificOnly)
                        {
                            del = true;
                        }
                    }
                }

                if (!del)
                {
                    continue;
                }
                items.RemoveAt(i);
                i--;
            }
        }
Beispiel #16
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            Net = Net == null ? new NetOperator(Settings, HomeUrl) : Net.CloneWithOldCookie();

            if (!IsLogin)
            {
                Extend.ShowMessage("MiniTokyo 正在自动登录中……", null, Extend.MessagePos.Searching);
                var accIndex = new Random().Next(0, _user.Length);
                var content  = new FormUrlEncodedContent(new Pairs
                {
                    { "username", _user[accIndex] },
                    { "password", _pass[accIndex] }
                });
                var p = await Net.Client.PostAsync("http://my.minitokyo.net/login", content, token);

                if (p.IsSuccessStatusCode)
                {
                    IsLogin = true;
                }
            }

            var    imgs = new MoeItems();
            string query;

            if (para.Keyword.IsEmpty()) // by new
            {
                // recent:
                // wall http://gallery.minitokyo.net/wallpapers?display=thumbnails&order=id&page=2
                // mobile http://gallery.minitokyo.net/mobile?order=id&display=thumbnails&page=2
                // indy http://gallery.minitokyo.net/indy-art?order=id&display=thumbnails&page=2
                // scan  http://gallery.minitokyo.net/scans?order=id&display=thumbnails&page=2

                // popular
                // wall http://gallery.minitokyo.net/wallpapers?order=favorites&display=thumbnails&page=2
                // scan http://gallery.minitokyo.net/scans?display=thumbnails&order=favorites&page=2
                query = $"{HomeGalleryUrl}/{GetSort(para)}?order={GetOrder(para)}&display=thumbnails&page={para.PageIndex}";
            }
            else
            {
                var q   = $"{HomeUrl}/search?q={para.Keyword}";
                var net = Net.CloneWithOldCookie();
                net.SetReferer(HomeUrl);
                net.HttpClientHandler.AllowAutoRedirect = false;
                var res = await net.Client.GetAsync(q, token);

                var loc303 = res.Headers.Location.OriginalString;
                var net2   = Net.CloneWithOldCookie();
                var doc1   = await net2.GetHtmlAsync($"{HomeUrl}{loc303}", token);

                var tabnodes = doc1.DocumentNode.SelectNodes("*//ul[@id='tabs']//a");
                var url      = tabnodes[1].Attributes["href"]?.Value;
                var reg      = new Regex(@"(?:^|\?|&)tid=(\d*)(?:&|$)");
                var tid      = reg.Match(url ?? "").Groups[0].Value;
                var indexs   = new [] { 1, 3, 1, 2 };
                query = $"{HomeBrowseUrl}/gallery{tid}index={indexs[para.SubMenuIndex]}&order={GetOrder(para)}&display=thumbnails";
            }

            var doc = await Net.GetHtmlAsync(query, token);

            var docnode = doc.DocumentNode;
            var empty   = docnode.SelectSingleNode("*//p[@class='empty']")?.InnerText.ToLower().Trim();

            if (empty == "no items to display")
            {
                return(imgs);
            }
            var wallNode = docnode.SelectSingleNode("*//ul[@class='scans']");
            var imgNodes = wallNode.SelectNodes(".//li");

            if (imgNodes == null)
            {
                return(imgs);
            }

            foreach (var node in imgNodes)
            {
                var img       = new MoeItem(this, para);
                var detailUrl = node.SelectSingleNode("a").Attributes["href"].Value;
                img.DetailUrl = detailUrl;
                img.Id        = detailUrl.Substring(detailUrl.LastIndexOf('/') + 1).ToInt();
                var imgHref   = node.SelectSingleNode(".//img");
                var sampleUrl = imgHref.Attributes["src"].Value;
                img.Urls.Add(1, sampleUrl, HomeUrl);
                //http://static2.minitokyo.net/thumbs/24/25/583774.jpg preview
                //http://static2.minitokyo.net/view/24/25/583774.jpg   sample
                //http://static.minitokyo.net/downloads/24/25/583774.jpg   full
                const string api2       = "http://static2.minitokyo.net";
                const string api        = "http://static.minitokyo.net";
                var          previewUrl = $"{api2}/view{sampleUrl.Substring(sampleUrl.IndexOf('/', sampleUrl.IndexOf(".net/", StringComparison.Ordinal) + 5))}";
                var          fileUrl    = $"{api}/downloads{previewUrl.Substring(previewUrl.IndexOf('/', previewUrl.IndexOf(".net/", StringComparison.Ordinal) + 5))}";
                img.Urls.Add(4, fileUrl, HomeUrl);
                img.Title    = node.SelectSingleNode("./p/a").InnerText.Trim();
                img.Uploader = node.SelectSingleNode("./p").InnerText.Delete("by ").Trim();
                var res  = node.SelectSingleNode("./a/img").Attributes["title"].Value;
                var resi = res?.Split('x');
                if (resi?.Length == 2)
                {
                    img.Width  = resi[0].ToInt();
                    img.Height = resi[1].ToInt();
                }
                img.OriginString = node.OuterHtml;
                imgs.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
Beispiel #17
0
        public async Task SearchByRank(MoeItems imgs, SearchPara para, CancellationToken token)
        {
            var modesR18 = new[] { "daily", "weekly", "male", "female" };
            var modes    = new[] { "daily", "weekly", "monthly", "rookie,", "original", "male", "female" };
            var mode     = IsR18 ? modesR18[para.Lv3MenuIndex] : modes[para.Lv3MenuIndex];

            if (IsR18)
            {
                mode += "_r18";
            }
            var contents = new[] { "all", "illust", "manga", "ugoira" };
            var content  = contents[para.Lv4MenuIndex];
            var referer  = $"{HomeUrl}/ranking.php?mode={mode}&content={content}";

            Net.SetReferer(referer);
            var q    = $"{HomeUrl}/ranking.php";
            var pair = new Pairs
            {
                { "mode", mode },
                { "content", content },
                { "date", para.Date == null ? "" : $"{para.Date:yyyyMMdd}" },
                { "p", $"{para.PageIndex}" },
                { "format", "json" }
            };
            var json = await Net.GetJsonAsync(q, token, pair);

            foreach (var illus in Extend.GetList(json?.contents))
            {
                var img = new MoeItem(this, para)
                {
                    Net = Net.CloneWithOldCookie(),
                    Id  = $"{illus.illust_id}".ToInt()
                };
                img.Urls.Add(1, $"{illus.url}", referer);
                img.Title       = $"{illus.title}";
                img.Uploader    = $"{illus.user_name}";
                img.UploaderId  = $"{illus.user_id}";
                img.Width       = $"{illus.width}".ToInt();
                img.Height      = $"{illus.height}".ToInt();
                img.DetailUrl   = $"{HomeUrl}/artworks/{img.Id}";
                img.ImagesCount = $"{illus.illust_page_count}".ToInt();
                img.Score       = $"{illus.rating_count}".ToInt();
                img.Rank        = $"{illus.rank}".ToInt();
                if (img.Rank > 0)
                {
                    var yes = $"{illus.yes_rank}".ToInt();
                    img.Tip = yes == 0 ? "首次登场" : $"之前#{yes}";
                    if (yes == 0)
                    {
                        img.TipHighLight = true;
                    }
                }
                foreach (var tag in Extend.GetList(illus.tags))
                {
                    img.Tags.Add($"{tag}");
                }

                img.Date = GetDateFromUrl($"{illus.url}");
                if ($"{illus.illust_type}" == "2")
                {
                    img.GetDetailTaskFunc = async() => await GetUgoiraDetailPageTask(img);
                }
                else
                {
                    img.GetDetailTaskFunc = async() => await GetDetailPageTask(img, para);
                }

                img.OriginString = $"{illus}";
                imgs.Add(img);
            }

            var count = $"{json?.rank_total}".ToInt();

            Extend.ShowMessage($"共{count}张,当前日期:{json?.date}", null, Extend.MessagePos.InfoBar);
        }
Beispiel #18
0
        public async Task SearchByNewOrTag(MoeItems imgs, SearchPara para, CancellationToken token)
        {
            string referer, api; Pairs pairs;
            var    isIllust = para.Lv3MenuIndex == 0;

            if (para.Keyword.IsEmpty()) // new
            {
                api     = $"{HomeUrl}/ajax/illust/new";
                referer = isIllust ? $"{HomeUrl}/new_illust.php" : $"{HomeUrl}/new_illust.php?type=manga";
                pairs   = new Pairs
                {
                    { "lastId", para.LastId == 0 ? "" : $"{para.LastId}" },
                    { "limit", $"{para.Count}" },
                    { "type", isIllust ? "illust" : "manga" },
                    { "r18", R18Query }
                };
            }
            else // tag
            {
                api     = $"{HomeUrl}/ajax/search/{(isIllust ? "illustrations" : "manga")}/{para.Keyword.ToEncodedUrl()}";
                referer = $"{HomeUrl}tags/{para.Keyword.ToEncodedUrl()}/{(isIllust ? "illustrations" : "manga")}?mode={R18ModeQuery}&s_mode=s_tag";
                pairs   = new Pairs
                {
                    { "word", para.Keyword.ToEncodedUrl() },
                    { "order", "date" },
                    { "mode", R18ModeQuery },
                    { "p", $"{para.PageIndex}" },
                    { "s_mode", "s_tag" },
                    { "type", isIllust ? "illust_and_ugoira" : "manga" }
                };
            }

            Net.SetReferer(referer);
            var json = await Net.GetJsonAsync(api, token, pairs);

            var list = para.Keyword.IsEmpty()
                ? (json?.body?.illusts)
                : (isIllust ? (json?.body?.illust?.data) : (json?.body?.manga?.data));

            foreach (var illus in Extend.GetList(list))
            {
                var img = new MoeItem(this, para);
                img.Site = this;
                img.Net  = Net.CloneWithOldCookie();
                img.Id   = $"{illus.id}".ToInt();
                img.Urls.Add(new UrlInfo(1, $"{illus.url}", $"{HomeUrl}/new_illust.php"));
                img.Title       = $"{illus.title}";
                img.Uploader    = $"{illus.userName}";
                img.UploaderId  = $"{illus.userId}";
                img.Width       = $"{illus.width}".ToInt();
                img.Height      = $"{illus.height}".ToInt();
                img.DetailUrl   = $"{HomeUrl}/artworks/{img.Id}";
                img.ImagesCount = $"{illus.pageCount}".ToInt();
                foreach (var tag in Extend.GetList(illus.tags))
                {
                    img.Tags.Add($"{tag}");
                }
                img.Date = GetDateFromUrl($"{illus.url}");
                if ($"{illus.illustType}" == "2")
                {
                    img.GetDetailTaskFunc = async() => await GetUgoiraDetailPageTask(img);
                }
                else
                {
                    img.GetDetailTaskFunc = async() => await GetDetailPageTask(img, para);
                }
                img.OriginString = $"{illus}";
                imgs.Add(img);
            }
            if (!para.Keyword.IsEmpty() && json != null)
            {
                var count = $"{json?.body?.illust?.total}".ToInt();
                Extend.ShowMessage($"共搜索到{count}张图片,当前已加载至第{para.PageIndex}页,共{count / 60}页", null, Extend.MessagePos.InfoBar);
            }
        }
Beispiel #19
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                Net = new NetDocker();
            }

            //http://worldcosplay.net/api/photo/list?page=3&limit=2&sort=created_at&direction=descend
            var url   = $"{HomeUrl}/api/photo/list";
            var pairs = new Pairs
            {
                { "page", $"{para.PageIndex}" },
                { "limit", $"{para.Count}" },
                { "sort", "created_at" },
                { "direction", "descend" }
            };

            if (!para.Keyword.IsEmpty())
            {
                //http://worldcosplay.net/api/photo/search?page=2&rows=48&q=%E5%90%8A%E5%B8%A6%E8%A2%9C%E5%A4%A9%E4%BD%BF
                url   = $"{HomeUrl}/api/photo/search";
                pairs = new Pairs
                {
                    { "page", $"{para.PageIndex}" },
                    { "rows", $"{para.Count}" },
                    { "q", para.Keyword.ToEncodedUrl() }
                };
            }

            // images

            var imgs = new MoeItems();
            var json = await Net.GetJsonAsync(url, token, pairs);

            if (json?.list == null)
            {
                return(imgs);
            }
            foreach (var jitem in json.list)
            {
                var img = new MoeItem(this, para)
                {
                    Uploader  = $"{jitem.member?.nickname}",
                    DetailUrl = $"{HomeUrl}{jitem.photo?.url}",
                    Id        = (int)(jitem.photo?.id ?? 0d)
                };
                img.Urls.Add(1, $"{jitem.photo?.thumbnail_url_display}", HomeUrl);
                img.Urls.Add(3, $"{jitem.photo?.large_url}", img.DetailUrl);
                img.Score = $"{jitem.photo?.good_cnt}".ToInt();
                img.Date  = $"{jitem.photo?.created_at}".ToDateTime();
                var twidth  = (int)(jitem.photo?.thumbnail_width ?? 0d);
                var theight = (int)(jitem.photo?.thumbnail_height ?? 0d);
                if (twidth > 0 && theight > 0) //缩略图的尺寸 175级别 大图 740级别
                {
                    if (twidth > theight)
                    {
                        img.Height = 740 * theight / twidth;
                        img.Width  = 740;
                    }
                    else
                    {
                        img.Width  = 740 * twidth / theight;
                        img.Height = 740;
                    }
                }
                img.Title        = $"{jitem.photo?.subject}";
                img.IsExplicit   = jitem.photo?.viewable ?? false;
                img.OriginString = $"{jitem}";
                imgs.Add(img);
            }

            return(imgs);
        }
Beispiel #20
0
        public async Task SearchByAuthor(MoeItems imgs, string uid, SearchPara para, CancellationToken token)
        {
            var isIorM = para.Lv3MenuIndex == 0;
            var mi     = isIorM ? "illustrations" : "manga";
            var mi2    = isIorM ? "illusts" : "manga";
            var mi3    = isIorM ? "插画" : "漫画";

            Net.SetReferer($"{HomeUrl}/users/{uid}/{mi}");
            var allJson = await Net.GetJsonAsync($"{HomeUrl}/ajax/user/{uid}/profile/all", token);

            if ($"{allJson?.error}".ToLower() == "true")
            {
                Extend.ShowMessage($"搜索失败,网站信息:“{$"{allJson?.message}".ToDecodedUrl()}”", null, Extend.MessagePos.Window);
                return;
            }
            var picIds = new List <string>();
            var arts   = isIorM ? allJson?.body?.illusts : allJson?.body?.manga;

            foreach (var ill in Extend.GetList(arts))
            {
                picIds.Add((ill as JProperty)?.Name);
            }
            var picCurrentPage = picIds.OrderByDescending(i => i.ToInt()).Skip((para.PageIndex - 1) * para.Count).Take(para.Count).ToList();

            if (!picCurrentPage.Any())
            {
                return;
            }
            var pairs = new Pairs();

            foreach (var pic in picCurrentPage)
            {
                pairs.Add("ids[]".ToEncodedUrl(), pic);
            }
            pairs.Add("work_category", mi2);
            pairs.Add("is_first_page", "1");
            var picsJson = await Net.GetJsonAsync($"{HomeUrl}/ajax/user/{uid}/profile/illusts", token, pairs);

            var works = picsJson?.body?.works;

            foreach (var item in Extend.GetList(works))
            {
                dynamic illus = (item as JProperty)?.Value;
                if (illus == null)
                {
                    continue;
                }
                var img = new MoeItem(this, para);
                img.Urls.Add(1, $"{illus.url}", $"{HomeUrl}/users/{uid}/{mi}");
                img.Id              = $"{illus.id}".ToInt();
                img.Net             = Net.CloneWithOldCookie();
                img.Title           = $"{illus.title}";
                img.Uploader        = $"{illus.userName}";
                img.UploaderId      = $"{illus.userId}";
                img.UploaderHeadUrl = $"{illus.profileImageUrl}";
                img.Width           = $"{illus.width}".ToInt();
                img.Height          = $"{illus.height}".ToInt();
                img.DetailUrl       = $"{HomeUrl}/artworks/{img.Id}";
                img.ImagesCount     = $"{illus.pageCount}".ToInt();
                foreach (var tag in Extend.GetList(illus.tags))
                {
                    img.Tags.Add($"{tag}");
                }
                img.Date = GetDateFromUrl($"{illus.url}");
                if ($"{illus.illustType}" == "2")
                {
                    img.GetDetailTaskFunc = async() => await GetUgoiraDetailPageTask(img);
                }
                else
                {
                    img.GetDetailTaskFunc = async() => await GetDetailPageTask(img, para);
                }
                img.OriginString = $"{item}";

                imgs.Add(img);
            }
            Extend.ShowMessage($"该作者共有{mi3}{picIds.Count}张,当前第{para.Count * (para.PageIndex - 1) + 1}张", null, Extend.MessagePos.InfoBar);
        }
Beispiel #21
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            // logon
            if (!IsLogon)
            {
                Login(token);
            }
            if (!IsLogon)
            {
                return(new MoeItems());
            }

            // get page source
            string pageString;
            var    url = $"{HomeUrl}{(para.Keyword.Length > 0 ? $"/search?q={para.Keyword}&" : "/?")}p={para.PageIndex}";

            if (!_beforeWord.Equals(para.Keyword, StringComparison.CurrentCultureIgnoreCase))
            {
                // 301
                var respose = await Net.Client.GetAsync(url, token);

                if (respose.IsSuccessStatusCode)
                {
                    _beforeUrl = respose.Headers.Location.AbsoluteUri;
                }
                else
                {
                    Extend.ShowMessage("搜索失败,请检查您输入的关键词");
                    return(new MoeItems());
                }

                pageString = await respose.Content.ReadAsStringAsync();

                _beforeWord = para.Keyword;
            }
            else
            {
                url = para.Keyword.IsEmpty() ? url : $"{_beforeUrl}?p={para.PageIndex}";
                var res = await Net.Client.GetAsync(url, token);

                pageString = await res.Content.ReadAsStringAsync();
            }

            // images
            var imgs = new MoeItems();
            var doc  = new HtmlDocument();

            doc.LoadHtml(pageString);
            HtmlNodeCollection nodes;

            try
            {
                nodes = doc.DocumentNode.SelectSingleNode("//ul[@id='thumbs2']").SelectNodes(".//li");
            }
            catch { return(new MoeItems {
                    Message = "没有搜索到图片"
                }); }

            foreach (var imgNode in nodes)
            {
                var img = new MoeItem(this, para);
                var mo  = imgNode.SelectSingleNode(".//b")?.InnerText?.Trim();
                if (mo?.ToLower().Trim().Contains("members only") == true)
                {
                    continue;
                }
                var strId = imgNode.SelectSingleNode("a").Attributes["href"].Value;
                var fav   = imgNode.SelectSingleNode("a/span")?.InnerText;
                if (!fav.IsEmpty())
                {
                    img.Score = Regex.Replace(fav, @"[^0-9]+", "")?.ToInt() ?? 0;
                }
                var imgHref    = imgNode.SelectSingleNode(".//img");
                var previewUrl = imgHref?.Attributes["src"]?.Value;
                //http://s3.zerochan.net/Morgiana.240.1355397.jpg   preview
                //http://s3.zerochan.net/Morgiana.600.1355397.jpg    sample
                //http://static.zerochan.net/Morgiana.full.1355397.jpg   full
                //先加前一个,再加后一个  范围都是00-49
                //string folder = (id % 2500 % 50).ToString("00") + "/" + (id % 2500 / 50).ToString("00");
                var sampleUrl = "";
                var fileUrl   = "";
                if (!previewUrl.IsEmpty())
                {
                    sampleUrl = previewUrl?.Replace("240", "600");
                    fileUrl   = Regex.Replace(previewUrl, "^(.+?)zerochan.net/", "https://static.zerochan.net/").Replace("240", "full");
                }

                var resAndFileSize = imgHref?.Attributes["title"]?.Value;
                if (!resAndFileSize.IsEmpty())
                {
                    foreach (var s in resAndFileSize.Split(' '))
                    {
                        if (!s.Contains("x"))
                        {
                            continue;
                        }
                        var res = s.Split('x');
                        if (res.Length != 2)
                        {
                            continue;
                        }
                        img.Width  = res[0].ToInt();
                        img.Height = res[1].ToInt();
                    }
                }

                var title = imgHref?.Attributes["alt"]?.Value;

                //convert relative url to absolute
                if (!fileUrl.IsEmpty() && fileUrl.StartsWith("/"))
                {
                    fileUrl = $"{HomeUrl}{fileUrl}";
                }
                if (sampleUrl != null && sampleUrl.StartsWith("/"))
                {
                    sampleUrl = HomeUrl + sampleUrl;
                }

                img.Description = title;
                img.Title       = title;
                img.Id          = strId.Substring(1).ToInt();

                img.Urls.Add(1, previewUrl, HomeUrl);
                img.Urls.Add(2, sampleUrl, HomeUrl);
                img.Urls.Add(4, fileUrl, img.DetailUrl);
                img.DetailUrl = $"{HomeUrl}/{img.Id}";

                img.OriginString = imgNode.OuterHtml;
                imgs.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
Beispiel #22
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (!IsLogon)
            {
                await LoginAsync(token);
            }

            // pages source
            //http://mjv-art.org/pictures/view_posts/0?lang=en
            var url = $"{HomeUrl}/pictures/view_posts/{para.PageIndex - 1}?lang=en";

            if (para.Keyword.Length > 0)
            {
                //http://mjv-art.org/pictures/view_posts/0?search_tag=suzumiya%20haruhi&order_by=date&ldate=0&lang=en
                url = $"{HomeUrl}/pictures/view_posts/{para.PageIndex - 1}?search_tag={para.Keyword}&order_by=date&ldate=0&lang=en";
            }

            var imgs = new MoeItems();

            var doc = await Net.GetHtmlAsync(url, token);

            if (doc == null)
            {
                return(null);
            }
            var pre      = "https:";
            var listnode = doc.DocumentNode.SelectNodes("//*[@id='posts']/div[@class='posts_block']/span[@class='img_block_big']");

            if (listnode == null)
            {
                return new MoeItems {
                           Message = "读取HTML失败"
                }
            }
            ;
            foreach (var node in listnode)
            {
                var img = new MoeItem(this, para)
                {
                    Site = this
                };

                var imgnode = node.SelectSingleNode("a/picture/img");
                var idattr  = imgnode.GetAttributeValue("id", "0");
                var reg     = Regex.Replace(idattr, @"[^0-9]+", "");
                img.Id = reg.ToInt();
                var src = imgnode.GetAttributeValue("src", "");
                if (!src.IsEmpty())
                {
                    img.Urls.Add(new UrlInfo(1, $"{pre}{src}", url));
                }
                var resstrs = node.SelectSingleNode("div[@class='img_block_text']/a")?.InnerText.Trim().Split('x');
                if (resstrs?.Length == 2)
                {
                    img.Width  = resstrs[0].ToInt();
                    img.Height = resstrs[1].ToInt();
                }
                var scorestr = node.SelectSingleNode("div[@class='img_block_text']/span")?.InnerText.Trim();
                var match    = Regex.Replace(scorestr ?? "0", @"[^0-9]+", "");
                img.Score = match.ToInt();
                var detail = node.SelectSingleNode("a").GetAttributeValue("href", "");
                if (!detail.IsEmpty())
                {
                    img.DetailUrl         = $"{HomeUrl}{detail}";
                    img.GetDetailTaskFunc = async() => await GetDetailTask(img);
                }
                imgs.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
Beispiel #23
0
        public override async Task <MoeItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var imgs = new MoeItems();
            var url  = $"{HomeUrl}/?page={para.PageIndex}";

            if (Net == null)
            {
                Net = new NetDocker(Settings);
            }
            if (!para.Keyword.IsEmpty())
            {
                url = $"{HomeUrl}/search/process/";
                var i  = para.SubMenuIndex;
                var kw = $"{$"\"{para.Keyword.Delete("\"")}\"".ToEncodedUrl()}+";
                //e-shuushuu需要将关键词转换为tag id,然后进行搜索
                var mc = new FormUrlEncodedContent(new Pairs
                {
                    { "tags", i == 0 ? kw : "" },
                    { "source", i == 1 ? kw : "" },
                    { "char", i == 3 ? kw : "" },
                    { "artist", i == 2 ? kw : "" },
                    { "postcontent", "" },
                    { "txtposter", "" }
                });
                var net = Net.CloneWithOldCookie();
                var r   = await net.Client.GetAsync(HomeUrl, token);

                if (r.IsSuccessStatusCode == false)
                {
                    return(imgs);
                }

                net = net.CloneWithOldCookie();
                net.SetReferer($"{HomeUrl}/search");
                net.HttpClientHandler.AllowAutoRedirect = false; //prevent 303
                var res = await net.Client.PostAsync(url, mc, token);

                var loc303 = res.Headers.Location?.OriginalString;     //todo 无法实现,需要大神

                //http://e-shuushuu.net/search/results/?tags=2
                if (!loc303.IsEmpty())
                {
                    url = $"{loc303}&page={para.PageIndex}";
                }
                else
                {
                    return new MoeItems {
                               Message = "没有搜索到关键词相关的图片"
                    }
                };
            }

            // images
            var doc = await Net.GetHtmlAsync(url, token);

            if (doc == null)
            {
                return new MoeItems
                       {
                           Message = "获取HTML失败"
                       }
            }
            ;
            var nodes = doc.DocumentNode.SelectNodes("//div[@class='image_thread display']");

            if (nodes == null)
            {
                return(imgs);
            }

            foreach (var imgNode in nodes)
            {
                var img = new MoeItem(this, para);
                var id  = imgNode.Attributes["id"]?.Value.Delete("i");
                img.Id = $"{id}".ToInt();
                var imgHref = imgNode.SelectSingleNode(".//a[@class='thumb_image']");
                var fileUrl = imgHref.Attributes["href"].Value;
                if (fileUrl.StartsWith("/"))
                {
                    fileUrl = $"{HomeUrl}{fileUrl}";
                }
                var previewUrl = imgHref.SelectSingleNode("img").Attributes["src"].Value;
                if (previewUrl.StartsWith("/"))
                {
                    previewUrl = $"{HomeUrl}{previewUrl}";
                }
                img.Urls.Add(1, previewUrl, HomeUrl);
                var meta = imgNode.SelectSingleNode(".//div[@class='meta']");
                img.Date = meta.SelectSingleNode(".//dd[2]").InnerText.ToDateTime();
                var dimension = meta.SelectSingleNode(".//dd[4]").InnerText;
                foreach (var s in dimension.Split(' '))
                {
                    if (!s.Contains("x"))
                    {
                        continue;
                    }
                    var res = s.Split('x');
                    if (res.Length != 2)
                    {
                        continue;
                    }
                    img.Width  = res[0].ToInt();
                    img.Height = res[1].ToInt();
                    break;
                }

                var tags = meta.SelectNodes(".//span[@class='tag']/a");
                if (tags != null)
                {
                    foreach (var tag in tags)
                    {
                        if (tag.InnerText.IsEmpty())
                        {
                            continue;
                        }
                        img.Tags.Add(tag.InnerText);
                    }
                    img.Uploader = tags.LastOrDefault()?.InnerText;
                }
                var detail = $"{HomeUrl}/image/{id}";
                img.DetailUrl = detail;
                img.Urls.Add(4, fileUrl, detail);
                img.OriginString = imgNode.OuterHtml;
                imgs.Add(img);
            }

            return(imgs);
        }
Beispiel #24
0
        public async Task SearchByNewOrHot(SearchPara para, CancellationToken token, MoeItems imgs)
        {
            const string api   = "https://api.vc.bilibili.com/link_draw/v2";
            var          type  = para.Lv3MenuIndex == 0 ? "new" : "hot";
            var          count = para.Count > 20 ? 20 : para.Count;
            var          api2  = "";

            switch (para.SubMenuIndex)
            {
            case 0:
                api2 = $"{api}/Doc/list";
                break;

            case 1:
            case 2:
                api2 = $"{api}/Photo/list";
                break;
            }
            var net  = new NetDocker(Settings);
            var json = await net.GetJsonAsync(api2, token, new Pairs
            {
                { "category", para.SubMenuIndex == 0 ? "all" : (para.SubMenuIndex == 1 ? "cos" : "sifu") },
                { "type", type },
                { "page_num", $"{para.PageIndex - 1}" },
                { "page_size", $"{count}" }
            });


            foreach (var item in Extend.CheckListNull(json?.data?.items))
            {
                var cat = para.SubMenuIndex == 0 ? "/d" : "/p";
                var img = new MoeItem(this, para)
                {
                    Uploader = $"{item.user?.name}",
                    Id       = $"{item.item?.doc_id}".ToInt(),
                };
                img.DetailUrl = $"https://h.bilibili.com/{img.Id}";
                var i0 = item.item?.pictures[0];
                img.Width  = $"{i0?.img_width}".ToInt();
                img.Height = $"{i0?.img_height}".ToInt();
                img.Date   = $"{item.item?.upload_time}".ToDateTime();
                img.Urls.Add(1, $"{i0?.img_src}@336w_336h_1e_1c.jpg", HomeUrl + cat);
                img.Urls.Add(2, $"{i0?.img_src}@1024w_768h.jpg");
                img.Urls.Add(4, $"{i0?.img_src}");
                img.Title = $"{item.item?.title}";
                var list = item.item?.pictures as JArray;
                if (list?.Count > 1)
                {
                    foreach (var pic in item.item.pictures)
                    {
                        var child = new MoeItem(this, para);
                        child.Urls.Add(1, $"{pic.img_src}@336w_336h_1e_1c.jpg", HomeUrl + cat);
                        child.Urls.Add(2, $"{pic.img_src}@1024w_768h.jpg", HomeUrl + cat);
                        child.Urls.Add(4, $"{pic.img_src}");
                        child.Width  = $"{pic.img_width}".ToInt();
                        child.Height = $"{pic.img_height}".ToInt();
                        img.ChildrenItems.Add(child);
                    }
                }
                img.GetDetailTaskFunc = async() => await GetSearchByNewOrHotDetailTask(img, token, para);

                img.OriginString = $"{item}";
                imgs.Add(img);
            }

            var c = $"{json?.data.total_count}".ToInt();

            Extend.ShowMessage($"共搜索到{c}张,已加载至{para.PageIndex}页,共{c / para.Count}页", null, Extend.MessagePos.InfoBar);
        }
Beispiel #25
0
    public async Task <MoeItems> GetNewItems(string url, MoeItem father, CustomPagePara pa, bool isFirst,
                                             CancellationToken token)
    {
        var newItems = new MoeItems();
        var net      = Net.CloneWithCookie();
        var html     = await net.GetHtmlAsync(url, token : token, showSearchMessage : false);

        if (html == null)
        {
            return(newItems);
        }
        var root      = html.DocumentNode;
        var imgOrImgs = root.GetValue(pa.DetailImagesList);

        if (pa.DetailImagesList.IsMultiValues)
        {
            var imgs = (HtmlNodeCollection)imgOrImgs;
            if (imgs?.Count > 0)
            {
                foreach (var img in imgs)
                {
                    var newm = GetChildrenItem(img, pa, father);
                    newItems.Add(newm);
                }
            }
            else
            {
                return(newItems);
            }
        }
        else
        {
            var img  = (HtmlNode)imgOrImgs;
            var newm = GetChildrenItem(img, pa, father);
            newItems.Add(newm);
        }


        var currentPageIndex = root.GetValue(pa.DetailCurrentPageIndex);
        var currentIndex     = $"{currentPageIndex}".ToInt();
        var nextpageIndex    = $"{root.GetValue(pa.DetailNextPageIndex)}".ToInt();

        //var maxPageIndex = $"{root.GetValue(pa.DetailMaxPageIndex)}".ToInt();
        if (isFirst)
        {
            var imageCount = $"{root.GetValue(pa.DetailImagesCount)}".ToInt();
            if (imageCount != 0)
            {
                father.ChildrenItemsCount = imageCount;
            }
        }

        if (nextpageIndex == currentIndex + 1)
        {
            var nextUrl = root.GetValue(pa.DetailNextPageUrl);
            var last    = newItems.LastOrDefault();
            if (last != null)
            {
                last.IsResolveAndDownloadNextItem = true;
                last.GetNextItemsTaskFunc        += async t => await GetNewItems(nextUrl, father, pa, false, t);
            }
        }

        return(newItems);
    }