コード例 #1
0
ファイル: SearchSession.cs プロジェクト: fengdix4/MoeLoaderP
        /// <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);
        }