예제 #1
0
        public async Task <ImageItems> GetImagesAsync(string sourceUrl, bool isPerson = false)
        {
            var result = new ImageItems();

            if (string.IsNullOrEmpty(sourceUrl))
            {
                return(null);
            }

            var images = await GetAsync <ImageItems>(sourceUrl, true);

            if (images != null)
            {
                if (isPerson)
                {
                    result.Images = images
                                    .Images?
                                    .Where(x => x.Caption != "Dummy video" &&
                                           x.Categori != "dk/spillefilm" &&
                                           x.Categori != "plakater")
                                    .OrderBy(o => Convert.ToInt32(o.Urgency))
                                    .ToList();
                }
                else
                {
                    result.Images = images
                                    .Images?
                                    .Where(x => x.Caption != "Dummy video")
                                    .OrderBy(o => Convert.ToInt32(o.Urgency))
                                    .ToList();
                }
            }
            return(result);
        }
예제 #2
0
        public async Task SearchByNew(ImageItems imgs, string query, SearchPara para, CancellationToken token)
        {
            var net     = Net.CreatNewWithRelatedCookie();
            var pageres = await net.Client.GetAsync(query, token);

            var pageString = await pageres.Content.ReadAsStringAsync();

            var doc = new HtmlDocument();

            doc.LoadHtml(pageString);

            var imgnodes = doc.DocumentNode.SelectNodes("//li[@class='image-item']");

            if (imgnodes == null)
            {
                return;
            }

            foreach (var imglinode in imgnodes)
            {
                var img = new ImageItem(this, para);
                img.Site = this;
                img.Net  = Net.CreatNewWithRelatedCookie();


                var imgel  = imglinode.SelectSingleNode("a/div/img").OuterHtml;
                var imgdoc = new HtmlDocument();
                imgdoc.LoadHtml(imgel);
                var i2 = imgdoc.DocumentNode.SelectSingleNode("img");
                img.Urls.Add(new UrlInfo("缩略图", 1, i2?.GetAttributeValue("data-src", ""), query));
                int.TryParse(i2?.GetAttributeValue("data-id", "0"), out var id);
                img.Id = id;
                var tags = i2?.GetAttributeValue("data-tags", "");
                if (!string.IsNullOrWhiteSpace(tags))
                {
                    foreach (var tag in tags.Split(' '))
                    {
                        img.Tags.Add(tag);
                    }
                }

                var title = imglinode.SelectNodes("a")?[1]?.InnerText?.ToDecodedUrl();
                img.Title = title;
                var usernode = imglinode.SelectNodes("a")?[2];
                var user     = usernode?.GetAttributeValue("data-user_name", "");
                img.Author = user;

                var link = imglinode.SelectSingleNode("a")?.GetAttributeValue("href", "");
                //var countdiv = imglinode.SelectSingleNode("./div[@class='page-count']");

                var fulllink = $"{HomeUrl}{link?.Replace("&amp;", "&")}";
                //if (countb) fulllink = fulllink.Replace("mode=medium", "mode=manga");
                img.DetailUrl = fulllink;

                var subnet = Net.CreatNewWithRelatedCookie();
                img.GetDetailAction = async() => await GetDetailAction(fulllink, img, subnet, para);

                imgs.Add(img);
            }
        }
예제 #3
0
        private async void OnOpenGalleryCommand()
        {
            var xx = DependencyService.Get <ISupportMedia>();

            if (xx != null)
            {
                var result = await xx.IF_OpenGallery(new SyncPhotoOptions());

                foreach (var item in result)
                {
                    ImageItems.Add(item);
                    Console.WriteLine("LocalPath ==> " + item.OriginalPath);
                    SyncImageInBackground(item);


                    //Task.Factory.StartNew( async () =>
                    //{
                    //    Console.WriteLine("Start sync");
                    //    var result = await newInstance.IF_SyncPhotoFromCloud(item, null);
                    //    Console.WriteLine("Finish Start sync");
                    //    item.Processing = false;
                    //});
                }
            }
        }
예제 #4
0
        public MainWindowVM()
        {
            model.ShowPicture += (img, i) =>
            {
                for (int j = 0; j < ImageItems.Count; j++)
                {
                    ImageItems[i].Fill(img);
                }
            };

            model.GiveCount += (count) =>
            {
                for (int i = 0; i < count; i++)
                {
                    BitmapImage bmi = new BitmapImage(new Uri(@"C:\Users\kserg\OneDrive\Рабочий стол\Images\Flopp.png"));
                    ImageItems.Add(new ImageItem(bmi));
                }
            };

            ImageItem.SetVisibility = (pic) =>
            {
                PictureVisibility = Visibility.Visible;
                PictureSource     = pic;
            };
        }
예제 #5
0
        public void IF_PickedResult(List <SupportImageXF> result, int _CodeRequest)
        {
            foreach (var item in result)
            {
                ImageItems.Add(item);

                Task.Delay(200).ContinueWith(async(arg) => {
                    if (item.ImageRawData == null)
                    {
                        //sync image from icloud
                        //item.AsyncStatus = ImageAsyncStatus.SyncFromCloud;
                        //var resultX = await DependencyService.Get<ISupportMedia>().IF_SyncPhotoFromCloud(this, item, new SyncPhotoOptions());

                        //upload to your server
                        //item.AsyncStatus = ImageAsyncStatus.Uploading;
                        //await new APIServiceAES().UploadImageAsync(new System.IO.MemoryStream(item.ImageRawData), item.OriginalPath + ".JPEG");
                        //item.AsyncStatus = ImageAsyncStatus.Uploaded;
                    }
                    else
                    {
                        //upload to your server
                        //item.AsyncStatus = ImageAsyncStatus.Uploading;
                        //await new APIServiceAES().UploadImageAsync(new System.IO.MemoryStream(item.ImageRawData), item.OriginalPath + ".JPEG");
                        //item.AsyncStatus = ImageAsyncStatus.Uploaded;
                    }
                });
            }
        }
예제 #6
0
 public void IF_PickedResult(List <SupportImageXF> result, int _CodeRequest)
 {
     foreach (var item in result)
     {
         ImageItems.Add(item);
         Console.WriteLine("LocalPath ==> " + item.OriginalPath);
         Task.Delay(200).ContinueWith(async(arg) => {
         });
     }
 }
