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); }
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("&", "&")}"; //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); } }
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; //}); } } }
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; }; }
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; } }); } }
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) => { }); } }
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(""", "\""); 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); } }
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); } }
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)); }
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(); }
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)); } }
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); } }
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); } } }
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); }
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); }
/// <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("搜索完毕"); }
/// <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--; } }
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); }
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); } } }
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("&", "&"); } 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); }
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); }
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"]); }
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); }
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)); }
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)); }
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); }
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); }