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(()) }