예제 #7
0
        public async Task SearchByTag(ImageItems imgs, string query, SearchPara para, CancellationToken token)
        {
            var net     = Net.CreatNewWithRelatedCookie();
            var pageres = await net.Client.GetAsync(query, token);

            var pageString = await pageres.Content.ReadAsStringAsync();

            var doc = new HtmlDocument();

            doc.LoadHtml(pageString);

            var itemsjsonstr = doc.DocumentNode.SelectSingleNode("//*[@id='js-mount-point-search-result-list']").GetAttributeValue("data-items", "");

            if (string.IsNullOrWhiteSpace(itemsjsonstr))
            {
                return;
            }
            itemsjsonstr = itemsjsonstr.Replace("&quot;", "\"");
            dynamic jlist = JsonConvert.DeserializeObject(itemsjsonstr);

            if (jlist == null)
            {
                return;
            }
            foreach (var jitem in jlist)
            {
                var img = new ImageItem(this, para);
                img.Net = Net.CreatNewWithRelatedCookie();
                img.Urls.Add(new UrlInfo("缩略图", 1, $"{jitem.url}", query));
                int.TryParse($"{jitem.illustId}", out var id);
                img.Id = id;
                int.TryParse($"{jitem.bookmarkCount}", out var score);
                img.Score  = score;
                img.Width  = (int)jitem.width;
                img.Height = (int)jitem.height;
                if (jitem.tags != null)
                {
                    foreach (var tag in jitem.tags)
                    {
                        img.Tags.Add($"{tag}");
                    }
                }
                img.DetailUrl       = $"{HomeUrl}/member_illust.php?mode=medium&illust_id={id}";
                img.Author          = $"{jitem.userName}";
                img.Title           = $"{jitem.illustTitle}";
                img.GetDetailAction = async() => await GetDetailAction(img.DetailUrl, img, Net.CreatNewWithRelatedCookie(), para);

                imgs.Add(img);
            }
        }
예제 #8
0
        private static async Task CreateEnties(EntryRepository repo, ImageItems model)
        {
            foreach (var entry in await repo.GetEntries(model.CurrentStartIndex, model.CurrentEndIndex))
            {
                var imageItem = new ImageItem
                {
                    Id        = entry.Id.ToString(),
                    Message   = entry.Message,
                    Timestamp = entry.Timestamp,
                    UserName  = entry.UserName
                };

                model.Entries.Add(imageItem);
            }
        }
예제 #9
0
        public async Task <ImageItems> GetRealPageImagesAsyncFromJson(SearchPara para, CancellationToken token)
        {
            var client  = new NetSwap(Settings).Client;
            var query   = GetPageQuery(para);
            var jsonRes = await client.GetAsync(query, token);

            var jsonStr = await jsonRes.Content.ReadAsStringAsync();

            return(await Task.Run(() =>
            {
                token.ThrowIfCancellationRequested();
                var imageitems = new ImageItems();
                dynamic list = JsonConvert.DeserializeObject(jsonStr);
                if (list == null)
                {
                    return imageitems;
                }
                foreach (var item in list)
                {
                    token.ThrowIfCancellationRequested();
                    var img = new ImageItem(this, para);

                    img.Width = (int)item.image_width;
                    img.Height = (int)item.image_height;
                    img.Id = (int)item.id;
                    img.Score = (int)item.score;
                    img.Author = $"{item.uploader_name}";
                    var tagsstr = $"{item.tag_string}";
                    foreach (var tag in tagsstr.Split(' '))
                    {
                        if (!string.IsNullOrWhiteSpace(tag))
                        {
                            img.Tags.Add(tag.Trim());
                        }
                    }

                    img.IsExplicit = $"{item.rating}" == "e";
                    img.DetailUrl = GetDetailPageUrl(img);
                    img.Urls.Add(new UrlInfo("缩略图", 1, $"{item.preview_file_url}", GetThumbnailReferer(img)));
                    img.Urls.Add(new UrlInfo("预览图", 2, $"{item.large_file_url}", GetThumbnailReferer(img)));
                    img.Urls.Add(new UrlInfo("原图", 4, $"{item.file_url}", img.DetailUrl));
                    //img.Net = Net;
                    imageitems.Add(img);
                }

                return imageitems;
            }, token));
        }
예제 #10
0
        private void Page_Load(object sender, EventArgs e)
        {
            //Detect WebDav Support in PageEditor
            if (Request.Browser.Browser.Contains("IE") && Sitecore.Context.PageMode.IsPageEditor)
            {
                if (FileDrop != null)
                {
                    FileDrop.Visible = true;
                }
            }

            //Page Mode Detection
            AutoScroll = Sitecore.Context.PageMode.IsPageEditor ? "false" : "true";

            //Debug Mode
            if (Sitecore.Context.PageMode.IsDebugging)
            {
                //Put in Debug Information here about marketing information.
            }

            //Rendering Parameter Templates
            string rawParameters           = Attributes["sc_parameters"];
            NameValueCollection parameters = Sitecore.Web.WebUtil.ParseUrlParameters(rawParameters);

            GetMaxItems          = parameters["Max Items"] ?? "5";
            GetSlideDelay        = parameters["Slide Delay"] ?? "6000";
            GetDetailsSlideDelay = parameters["Detail Slide Duration"] ?? "1000";
            GetTransitionType    = parameters["Transition Type"] ?? "swing";

            var            getDataSource = Sitecore.Context.Database.GetItem(DataSource);
            MultilistField imageList     = getDataSource.Fields["Image List"];
            MultilistField videoList     = getDataSource.Fields["Video List"];


            //DetailsList.DataSource =
            ImageItems.DataSource = imageList.GetItems();
            VideoItems.DataSource = videoList.GetItems();

            var combinedItems = new List <Item>(imageList.GetItems());

            combinedItems.AddRange(videoList.GetItems());

            DetailsList.DataSource = combinedItems;
            DetailsList.DataBind();
            ImageItems.DataBind();
            VideoItems.DataBind();
        }
예제 #11
0
        private async void OnOpenCameraCommand()
        {
            var xx = DependencyService.Get <ISupportMedia>();

            if (xx != null)
            {
                var option = new SyncPhotoOptions();
                var result = await xx.IF_OpenCamera(option);

                ImageItems.Add(result);
                var result2 = await xx.IF_WriteStreamToFile(result, option);

                var xxyy = new SupportImageXF()
                {
                    ImageSourceXF = ImageSource.FromFile(result2.ProcessFilePath)
                };
                ImageItems.Add(xxyy);
            }
        }
        private void LoadImages()
        {
            ImageItems.Clear();

            foreach (var discItem in Discs)
            {
                var discImages = contentCrawler.LoadDiscImages(discItem.SourcePath).ToList();
                if (discImages.Count > 1)
                {
                    throw new InvalidOperationException($"Disc '{discItem.SourcePath}' contains multiple images. Only one image per disc (cover image) is currently supported.");
                }

                var imageFile = imageFileFactory.CreateInstance();
                if (discImages.Count == 1)
                {
                    imageFile.Load(discImages.Single(), false);
                }

                ImageItems.Add(new DiscImageViewItem(discItem, DiscImageType.Cover, imageFile));
            }
        }
