mirror of
https://github.com/amtoaer/bili-sync.git
synced 2026-05-06 20:42:48 +08:00
perf: 避免一些常见场景的字符串拷贝,略微提升性能 (#687)
This commit is contained in:
@@ -429,7 +429,7 @@ mod tests {
|
|||||||
let config = VersionedConfig::get().read();
|
let config = VersionedConfig::get().read();
|
||||||
for (bvid, video_quality, video_codec, audio_quality) in testcases.into_iter() {
|
for (bvid, video_quality, video_codec, audio_quality) in testcases.into_iter() {
|
||||||
let client = BiliClient::new();
|
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 pages = video.get_pages().await.expect("failed to get pages");
|
||||||
let first_page = pages.into_iter().next().expect("no page found");
|
let first_page = pages.into_iter().next().expect("no page found");
|
||||||
let best_stream = video
|
let best_stream = video
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ mod tests {
|
|||||||
.into_mixin_key()
|
.into_mixin_key()
|
||||||
.context("no mixin key")?;
|
.context("no mixin key")?;
|
||||||
set_global_mixin_key(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?;
|
let pages = video.get_pages().await?;
|
||||||
println!("pages: {:?}", pages);
|
println!("pages: {:?}", pages);
|
||||||
let subtitles = video.get_subtitles(&pages[0]).await?;
|
let subtitles = video.get_subtitles(&pages[0]).await?;
|
||||||
@@ -344,7 +344,7 @@ mod tests {
|
|||||||
("BV16w41187fx", (true, true)), // 充电专享但有权观看
|
("BV16w41187fx", (true, true)), // 充电专享但有权观看
|
||||||
("BV1n34jzPEYq", (false, false)), // 普通视频
|
("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 info = video.get_view_info().await?;
|
||||||
let VideoInfo::Detail {
|
let VideoInfo::Detail {
|
||||||
is_upower_exclusive,
|
is_upower_exclusive,
|
||||||
@@ -377,7 +377,7 @@ mod tests {
|
|||||||
("BV13xtnzPEye", false), // 番剧
|
("BV13xtnzPEye", false), // 番剧
|
||||||
("BV1kT4NzTEZj", true), // 普通视频
|
("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 info = video.get_view_info().await?;
|
||||||
let VideoInfo::Detail { redirect_url, .. } = info else {
|
let VideoInfo::Detail { redirect_url, .. } = info else {
|
||||||
unreachable!();
|
unreachable!();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use futures::TryStreamExt;
|
|||||||
use futures::stream::FuturesUnordered;
|
use futures::stream::FuturesUnordered;
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
use reqwest::Method;
|
use reqwest::Method;
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
use crate::bilibili::analyzer::PageAnalyzer;
|
use crate::bilibili::analyzer::PageAnalyzer;
|
||||||
use crate::bilibili::client::BiliClient;
|
use crate::bilibili::client::BiliClient;
|
||||||
@@ -12,7 +13,7 @@ use crate::bilibili::{Credential, ErrorForStatusExt, MIXIN_KEY, Validate, VideoI
|
|||||||
|
|
||||||
pub struct Video<'a> {
|
pub struct Video<'a> {
|
||||||
client: &'a BiliClient,
|
client: &'a BiliClient,
|
||||||
pub bvid: String,
|
pub bvid: &'a str,
|
||||||
credential: &'a Credential,
|
credential: &'a Credential,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ pub struct Dimension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Video<'a> {
|
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 {
|
Self {
|
||||||
client,
|
client,
|
||||||
bvid,
|
bvid,
|
||||||
@@ -85,7 +86,7 @@ impl<'a> Video<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_tags(&self) -> Result<Vec<String>> {
|
pub async fn get_tags(&self) -> Result<Vec<String>> {
|
||||||
let res = self
|
let mut res = self
|
||||||
.client
|
.client
|
||||||
.request(
|
.request(
|
||||||
Method::GET,
|
Method::GET,
|
||||||
@@ -101,10 +102,10 @@ impl<'a> Video<'a> {
|
|||||||
.await?
|
.await?
|
||||||
.validate()?;
|
.validate()?;
|
||||||
Ok(res["data"]
|
Ok(res["data"]
|
||||||
.as_array()
|
.as_array_mut()
|
||||||
.context("tags is not an array")?
|
.context("tags is not an array")?
|
||||||
.iter()
|
.iter_mut()
|
||||||
.filter_map(|v| v["tag_name"].as_str().map(String::from))
|
.filter_map(|v| if let Value::String(s) = v.take() { Some(s) } else { None })
|
||||||
.collect())
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,7 +155,7 @@ impl<'a> Video<'a> {
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.query(&[
|
.query(&[
|
||||||
("bvid", self.bvid.as_str()),
|
("bvid", self.bvid),
|
||||||
("qn", "127"),
|
("qn", "127"),
|
||||||
("otype", "json"),
|
("otype", "json"),
|
||||||
("fnval", "4048"),
|
("fnval", "4048"),
|
||||||
@@ -176,7 +177,7 @@ impl<'a> Video<'a> {
|
|||||||
.client
|
.client
|
||||||
.request(Method::GET, "https://api.bilibili.com/x/player/wbi/v2", self.credential)
|
.request(Method::GET, "https://api.bilibili.com/x/player/wbi/v2", self.credential)
|
||||||
.await
|
.await
|
||||||
.query(&[("bvid", self.bvid.as_str())])
|
.query(&[("bvid", self.bvid)])
|
||||||
.query(&[("cid", page.cid)])
|
.query(&[("cid", page.cid)])
|
||||||
.wbi_sign(MIXIN_KEY.load().as_deref())?
|
.wbi_sign(MIXIN_KEY.load().as_deref())?
|
||||||
.send()
|
.send()
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ mod tests {
|
|||||||
VersionedConfig::init_for_test(&setup_database(Path::new("./test.sqlite")).await?).await?;
|
VersionedConfig::init_for_test(&setup_database(Path::new("./test.sqlite")).await?).await?;
|
||||||
let config = VersionedConfig::get().read();
|
let config = VersionedConfig::get().read();
|
||||||
let client = BiliClient::new();
|
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 pages = video.get_pages().await.expect("failed to get pages");
|
||||||
let first_page = pages.into_iter().next().expect("no page found");
|
let first_page = pages.into_iter().next().expect("no page found");
|
||||||
let mut page_analyzer = video
|
let mut page_analyzer = video
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ pub async fn fetch_video_details(
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|video_model| async move {
|
.map(|video_model| async move {
|
||||||
let _permit = semaphore_ref.acquire().await.context("acquire semaphore failed")?;
|
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;
|
let info: Result<_> = async { Ok((video.get_tags().await?, video.get_view_info().await?)) }.await;
|
||||||
match info {
|
match info {
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
@@ -606,7 +606,7 @@ pub async fn fetch_page_video(
|
|||||||
if !should_run {
|
if !should_run {
|
||||||
return Ok(ExecutionStatus::Skipped);
|
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
|
let streams = bili_video
|
||||||
.get_page_analyzer(page_info)
|
.get_page_analyzer(page_info)
|
||||||
.await?
|
.await?
|
||||||
@@ -660,7 +660,7 @@ pub async fn fetch_page_danmaku(
|
|||||||
if !should_run {
|
if !should_run {
|
||||||
return Ok(ExecutionStatus::Skipped);
|
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
|
bili_video
|
||||||
.get_danmaku_writer(page_info)
|
.get_danmaku_writer(page_info)
|
||||||
.await?
|
.await?
|
||||||
@@ -679,7 +679,7 @@ pub async fn fetch_page_subtitle(
|
|||||||
if !should_run {
|
if !should_run {
|
||||||
return Ok(ExecutionStatus::Skipped);
|
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 subtitles = bili_video.get_subtitles(page_info).await?;
|
||||||
let tasks = subtitles
|
let tasks = subtitles
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|||||||
Reference in New Issue
Block a user