From 45849957ffa7a9f17bfaac2f191995f7b4289af3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=80=E1=B4=8D=E1=B4=9B=E1=B4=8F=E1=B4=80=E1=B4=87?= =?UTF-8?q?=CA=80?= Date: Mon, 2 Jun 2025 00:56:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E8=A7=86=E9=A2=91=E8=AF=A6=E6=83=85=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E6=80=A7=E8=83=BD=20(#350)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/bili_sync/src/workflow.rs | 69 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/crates/bili_sync/src/workflow.rs b/crates/bili_sync/src/workflow.rs index 9c97022..47bb1e0 100644 --- a/crates/bili_sync/src/workflow.rs +++ b/crates/bili_sync/src/workflow.rs @@ -103,39 +103,46 @@ pub async fn fetch_video_details( ) -> Result<()> { video_source.log_fetch_video_start(); let videos_model = filter_unfilled_videos(video_source.filter_expr(), connection).await?; - for video_model in videos_model { - let video = Video::new(bili_client, video_model.bvid.clone()); - let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await; - match info { - Err(e) => { - error!( - "获取视频 {} - {} 的详细信息失败,错误为:{:#}", - &video_model.bvid, &video_model.name, e - ); - if let Some(BiliError::RequestFailed(-404, _)) = e.downcast_ref::() { - let mut video_active_model: bili_sync_entity::video::ActiveModel = video_model.into(); - video_active_model.valid = Set(false); - video_active_model.save(connection).await?; - } - } - Ok((tags, mut view_info)) => { - let VideoInfo::Detail { pages, .. } = &mut view_info else { - unreachable!() + let tasks = videos_model + .into_iter() + .map(|video_model| { + async move { + let video = Video::new(bili_client, video_model.bvid.clone()); + let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await; + match info { + Err(e) => { + error!( + "获取视频 {} - {} 的详细信息失败,错误为:{:#}", + &video_model.bvid, &video_model.name, e + ); + if let Some(BiliError::RequestFailed(-404, _)) = e.downcast_ref::() { + let mut video_active_model: bili_sync_entity::video::ActiveModel = video_model.into(); + video_active_model.valid = Set(false); + video_active_model.save(connection).await?; + } + } + Ok((tags, mut view_info)) => { + let VideoInfo::Detail { pages, .. } = &mut view_info else { + unreachable!() + }; + let pages = std::mem::take(pages); + let pages_len = pages.len(); + let txn = connection.begin().await?; + // 将分页信息写入数据库 + create_pages(pages, &video_model, &txn).await?; + let mut video_active_model = view_info.into_detail_model(video_model); + video_source.set_relation_id(&mut video_active_model); + video_active_model.single_page = Set(Some(pages_len == 1)); + video_active_model.tags = Set(Some(serde_json::to_value(tags)?)); + video_active_model.save(&txn).await?; + txn.commit().await?; + } }; - let pages = std::mem::take(pages); - let pages_len = pages.len(); - let txn = connection.begin().await?; - // 将分页信息写入数据库 - create_pages(pages, &video_model, &txn).await?; - let mut video_active_model = view_info.into_detail_model(video_model); - video_source.set_relation_id(&mut video_active_model); - video_active_model.single_page = Set(Some(pages_len == 1)); - video_active_model.tags = Set(Some(serde_json::to_value(tags)?)); - video_active_model.save(&txn).await?; - txn.commit().await?; + Ok::<_, anyhow::Error>(()) } - }; - } + }) + .collect::>(); + tasks.try_collect::>().await?; video_source.log_fetch_video_end(); Ok(()) }