예제 #13
0
        public async Task SearchByRank(ImageItems imgs, string query, SearchPara para, CancellationToken token)
        {
            var net     = Net.CreatNewWithRelatedCookie();
            var pageres = await net.Client.GetAsync(query, token);

            var pageString = await pageres.Content.ReadAsStringAsync();

            dynamic jsonlist = JsonConvert.DeserializeObject(pageString);

            if (jsonlist?.contents == null)
            {
                return;
            }
            foreach (var jitm in jsonlist.contents)
            {
                var img = new ImageItem(this, para);
                img.Site = this;
                img.Net  = Net.CreatNewWithRelatedCookie();
                img.Urls.Add(new UrlInfo("缩略图", 1, $"{jitm.url}", query));
                img.Title = $"{jitm.title}";
                if (jitm.tags != null)
                {
                    foreach (var tag in jitm.tags)
                    {
                        img.Tags.Add($"{tag}");
                    }
                }
                int.TryParse($"{jitm.rating_count}", out var score);
                img.Score = score;
                int.TryParse($"{jitm.illust_id}", out var id);
                img.Id     = id;
                img.Author = $"{jitm.user_name}";
                int.TryParse($"{jitm.illust_page_count}", out var pcount);
                img.DetailUrl       = $"{HomeUrl}/member_illust.php?mode=medium&illust_id={id}";
                img.GetDetailAction = async() => await GetDetailAction(img.DetailUrl, img, Net.CreatNewWithRelatedCookie(), para);

                imgs.Add(img);
            }
        }
예제 #14
0
        public void LoadImages(ImageItems items)
        {
            ResetVisual();
            foreach (var item in items)
            {
                var itemctrl = new ImageControl(Settings, item);

                itemctrl.DownloadButton.Click += (sender, args)
                                                 => ImageItemDownloadButtonClicked?.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);
                if (ImageLoadingPool.Count < Settings.MaxOnLoadingImageCount)
                {
                    ImageLoadingPool.Add(itemctrl);
                }
                else
                {
                    ImageWaitForLoadingPool.Add(itemctrl);
                }
            }
        }
예제 #15
0
        public override async Task <ImageItems> 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 pageres = await Net.Client.GetAsync(url, token);

            var pageString = await pageres.Content.ReadAsStringAsync();

            // images
            var imgs = new ImageItems();

            var doc = new HtmlDocument();

            doc.LoadHtml(pageString);
            var pre      = "https:";
            var listnode = doc.DocumentNode.SelectNodes("//*[@id='posts']/div[@class='posts_block']/span[@class='img_block_big']");

            if (listnode == null)
            {
                return(imgs);
            }
            foreach (var node in listnode)
            {
                var img = new ImageItem(this, para);
                //img.Net = Net;
                img.Site = this;
                var imgnode = node.SelectSingleNode("a/picture/img");
                var idattr  = imgnode.GetAttributeValue("id", "0");
                var reg     = Regex.Replace(idattr, @"[^0-9]+", "");
                int.TryParse(reg, out var id);
                img.Id = id;
                var src = imgnode.GetAttributeValue("src", "");
                if (!string.IsNullOrWhiteSpace(src))
                {
                    img.Urls.Add(new UrlInfo("缩略图", 1, $"{pre}{src}", url));
                }
                var resstrs = node.SelectSingleNode("div[@class='img_block_text']/a")?.InnerText.Trim().Split('x');
                int.TryParse(resstrs[0], out var width);
                int.TryParse(resstrs[1], out var height);
                img.Width  = width;
                img.Height = height;
                var scorestr = node.SelectSingleNode("div[@class='img_block_text']/span")?.InnerText.Trim();
                int.TryParse(Regex.Match(scorestr ?? "0", @"[^0-9]+").Value, out var score);
                img.Score = score;
                var detail = node.SelectSingleNode("a").GetAttributeValue("href", "");
                if (!string.IsNullOrWhiteSpace(detail))
                {
                    img.DetailUrl       = $"{HomeUrl}{detail}";
                    img.GetDetailAction = async() =>
                    {
                        var detialurl = img.DetailUrl;
                        var net       = new NetSwap(Settings);
                        net.SetTimeOut(25);
                        try
                        {
                            var detailPageStr = await net.Client.GetStringAsync(detialurl);

                            var subdoc = new HtmlDocument();
                            subdoc.LoadHtml(detailPageStr);
                            var downnode = subdoc.DocumentNode?.SelectSingleNode("//*[@id='rating']/a[@class='download_icon']");
                            var fileurl  = downnode?.GetAttributeValue("href", "");
                            if (!string.IsNullOrWhiteSpace(fileurl))
                            {
                                img.Urls.Add(new UrlInfo("原图", 4, $"{HomeUrl}{fileurl}", detialurl));
                            }
                        }
                        catch (Exception e)
                        {
                            App.Log(e);
                        }
                    };
                }


                imgs.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
예제 #16
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            // page source
            var url = $"{HomeUrl}/?page={para.PageIndex}";

            if (Net == null)
            {
                Net = new NetSwap(Settings);
            }

            if (!string.IsNullOrWhiteSpace(para.Keyword))
            {
                url = $"{HomeUrl}/search/process/";
                //multi search
                string data;
                switch (SubListIndex)
                {
                default:
                    data = $"tags={para.Keyword}&source=&char=&artist=&postcontent=&txtposter=";
                    break;

                case 1:
                    data = $"tags=&source={para.Keyword}&char=&artist=&postcontent=&txtposter=";
                    break;

                case 2:
                    data = $"tags=&source=&char=&artist={para.Keyword}&postcontent=&txtposter=";
                    break;

                case 3:
                    data = $"tags=&source=&char={para.Keyword}&artist=&postcontent=&txtposter=";
                    break;
                }

                //e-shuushuu需要将关键词转换为tag id,然后进行搜索 todo 这里要测试
                var net = new NetSwap(Settings);
                net.HttpClientHandler.AllowAutoRedirect = false; //prevent 303
                var res = await net.Client.GetAsync(url, token);

                var loc = res.Headers.Location;

                //http://e-shuushuu.net/search/results/?tags=2
                if (!string.IsNullOrEmpty(loc.OriginalString))
                {
                    //非完整地址,需要前缀
                    url = $"{loc}&page={para.PageIndex}";
                }
                else
                {
                    App.ShowMessage("没有搜索到关键词相关的图片(每个关键词前后需要加双引号如 \"sakura\")");
                    return(new ImageItems());
                }
            }

            var pageString = await Net.Client.GetStringAsync(url);

            // images
            var images = new ImageItems();
            var doc    = new HtmlDocument();

            doc.LoadHtml(pageString);
            //retrieve all elements via xpath
            var nodes = doc.DocumentNode.SelectNodes("//div[@class='image_thread display']");

            if (nodes == null)
            {
                return(images);
            }
            foreach (var imgNode in nodes)
            {
                var item = new ImageItem(this, para);
                var id   = imgNode.Attributes["id"].Value;
                int.TryParse(id.Substring(1), out var ido);
                item.Id = ido;
                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;
                }
                item.Urls.Add(new UrlInfo("缩略图", 1, previewUrl, HomeUrl));
                var meta      = imgNode.SelectSingleNode(".//div[@class='meta']");
                var date      = meta.SelectSingleNode(".//dd[2]").InnerText;
                var fileSize  = meta.SelectSingleNode(".//dd[3]").InnerText;
                var dimension = meta.SelectSingleNode(".//dd[4]").InnerText;
                try
                {
                    //706x1000 (0.706 MPixel)
                    var dms = dimension.Substring(0, dimension.IndexOf('(')).Trim();
                    item.Width  = int.Parse(dms.Substring(0, dms.IndexOf('x')));
                    item.Height = int.Parse(dms.Substring(dms.IndexOf('x') + 1));
                }
                catch { /*..*/ }
                try
                {
                    var tags  = meta.SelectSingleNode(".//dd[5]").InnerText.Replace("\t", "").Replace("\n", "");
                    var regex = new Regex("\"([^\"]*)\"");
                    foreach (Match match in regex.Matches(tags))
                    {
                        if (string.IsNullOrWhiteSpace(match.Value))
                        {
                            continue;
                        }
                        item.Tags.Add(match.Value);
                    }
                }
                catch { /*..*/ }
                var detail = $"{HomeUrl}/image/{ido}";
                item.DetailUrl = detail;
                item.Urls.Add(new UrlInfo("原图", 4, fileUrl, detail));
                item.Site = this;

                images.Add(item);
            }

            return(images);
        }
