Пример #1
0
 public void ReplaceOrAddPage(BLPage page)
 {
     if (page.CurrentPageNumber != -1)
     {
         LoadedPages.RemoveAll(lp => lp.CurrentPageNumber == page.CurrentPageNumber);
         LoadedPages.Add(RemoveQuotesAndRepeats(page));
     }
     Debug.WriteLine("Invalid page added");
 }
Пример #2
0
        public BLPage GetBLPageByPageNumber(int pageNumber)
        {
            if (LoadedPages.Any(lp => lp.CurrentPageNumber == pageNumber))
            {
                return(LoadedPages.First(lp => lp.CurrentPageNumber == pageNumber));
            }
            string pageUrl = OpeningPostUrl;

            if (OpeningPostUrl.Contains('/'))
            {
                pageUrl = OpeningPostUrl.Substring(0, OpeningPostUrl.LastIndexOf('/'));
            }
            var pageUrlIdentity = OpeningPostUrl.Split('/').Last().Split('?')[0];
            var bPage           = new BLPage(string.Format(pageByUrlFormat, pageUrl, pageUrlIdentity, pageNumber));

            LoadedPages.Add(RemoveQuotesAndRepeats(bPage));
            return(bPage);
        }
Пример #3
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("搜索完毕");
        }
Пример #4
0
        /// <summary>
        /// 搜索下一页
        /// </summary>
        public async Task SearchNextPageAsync(CancellationToken token)
        {
            var        newVPage = new SearchedPage(); // 建立虚拟页信息
            var        images   = new MoeItems();
            SearchPara tempPara;

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

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

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

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

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

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

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

                    foreach (var item in imagesNextRPage)
                    {
                        if (images.Count < tempPara.Count)
                        {
                            images.Add(item);                                // 添加图片数量直到够参数设定的图片数量为止
                        }
                        else
                        {
                            newVPage.PreLoadNextPageItems.Add(item);  // 多出来的图片存在另一个对象中,下一虚拟页可以调用
                        }
                    }
                    if (images.Count >= tempPara.Count)
                    {
                        break;                                 // 数量已够参数数量,当前虚拟页完成任务
                    }
                }
                if (DateTime.Now - startTime > TimeSpan.FromSeconds(30))
                {
                    break;                                                      // loop超时跳出循环(即使不够数量也跳出)
                }
            }
            token.ThrowIfCancellationRequested();
            // Load end
            newVPage.ImageItems = images;
            LoadedPages.Add(newVPage);
            if (images.Message != null)
            {
                Extend.ShowMessage(images.Message);
            }
            if (images.Ex != null)
            {
                Extend.ShowMessage(images.Ex.Message, images.Ex.ToString(), Extend.MessagePos.Window);
            }
            Extend.ShowMessage("搜索完毕", null, Extend.MessagePos.Searching);
        }
Пример #5
0
 public BLPage RemoveQuotesAndRepeats(BLPage newPage)
 {
     newPage.Images.RemoveAll(im => LoadedPages.Any(lp => lp.Images.Any(lpi => lpi.Url == im.Url)));
     return(newPage);
 }