From 1c68f13c54604aae2a623cec4c6d9c2d455cfc01 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: Wed, 25 Mar 2026 12:21:11 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E9=81=BF=E5=85=8D=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=B8=B8=E8=A7=81=E5=9C=BA=E6=99=AF=E7=9A=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E6=8B=B7=E8=B4=9D=EF=BC=8C=E7=95=A5=E5=BE=AE=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E6=80=A7=E8=83=BD=20(#687)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/bili_sync/src/bilibili/analyzer.rs | 2 +- crates/bili_sync/src/bilibili/mod.rs | 6 +++--- crates/bili_sync/src/bilibili/video.rs | 17 +++++++++-------- crates/bili_sync/src/downloader.rs | 2 +- crates/bili_sync/src/workflow.rs | 8 ++++---- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/crates/bili_sync/src/bilibili/analyzer.rs b/crates/bili_sync/src/bilibili/analyzer.rs index cbbb0e5..59f3f85 100644 --- a/crates/bili_sync/src/bilibili/analyzer.rs +++ b/crates/bili_sync/src/bilibili/analyzer.rs @@ -429,7 +429,7 @@ mod tests { let config = VersionedConfig::get().read(); for (bvid, video_quality, video_codec, audio_quality) in testcases.into_iter() { let client = BiliClient::new(); - let video = Video::new(&client, bvid.to_owned(), &config.credential); + let video = Video::new(&client, bvid, &config.credential); let pages = video.get_pages().await.expect("failed to get pages"); let first_page = pages.into_iter().next().expect("no page found"); let best_stream = video diff --git a/crates/bili_sync/src/bilibili/mod.rs b/crates/bili_sync/src/bilibili/mod.rs index c7ed37e..e4028cc 100644 --- a/crates/bili_sync/src/bilibili/mod.rs +++ b/crates/bili_sync/src/bilibili/mod.rs @@ -313,7 +313,7 @@ mod tests { .into_mixin_key() .context("no mixin key")?; set_global_mixin_key(mixin_key); - let video = Video::new(&bili_client, "BV1gLfnY8E6D".to_string(), &credential); + let video = Video::new(&bili_client, "BV1gLfnY8E6D", &credential); let pages = video.get_pages().await?; println!("pages: {:?}", pages); let subtitles = video.get_subtitles(&pages[0]).await?; @@ -344,7 +344,7 @@ mod tests { ("BV16w41187fx", (true, true)), // 充电专享但有权观看 ("BV1n34jzPEYq", (false, false)), // 普通视频 ] { - let video = Video::new(&bili_client, bvid.to_string(), credential); + let video = Video::new(&bili_client, bvid, credential); let info = video.get_view_info().await?; let VideoInfo::Detail { is_upower_exclusive, @@ -377,7 +377,7 @@ mod tests { ("BV13xtnzPEye", false), // 番剧 ("BV1kT4NzTEZj", true), // 普通视频 ] { - let video = Video::new(&bili_client, bvid.to_string(), credential); + let video = Video::new(&bili_client, bvid, credential); let info = video.get_view_info().await?; let VideoInfo::Detail { redirect_url, .. } = info else { unreachable!(); diff --git a/crates/bili_sync/src/bilibili/video.rs b/crates/bili_sync/src/bilibili/video.rs index b1a67c0..8617971 100644 --- a/crates/bili_sync/src/bilibili/video.rs +++ b/crates/bili_sync/src/bilibili/video.rs @@ -3,6 +3,7 @@ use futures::TryStreamExt; use futures::stream::FuturesUnordered; use prost::Message; use reqwest::Method; +use serde_json::Value; use crate::bilibili::analyzer::PageAnalyzer; use crate::bilibili::client::BiliClient; @@ -12,7 +13,7 @@ use crate::bilibili::{Credential, ErrorForStatusExt, MIXIN_KEY, Validate, VideoI pub struct Video<'a> { client: &'a BiliClient, - pub bvid: String, + pub bvid: &'a str, credential: &'a Credential, } @@ -35,7 +36,7 @@ pub struct Dimension { } impl<'a> Video<'a> { - pub fn new(client: &'a BiliClient, bvid: String, credential: &'a Credential) -> Self { + pub fn new(client: &'a BiliClient, bvid: &'a str, credential: &'a Credential) -> Self { Self { client, bvid, @@ -85,7 +86,7 @@ impl<'a> Video<'a> { } pub async fn get_tags(&self) -> Result> { - let res = self + let mut res = self .client .request( Method::GET, @@ -101,10 +102,10 @@ impl<'a> Video<'a> { .await? .validate()?; Ok(res["data"] - .as_array() + .as_array_mut() .context("tags is not an array")? - .iter() - .filter_map(|v| v["tag_name"].as_str().map(String::from)) + .iter_mut() + .filter_map(|v| if let Value::String(s) = v.take() { Some(s) } else { None }) .collect()) } @@ -154,7 +155,7 @@ impl<'a> Video<'a> { ) .await .query(&[ - ("bvid", self.bvid.as_str()), + ("bvid", self.bvid), ("qn", "127"), ("otype", "json"), ("fnval", "4048"), @@ -176,7 +177,7 @@ impl<'a> Video<'a> { .client .request(Method::GET, "https://api.bilibili.com/x/player/wbi/v2", self.credential) .await - .query(&[("bvid", self.bvid.as_str())]) + .query(&[("bvid", self.bvid)]) .query(&[("cid", page.cid)]) .wbi_sign(MIXIN_KEY.load().as_deref())? .send() diff --git a/crates/bili_sync/src/downloader.rs b/crates/bili_sync/src/downloader.rs index 2760a95..d59c75a 100644 --- a/crates/bili_sync/src/downloader.rs +++ b/crates/bili_sync/src/downloader.rs @@ -308,7 +308,7 @@ mod tests { VersionedConfig::init_for_test(&setup_database(Path::new("./test.sqlite")).await?).await?; let config = VersionedConfig::get().read(); let client = BiliClient::new(); - let video = Video::new(&client, "BV1QJmaYKEv4".to_owned(), &config.credential); + let video = Video::new(&client, "BV1QJmaYKEv4", &config.credential); let pages = video.get_pages().await.expect("failed to get pages"); let first_page = pages.into_iter().next().expect("no page found"); let mut page_analyzer = video diff --git a/crates/bili_sync/src/workflow.rs b/crates/bili_sync/src/workflow.rs index 917581f..af3bef3 100644 --- a/crates/bili_sync/src/workflow.rs +++ b/crates/bili_sync/src/workflow.rs @@ -132,7 +132,7 @@ pub async fn fetch_video_details( .into_iter() .map(|video_model| async move { let _permit = semaphore_ref.acquire().await.context("acquire semaphore failed")?; - let video = Video::new(bili_client, video_model.bvid.clone(), &config.credential); + let video = Video::new(bili_client, video_model.bvid.as_str(), &config.credential); let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await; match info { Err(e) => { @@ -606,7 +606,7 @@ pub async fn fetch_page_video( if !should_run { return Ok(ExecutionStatus::Skipped); } - let bili_video = Video::new(cx.bili_client, video_model.bvid.clone(), &cx.config.credential); + let bili_video = Video::new(cx.bili_client, video_model.bvid.as_str(), &cx.config.credential); let streams = bili_video .get_page_analyzer(page_info) .await? @@ -660,7 +660,7 @@ pub async fn fetch_page_danmaku( if !should_run { return Ok(ExecutionStatus::Skipped); } - let bili_video = Video::new(cx.bili_client, video_model.bvid.clone(), &cx.config.credential); + let bili_video = Video::new(cx.bili_client, video_model.bvid.as_str(), &cx.config.credential); bili_video .get_danmaku_writer(page_info) .await? @@ -679,7 +679,7 @@ pub async fn fetch_page_subtitle( if !should_run { return Ok(ExecutionStatus::Skipped); } - let bili_video = Video::new(cx.bili_client, video_model.bvid.clone(), &cx.config.credential); + let bili_video = Video::new(cx.bili_client, video_model.bvid.as_str(), &cx.config.credential); let subtitles = bili_video.get_subtitles(page_info).await?; let tasks = subtitles .into_iter()