예제 #17
0
        /// <summary>
        /// 搜索下一页
        /// </summary>
        public async Task SearchNextPageAsync(CancellationToken token)
        {
            var        mpage  = new SearchedPage(); // 建立虚拟页信息
            var        images = new ImageItems();
            SearchPara temppara;

            if (LoadedPages.Count == 0)
            {
                temppara = CurrentSearchPara.Clone(); // 浅复制一份参数
                mpage.LastRealPageIndex = temppara.PageIndex;
                // 搜索起始页的所有图片(若网站查询参数有支持的条件过滤,则在搜索时就已自动过滤相关条件)
                SearchStatusChange($"正在搜索站点 {temppara.Site.DisplayName} 第 {temppara.PageIndex} 页");
                var imagesOrg = await temppara.Site.GetRealPageImagesAsync(temppara, token);

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

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

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

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

            while (images.Count < temppara.Count)     // 当images数量不够搜索参数数量时循环
            {
                token.ThrowIfCancellationRequested(); // 整体Task的取消Token,取消时会抛出异常

                temppara.PageIndex++;                 // 设置新搜索参数为下一页(真)
                mpage.LastRealPageIndex = temppara.PageIndex;
                SearchStatusChange($"正在搜索站点 {temppara.Site.DisplayName} 第 {temppara.PageIndex} 页");
                var imagesNextRPage = await temppara.Site.GetRealPageImagesAsync(temppara, token); // 搜索下一页(真)的所有图片

                if (imagesNextRPage == null || imagesNextRPage.Count == 0)                         // 当下一页(真)的搜索到的未进行本地过滤图片数量为0时,表示已经搜索完了
                {
                    mpage.HasNextPage       = false;                                               // 没有下一页
                    mpage.LastRealPageIndex = temppara.PageIndex;
                    break;
                }
                else // 当下一页(真)未过滤图片数量不为0时
                {
                    Filter(imagesNextRPage); // 本地过滤下一页(真)
                    foreach (var item in imagesNextRPage)
                    {
                        if (images.Count < temppara.Count)
                        {
                            images.Add(item);                                // 添加图片数量直到够参数设定的图片数量为止
                        }
                        else
                        {
                            mpage.PreLoadNextPageItems.Add(item);  // 多出来的图片存在另一个对象中,下一虚拟页可以调用
                        }
                    }
                    if (images.Count >= temppara.Count)
                    {
                        break;                                 // 数量已够参数数量,当前虚拟页完成任务
                    }
                }
                if (DateTime.Now - startTime > TimeSpan.FromSeconds(20))
                {
                    break;                                                      // loop超时跳出循环(即使不够数量也跳出)
                }
            }
            token.ThrowIfCancellationRequested();
            // Loadend
            mpage.ImageItems = images;
            LoadedPages.Add(mpage);
            SearchStatusChange("搜索完毕");
        }
예제 #18
0
        /// <summary>
        /// 本地过滤图片
        /// </summary>
        public void Filter(ImageItems 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.SurpportState;
                if (state.IsSupportRating) // 过滤Explicit评级图片
                {
                    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.FilterFileTpyeText.Split(';'))
                    {
                        if (string.IsNullOrWhiteSpace(s))
                        {
                            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--;
            }
        }
예제 #19
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            var net    = new NetSwap(Settings);
            var client = net.Client;
            var size   = "";

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

            switch (para.Orientation)
            {
            default:
            case ImageOrientation.None:
                break;

            case ImageOrientation.Portrait:
                orient = "p";
                break;

            case ImageOrientation.Landscape:
                orient = "l";
                break;
            }
            var query   = $"{HomeUrl}/new.json?tags={para.Keyword.ToEncodedUrl()}&size={size}&orient={orient}&page={para.PageIndex}";
            var jsonres = await client.GetAsync(query, token);

            var jsonstr = await jsonres.Content.ReadAsStringAsync();

            var     imageitems = new ImageItems();
            dynamic json       = JsonConvert.DeserializeObject(jsonstr);

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

                img.Site = this;

                imageitems.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imageitems);
        }
