refactor: 优化填充视频详情时的性能 (#350)

This commit is contained in:
ᴀᴍᴛᴏᴀᴇʀ
2025-06-02 00:56:02 +08:00
committed by GitHub
parent 8510aa318e
commit 45849957ff
+38 -31
View File
@@ -103,39 +103,46 @@ pub async fn fetch_video_details(
) -> Result<()> { ) -> Result<()> {
video_source.log_fetch_video_start(); video_source.log_fetch_video_start();
let videos_model = filter_unfilled_videos(video_source.filter_expr(), connection).await?; let videos_model = filter_unfilled_videos(video_source.filter_expr(), connection).await?;
for video_model in videos_model { let tasks = videos_model
let video = Video::new(bili_client, video_model.bvid.clone()); .into_iter()
let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await; .map(|video_model| {
match info { async move {
Err(e) => { let video = Video::new(bili_client, video_model.bvid.clone());
error!( let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await;
"获取视频 {} - {} 的详细信息失败,错误为:{:#}", match info {
&video_model.bvid, &video_model.name, e Err(e) => {
); error!(
if let Some(BiliError::RequestFailed(-404, _)) = e.downcast_ref::<BiliError>() { "获取视频 {} - {} 的详细信息失败,错误为:{:#}",
let mut video_active_model: bili_sync_entity::video::ActiveModel = video_model.into(); &video_model.bvid, &video_model.name, e
video_active_model.valid = Set(false); );
video_active_model.save(connection).await?; if let Some(BiliError::RequestFailed(-404, _)) = e.downcast_ref::<BiliError>() {
} let mut video_active_model: bili_sync_entity::video::ActiveModel = video_model.into();
} video_active_model.valid = Set(false);
Ok((tags, mut view_info)) => { video_active_model.save(connection).await?;
let VideoInfo::Detail { pages, .. } = &mut view_info else { }
unreachable!() }
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); Ok::<_, anyhow::Error>(())
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?;
} }
}; })
} .collect::<FuturesUnordered<_>>();
tasks.try_collect::<Vec<_>>().await?;
video_source.log_fetch_video_end(); video_source.log_fetch_video_end();
Ok(()) Ok(())
} }