refactor: 下载部分使用 tokio 的封装代替手动实现 (#245)

This commit is contained in:
ᴀᴍᴛᴏᴀᴇʀ
2025-02-05 02:33:15 +08:00
committed by GitHub
parent 7097b2a6b9
commit 9d8e398cbe
4 changed files with 9 additions and 10 deletions

5
Cargo.lock generated
View File

@@ -414,6 +414,7 @@ dependencies = [
"strum",
"thiserror 2.0.11",
"tokio",
"tokio-util",
"toml",
"tracing",
"tracing-subscriber",
@@ -3274,9 +3275,9 @@ dependencies = [
[[package]]
name = "tokio-util"
version = "0.7.11"
version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
dependencies = [
"bytes",
"futures-core",

View File

@@ -61,6 +61,7 @@ serde_urlencoded = "0.7.1"
strum = { version = "0.26.3", features = ["derive"] }
thiserror = "2.0.11"
tokio = { version = "1.43.0", features = ["full"] }
tokio-util = { version = "0.7.13", features = ["io"] }
toml = "0.8.19"
tracing = "0.1.41"
tracing-subscriber = { version = "0.3.19", features = ["chrono"] }

View File

@@ -41,6 +41,7 @@ serde_urlencoded = { workspace = true }
strum = { workspace = true }
thiserror = { workspace = true }
tokio = { workspace = true }
tokio-util = { workspace = true }
toml = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }

View File

@@ -2,10 +2,11 @@ use core::str;
use std::path::Path;
use anyhow::{bail, ensure, Result};
use futures::StreamExt;
use futures::TryStreamExt;
use reqwest::Method;
use tokio::fs::{self, File};
use tokio::io::AsyncWriteExt;
use tokio_util::io::StreamReader;
use crate::bilibili::Client;
pub struct Downloader {
@@ -27,13 +28,8 @@ impl Downloader {
let mut file = File::create(path).await?;
let resp = self.client.request(Method::GET, url, None).send().await?;
let expected = resp.content_length().unwrap_or_default();
let mut received = 0u64;
let mut stream = resp.bytes_stream();
while let Some(bytes) = stream.next().await {
let bytes = bytes?;
received += bytes.len() as u64;
file.write_all(&bytes).await?;
}
let mut stream_reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other));
let received = tokio::io::copy(&mut stream_reader, &mut file).await?;
file.flush().await?;
ensure!(
received >= expected,