예제 #20
0
        public async Task SearchByAuthor(ImageItems imgs, string uid, SearchPara para, CancellationToken token)
        {
            var net = Net.CreatNewWithRelatedCookie();

            net.SetReferer($"{HomeUrl}/member_illust.php?id={uid}&p=1");
            var jsonres = await net.Client.GetAsync($"{HomeUrl}/ajax/user/{uid}/profile/all", token);

            var jsonstr = await jsonres.Content.ReadAsStringAsync();

            dynamic json    = JsonConvert.DeserializeObject(jsonstr);
            var     picids  = new List <string>();
            var     illusts = json?.body?.illusts;

            if (illusts != null)
            {
                foreach (var ill in illusts)
                {
                    var property = (JProperty)ill;
                    picids.Add(property.Name);
                }
            }
            var manga = json?.body?.manga;

            if (manga != null)
            {
                foreach (var m in manga)
                {
                    var property = (JProperty)m;
                    picids.Add(property.Name);
                }
            }
            var picCurrentPage = picids.OrderByDescending(i => i).Skip((para.PageIndex - 1) * para.Count).Take(para.Count).ToList();

            if (!picCurrentPage.Any())
            {
                return;
            }
            var q = $"{HomeUrl}/ajax/user/{uid}/profile/illusts?";

            foreach (var pic in picCurrentPage)
            {
                q += $"ids%5B%5D={pic}&";
            }
            q += "is_manga_top=0";
            var net2 = Net.CreatNewWithRelatedCookie();

            net2.SetReferer($"{HomeUrl}/member_illust.php?id={uid}");
            var picrespose = await net2.Client.GetStringAsync(q);

            dynamic picsjson = JsonConvert.DeserializeObject(picrespose);
            var     works    = picsjson?.body?.works;

            if (works != null)
            {
                foreach (var item in works)
                {
                    var     jp   = (JProperty)item;
                    dynamic jitm = jp.Value;
                    var     img  = new ImageItem(this, para);
                    img.Net = Net.CreatNewWithRelatedCookie();
                    img.Urls.Add(new UrlInfo("缩略图", 1, $"{jitm.url}", $"{HomeUrl}/member_illust.php?id={uid}"));
                    int.TryParse($"{jitm.id}", out var id);
                    img.Id = id;
                    int.TryParse($"{jitm.rating_count}", out var score);
                    img.Score = score;
                    if (jitm.tags != null)
                    {
                        foreach (var tag in jitm.tags)
                        {
                            img.Tags.Add($"{tag}");
                        }
                    }
                    img.DetailUrl       = $"{HomeUrl}/member_illust.php?mode=medium&illust_id={id}";
                    img.Author          = $"{jitm.user_name}";
                    img.Title           = $"{jitm.title}";
                    img.GetDetailAction = async() => await GetDetailAction(img.DetailUrl, img, Net.CreatNewWithRelatedCookie(), para);

                    imgs.Add(img);
                }
            }
        }
예제 #21
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                // login
                Net = new NetSwap(Settings, HomeUrl);
                var accIndex = new Random().Next(0, _user.Length);
                var content  = new FormUrlEncodedContent(new Dictionary <string, string>
                {
                    { "username", _user[accIndex] },
                    { "password", _pass[accIndex] }
                });
                // Net.Client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
                await Net.Client.PostAsync("http://my.minitokyo.net/login", content, token);
            }

            // page source
            string query;

            if (string.IsNullOrWhiteSpace(para.Keyword))
            {
                query = $"http://gallery.minitokyo.net/{Type}?order=id&display=extensive&page={para.PageIndex}";
            }
            else
            {
                var pageres = await Net.Client.GetAsync($"{HomeUrl}/search?q={para.Keyword}", token);

                var page = await pageres.Content.ReadAsStringAsync();

                var urlindex = page.IndexOf("http://browse.minitokyo.net/gallery?tid=", StringComparison.Ordinal);
                var url      = page.Substring(urlindex, page.IndexOf('"', urlindex) - urlindex - 1) + (Type.Contains("wallpapers") ? "1" : "3");
                url  += "&order=id&display=extensive&page=" + page;
                query = url.Replace("&amp;", "&");
            }
            var imgs      = new ImageItems();
            var doc       = new HtmlDocument();
            var streamres = await Net.Client.GetAsync(query, token);

            using (var pagestream = await streamres.Content.ReadAsStreamAsync())
            {
                doc.Load(pagestream);
            }
            //retrieve all elements via xpath
            var wallNode = doc.DocumentNode.SelectSingleNode("//ul[@class='wallpapers']");
            var imgNodes = wallNode.SelectNodes(".//li");

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

            for (var i = 0; i < imgNodes.Count - 1; i++)
            {
                var item = new ImageItem(this, para);
                //最后一个是空的,跳过
                var imgNode = imgNodes[i];

                var detailUrl = imgNode.SelectSingleNode("a").Attributes["href"].Value;
                item.DetailUrl = detailUrl;
                var id = detailUrl.Substring(detailUrl.LastIndexOf('/') + 1);
                item.Id = int.Parse(id);
                var imgHref   = imgNode.SelectSingleNode(".//img");
                var sampleUrl = imgHref.Attributes["src"].Value;
                item.Urls.Add(new UrlInfo("缩略图", 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
                var previewUrl = "http://static2.minitokyo.net/view" + sampleUrl.Substring(sampleUrl.IndexOf('/', sampleUrl.IndexOf(".net/", StringComparison.Ordinal) + 5));
                var fileUrl    = "http://static.minitokyo.net/downloads" + previewUrl.Substring(previewUrl.IndexOf('/', previewUrl.IndexOf(".net/", StringComparison.Ordinal) + 5));

                item.Urls.Add(new UrlInfo("原图", 4, fileUrl, HomeUrl));
                // \n\tMasaru -\n\tMasaru \n\tSubmitted by\n\t\tadri24rukiachan\n\t4200x6034, 4 Favorites\n
                var info   = imgNode.SelectSingleNode(".//div").InnerText;
                var infomc = Regex.Match(info, @"^\n\t(?<title>.*?)\s-\n.*?\n\t.*?by\n\t\t(?<author>.*?)\n\t(?<size>\d+x\d+),\s(?<score>\d+)\s");
                var title  = infomc.Groups["title"].Value;
                item.Title  = title;
                item.Author = infomc.Groups["author"].Value;
                var size = infomc.Groups["size"].Value;
                if (!string.IsNullOrWhiteSpace(size))
                {
                    try
                    {
                        item.Width  = int.Parse(size.Substring(0, size.IndexOf('x')));
                        item.Height = int.Parse(size.Substring(size.IndexOf('x') + 1));
                    }
                    catch { /*..*/ }
                }

                int.TryParse(infomc.Groups["score"].Value, out var score);
                item.Score = score;
                item.Site  = this;
                imgs.Add(item);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
예제 #22
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                Net = new NetSwap(Settings, HomeUrl);
                Net.HttpClientHandler.AllowAutoRedirect = true;
                Net.SetTimeOut(40);
            }

            if (!IsLogin)
            {
                await LoginAsync(token);
            }
            if (!IsLogin)
            {
                return(new ImageItems());
            }

            // page
            var word     = para.Keyword;
            var page     = para.PageIndex;
            var query    = "";
            var xmodestr = para.IsShowExplicit ? "" : "&mode=safe";

            if (Lv3ListIndex == 1)
            {
                xmodestr = "&mode=r18";
            }
            var r18 = Lv3ListIndex == 1 ? "_r18" : "";

            switch (SearchType)
            {
            case SearchTypeEnum.TagOrNew:
                if (string.IsNullOrWhiteSpace(word))     // empty
                {
                    // https://www.pixiv.net/new_illust.php?type=all&p=2

                    query = $"{HomeUrl}/new_illust{r18}.php?type=all&p={page}";
                }
                else
                {
                    query = $"{HomeUrl}/search.php?s_mode=s_tag&word={word.ToEncodedUrl()}&order=date_d&p={page}{xmodestr}";
                }
                break;

            case SearchTypeEnum.Author:    // 作者 member id
                //word = "4338012"; // test
                if (!int.TryParse(word.Trim(), out var memberId))
                {
                    App.ShowMessage("参数错误,必须在关键词中指定画师 id(纯数字)");
                    return(new ImageItems());
                }
                // https://www.pixiv.net/member_illust.php?id=4338012&p=1
                query = $"{HomeUrl}/member_illust.php?id={word.Trim()}&p={page}";
                query = word;
                break;

            case SearchTypeEnum.Day:
                query = $"{HomeUrl}/ranking.php?mode=daily{r18}&p={page}&format=json";
                break;

            case SearchTypeEnum.Week:
                // https://www.pixiv.net/ranking.php?mode=weekly&p=1&format=json
                query = $"{HomeUrl}/ranking.php?mode=weekly{r18}&p={page}&format=json";
                break;

            case SearchTypeEnum.Month:
                query = $"{HomeUrl}/ranking.php?mode=monthly&p={page}&format=json";
                break;
            }

            // ----------------images---------------------------
            var imgs = new ImageItems();

            switch (SearchType)
            {
            case SearchTypeEnum.TagOrNew:
                if (string.IsNullOrWhiteSpace(word))
                {
                    await SearchByNew(imgs, query, para, token);
                }
                else
                {
                    await SearchByTag(imgs, query, para, token);
                }

                break;

            case SearchTypeEnum.Day:
            case SearchTypeEnum.Week:
            case SearchTypeEnum.Month:
                await SearchByRank(imgs, query, para, token);

                break;

            case SearchTypeEnum.Author:
                await SearchByAuthor(imgs, query, para, token);

                break;
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }
예제 #23
0
        public HomeModule(EntryRepository repo)
        {
            Get("/", async args =>
            {
                var model = new ImageItems
                {
                    CurrentStartIndex = 1,
                    CurrentEndIndex   = 20,
                };

                var count = await repo.GetEntriesCount();

                if (count > model.CurrentEndIndex)
                {
                    model.NextStartIndex = 21;
                    model.NextEndIndex   = 40;
                }

                await CreateEnties(repo, model);

                return(View["Home", model]);
            });

            Get("/{start}/{end}", async args =>
            {
                int start = args.start;
                int end   = args.end;

                var model = new ImageItems
                {
                    CurrentStartIndex = start,
                    CurrentEndIndex   = end
                };

                if (start > 21)
                {
                    model.PreviousStartIndex = start - 20;
                    model.PreviousEndIndex   = start - 1;
                }
                else if (start > 1)
                {
                    model.PreviousStartIndex = 1;
                    model.PreviousEndIndex   = start - 1;
                }

                var count = await repo.GetEntriesCount();

                if (count > model.CurrentEndIndex)
                {
                    model.NextStartIndex = end + 1;
                    model.NextEndIndex   = end + 20;
                }
                await CreateEnties(repo, model);

                return(View["Home", model]);
            });

            Get("/images/{entryId}", async args =>
            {
                string entryid = args.entryId;
                var entry      = await repo.GetEntryById(entryid);
                if (entry?.Image == null)
                {
                    return(HttpStatusCode.NotFound);
                }

                return(new ByteArrayResponse(entry.Image, MimeTypes.GetMimeType(entry.Filename)));
            });

            Get("/contact", o => View["Contact"]);
        }
예제 #24
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (Net == null)
            {
                Net = new NetSwap();
            }

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

            if (para.Keyword.Length > 0)
            {
                //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?page={para.PageIndex}&rows={para.Count}&q={para.Keyword}";
            }

            // images

            var imgs = new ImageItems();
            var res  = await Net.Client.GetAsync(url, token);

            var str = await res.Content.ReadAsStringAsync();

            dynamic json = JsonConvert.DeserializeObject(str);

            if (json?.list == null)
            {
                return(imgs);
            }
            foreach (var jitem in json.list)
            {
                var img = new ImageItem(this, para);
                img.Author    = $"{jitem.member?.nickname}";
                img.DetailUrl = $"{HomeUrl}{jitem.photo?.url}";
                img.Id        = (int)(jitem.photo?.id ?? 0d);
                img.Urls.Add(new UrlInfo("缩略图", 1, $"{jitem.photo?.thumbnail_url_display}", HomeUrl));
                img.Urls.Add(new UrlInfo("大图", 3, $"{jitem.photo?.large_url}", img.DetailUrl));
                int.TryParse($"{jitem.photo?.good_cnt}", out var score);
                img.Score = score;
                DateTime.TryParse($"{jitem.photo?.created_at}", out var date);
                img.CreatTime = date;
                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;
                imgs.Add(img);
            }

            return(imgs);
        }
예제 #25
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            string       query;
            const string api   = "https://api.vc.bilibili.com/link_draw/v2";
            var          type  = Lv3ListIndex == 0 ? "new" : "hot";
            var          count = para.Count > 20 ? 20 : para.Count;

            switch (SubListIndex)
            {
            default:
                query = $"{api}/Doc/list?category=all&type={type}&page_num={para.PageIndex - 1}&page_size={count}";
                break;

            case 1:
                query = $"{api}/Photo/list?category=cos&type={type}&page_num={para.PageIndex - 1}&page_size={count}";
                break;

            case 2:
                query = $"{api}/Photo/list?category=sifu&type={type}&page_num={para.PageIndex - 1}&page_size={count}";
                break;
            }
            var net     = new NetSwap(Settings);
            var jsonres = await net.Client.GetAsync(query, token);

            var jsonstr = await jsonres.Content.ReadAsStringAsync();

            return(await Task.Run(() =>
            {
                dynamic listobj = JsonConvert.DeserializeObject(jsonstr);
                var items = new ImageItems();
                if (listobj?.data?.items == null)
                {
                    return items;
                }
                foreach (var item in listobj.data.items)
                {
                    var img = new ImageItem(this, para);
                    img.Author = $"{item.user?.name}";
                    img.Id = (int)item.item.doc_id;
                    var i0 = item.item?.pictures[0];
                    if (i0?.img_width != null)
                    {
                        img.Width = (int)i0.img_width;
                    }
                    if (i0?.img_height != null)
                    {
                        img.Height = (int)i0.img_height;
                    }
                    if (img.Width > 0 && img.Height > 0)
                    {
                        var turl = img.Width > img.Height ? $"{i0?.img_src}@512w_{(int) (512d * img.Height / img.Width)}h_1e" :
                                   $"{i0?.img_src}@{(int) (512d * img.Width / img.Height)}w_512h_1e";
                        img.Urls.Add(new UrlInfo("缩略图", 1, $"{turl}", HomeUrl));
                    }
                    else
                    {
                        img.Urls.Add(new UrlInfo("缩略图", 1, $"{i0?.img_src}@512w_512h_1e", HomeUrl));
                    }
                    img.Urls.Add(new UrlInfo("原图", 4, $"{i0?.img_src}"));

                    img.DetailUrl = $"https://h.bilibili.com/{img.Id}";
                    img.Title = $"{item.item?.title}";

                    var list = (JArray)item.item.pictures;

                    if (list.Count > 1)
                    {
                        foreach (var pic in item.item.pictures)
                        {
                            var child = new ImageItem(this, para);
                            child.Urls.Add(new UrlInfo("缩略图", 1, $"{pic.img_src}@512w_512h_1e", HomeUrl));
                            child.Urls.Add(new UrlInfo("原图", 4, $"{pic.img_src}"));
                            if (pic.img_width != null)
                            {
                                child.Width = (int)pic.img_width;
                            }
                            if (pic.img_height != null)
                            {
                                child.Height = (int)pic.img_height;
                            }

                            img.ChilldrenItems.Add(child);
                        }
                    }

                    items.Add(img);
                }
                return items;
            }, token));
        }
예제 #26
0
        public async Task <ImageItems> GetRealPageImagesAsyncFromXml(SearchPara para, CancellationToken token)
        {
            var client = new NetSwap(Settings).Client;
            var query  = GetPageQuery(para);
            var xmlres = await client.GetAsync(query, token);

            var xmlstr = await xmlres.Content.ReadAsStreamAsync();

            return(await Task.Run(() =>
            {
                var xml = XDocument.Load(xmlstr);
                var imageitems = new ImageItems();
                if (xml.Root == null)
                {
                    return imageitems;
                }
                foreach (var post in xml.Root.Elements())
                {
                    token.ThrowIfCancellationRequested();
                    var img = new ImageItem(this, para);

                    int.TryParse(post.Attribute("id")?.Value, out var id);
                    img.Id = id;
                    var tags = post.Attribute("tags")?.Value ?? "";
                    foreach (var tag in tags.Split(' '))
                    {
                        if (!string.IsNullOrWhiteSpace(tag))
                        {
                            img.Tags.Add(tag.Trim());
                        }
                    }
                    int.TryParse(post.Attribute("width")?.Value, out var width);
                    img.Width = width;
                    int.TryParse(post.Attribute("height")?.Value, out var height);
                    img.Height = height;
                    img.Author = post.Attribute("author")?.Value;
                    img.Source = post.Attribute("source")?.Value;
                    img.IsExplicit = post.Attribute("rating")?.Value.ToLower() != "s";
                    img.DetailUrl = GetDetailPageUrl(img);
                    img.Site = this;
                    double.TryParse(post.Attribute("created_at")?.Value, out var creatat);
                    if (creatat > 0)
                    {
                        img.CreatTime = new DateTime(1970, 1, 1, 0, 0, 0, 0) + TimeSpan.FromSeconds(creatat);
                    }
                    int.TryParse(post.Attribute("score")?.Value, out var score);
                    img.Score = score;
                    ulong.TryParse(post.Attribute("file_size")?.Value, out var filesize);

                    img.Urls.Add(new UrlInfo("缩略图", 1, UrlPre + post.Attribute("preview_url")?.Value, GetThumbnailReferer(img)));
                    img.Urls.Add(new UrlInfo("预览图", 2, UrlPre + post.Attribute("sample_url")?.Value, GetThumbnailReferer(img)));
                    img.Urls.Add(new UrlInfo("Jpeg图", 3, UrlPre + post.Attribute("jpeg_url")?.Value, GetThumbnailReferer(img)));
                    img.Urls.Add(new UrlInfo("原图", 4, UrlPre + post.Attribute("file_url")?.Value, img.DetailUrl)
                    {
                        Md5 = post.Attribute("md5")?.Value,
                        BiteSize = filesize,
                    });

                    imageitems.Add(img);
                }
                return imageitems;
            }, token));
        }
예제 #27
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            if (!IsLogin)
            {
                Net = new NetSwap(Settings, HomeUrl);
                const string loginUrl = "http://yuriimg.com/account/login";

                string
                    boundary    = $"---------------{DateTime.Now.Ticks:x}", //开始边界符
                    pboundary   = $"--{boundary}",                          //分隔边界符
                    endBoundary = $"--{boundary}--\r\n",                    // 结束边界符
                    postData    = $"{pboundary}\r\nContent-Disposition: form-data; name=\"username\"\r\n\r\n{User}\r\n{pboundary}\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n{Pass}\r\n{endBoundary}";

                var respose = await Net.Client.PostAsync(loginUrl, new StringContent(postData), token);

                if (respose.IsSuccessStatusCode)
                {
                    IsLogin = true;
                }
                else
                {
                    return(new ImageItems());
                }
                //retData = Sweb.Post(loginUrl, postData, Settings.Proxy, shc);
                //cookie = Sweb.GetURLCookies(HomeUrl);

                //if (retData.Contains("-2"))
                //{
                //    throw new Exception("密码错误");
                //}
                //else if ((!cookie.Contains("otome_")))
                //{
                //    throw new Exception("登录时出错");
                //}
            }

            var url = $"{HomeUrl}/post/{para.PageIndex}.html";

            // string url = "http://yuriimg.com/show/ge407xd5o.jpg";

            if (para.Keyword.Length > 0)
            {
                //http://yuriimg.com/search/index/tags/?/p/?.html
                url = $"{HomeUrl}/search/index/tags/{para.Keyword}/p/{para.PageIndex}.html";
            }

            var pageSource = await Net.Client.GetAsync(url, token);

            var pageStr = await pageSource.Content.ReadAsStringAsync();

            var list = new ImageItems();

            var dococument = new HtmlDocument();

            dococument.LoadHtml(pageStr);
            var imageItems = dococument.DocumentNode.SelectNodes("//*[@class='image-list cl']");

            if (imageItems == null)
            {
                return(list);
            }
            foreach (var imageItem in imageItems)
            {
                var imgNode = imageItem.SelectSingleNode("./div[1]/img");
                var tags    = imgNode.Attributes["alt"].Value;
                var img     = new ImageItem(this, para);
                img.Height      = Convert.ToInt32(imageItem.SelectSingleNode(".//div[@class='image']").Attributes["data-height"].Value);
                img.Width       = Convert.ToInt32(imageItem.SelectSingleNode(".//div[@class='image']").Attributes["data-width"].Value);
                img.Author      = imageItem.SelectSingleNode("//small/a").InnerText;
                img.Description = tags;
                img.Id          = StringToInt(imgNode.Attributes["id"].Value);
                img.DetailUrl   = HomeUrl + imgNode.Attributes["data-href"].Value;
                img.Score       = Convert.ToInt32(imageItem.SelectSingleNode(".//span[@class='num']").InnerText);
                img.Site        = this;
                img.Net         = null;
                img.Urls.Add(new UrlInfo("缩略图", 1, imgNode.Attributes["data-original"].Value.Replace("!single", "!320px"), HomeUrl));
                foreach (var tag in tags.Split(' '))
                {
                    //if (tag.Contains("画师:")) continue;
                    if (!string.IsNullOrWhiteSpace(tag))
                    {
                        img.Tags.Add(tag.Trim());
                    }
                }

                img.GetDetailAction = async() =>
                {
                    try
                    {
                        var html = await Net.Client.GetStringAsync(img.DetailUrl);

                        var doc = new HtmlDocument();
                        doc.LoadHtml(html);
                        var showIndexs  = doc.DocumentNode.SelectSingleNode("//div[@class='logo']");
                        var imgDownNode = showIndexs.SelectSingleNode("//div[@class='img-control']");
                        var nodeHtml    = showIndexs.OuterHtml;
                        img.Date = TimeConvert(nodeHtml);

                        img.Source = nodeHtml.Contains("pixiv page") ?
                                     showIndexs.SelectSingleNode(".//a[@target='_blank']").Attributes["href"].Value :
                                     Regex.Match(nodeHtml, @"(?<=源地址).*?(?=</p>)").Value.Trim();
                        img.Urls.Add(new UrlInfo("缩略图", 1, doc.DocumentNode.SelectSingleNode("//figure[@class=\'show-image\']/img").Attributes["src"].Value, HomeUrl));
                        var    previww = doc.DocumentNode.SelectSingleNode("//figure[@class=\'show-image\']/img").Attributes["src"].Value;
                        string file;
                        if (Regex.Matches(imgDownNode.OuterHtml, "href").Count > 1)
                        {
                            file = HomeUrl + imgDownNode.SelectSingleNode("./a[1]").Attributes["href"].Value;
                            //item.FileSize = Regex.Match(imgDownNode.SelectSingleNode("./a[1]").InnerText, @"(?<=().*?(?=))").Value;
                        }
                        else
                        {
                            file = HomeUrl + imgDownNode.SelectSingleNode("./a").Attributes["href"].Value;
                            //item.FileSize = Regex.Match(imgDownNode.SelectSingleNode("./a").InnerText, @"(?<=().*?(?=))").Value;
                        }
                        img.Urls.Add(new UrlInfo("原图", 4, file, HomeUrl));
                        img.Urls.Add(new UrlInfo("预览图", 2, previww.Length > 0 ? previww : file, HomeUrl));
                    }
                    catch (Exception ex)
                    {
                        App.Log(ex);
                    }
                };

                list.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(list);
        }
예제 #28
0
        public override async Task <ImageItems> GetRealPageImagesAsync(SearchPara para, CancellationToken token)
        {
            // logon
            if (!IsLogon)
            {
                Net = new NetSwap(Settings, HomeUrl);
                var index    = new Random().Next(0, _user.Length);
                var loginurl = "https://www.zerochan.net/login";

                var response = await Net.Client.PostAsync(loginurl,
                                                          new StringContent($"ref=%2F&login=Login&name={_user[index]}&password={_pass[index]}"), token);

                if (response.IsSuccessStatusCode)
                {
                    IsLogon = true;
                }
            }
            if (!IsLogon)
            {
                return(new ImageItems());
            }

            // get page source
            var 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
                {
                    App.ShowMessage("搜索失败,请检查您输入的关键词");
                    return(new ImageItems());
                }

                pageString = await respose.Content.ReadAsStringAsync();

                _beforeWord = para.Keyword;
            }
            else
            {
                //Net.Client.DefaultRequestHeaders.Referrer = new Uri(beforeUrl);
                url = string.IsNullOrWhiteSpace(para.Keyword) ? url : _beforeUrl + "?p=" + para.PageIndex;
                var res = await Net.Client.GetAsync(url, token);

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

            // images
            var imgs = new ImageItems();

            var doc = new HtmlDocument();

            doc.LoadHtml(pageString);
            //retrieve all elements via xpath

            HtmlNodeCollection nodes;

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

            foreach (var imgNode in nodes)
            {
                var img   = new ImageItem(this, para);
                var strId = imgNode.SelectSingleNode("a").Attributes["href"].Value;
                int.TryParse(strId.Substring(1), out var id);
                var fav = imgNode.SelectSingleNode("a/span")?.InnerText;
                if (!string.IsNullOrWhiteSpace(fav))
                {
                    int.TryParse(Regex.Replace(fav, @"[^0-9]+", ""), out var score);
                    img.Score = score;
                }
                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 (!string.IsNullOrWhiteSpace(previewUrl))
                {
                    sampleUrl = previewUrl?.Replace("240", "600");
                    fileUrl   = Regex.Replace(previewUrl, "^(.+?)zerochan.net/", "https://static.zerochan.net/").Replace("240", "full");
                }

                var resandfilesize = imgHref?.Attributes["title"].Value;
                var dimension      = resandfilesize?.Substring(0, resandfilesize.IndexOf(' '));
                var fileSize       = resandfilesize?.Substring(resandfilesize.IndexOf(' ')).Trim();
                var title          = imgHref?.Attributes["alt"].Value;

                int width = 0, height = 0;
                try
                {
                    //706x1000
                    width  = int.Parse(dimension.Substring(0, dimension.IndexOf('x')));
                    height = int.Parse(dimension.Substring(dimension.IndexOf('x') + 1));
                }
                catch { }

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

                //img.FileSize = fileSize?.ToUpper();
                img.Description = title;
                img.Title       = title;
                img.Id          = id;

                img.Urls.Add(new UrlInfo("缩略图", 1, previewUrl, HomeUrl));
                img.Urls.Add(new UrlInfo("预览图", 2, sampleUrl, HomeUrl));
                img.Urls.Add(new UrlInfo("原图", 4, fileUrl, img.DetailUrl));
                img.Width     = width;
                img.Height    = height;
                img.DetailUrl = $"{HomeUrl}/{id}";

                if (fileSize != null)
                {
                    //img.FileSize = new Regex(@"\d+").Match(img.FileSize).Value;
                    //var fs = Convert.ToInt32(img.FileSize);
                    //img.FileSize = (fs > 1024 ? (fs / 1024.0).ToString("0.00MB") : fs.ToString("0KB"));
                }

                imgs.Add(img);
            }
            token.ThrowIfCancellationRequested();
            return(imgs);
        }