diff --git a/Cargo.lock b/Cargo.lock index a27ff06..f176c03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,6 +178,19 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "console" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -205,6 +218,12 @@ dependencies = [ "syn", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -664,6 +683,19 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "indicatif" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + [[package]] name = "ipnet" version = "2.10.1" @@ -775,6 +807,12 @@ dependencies = [ "tempfile", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.36.7" @@ -869,6 +907,7 @@ version = "0.1.0" dependencies = [ "clap", "futures", + "indicatif", "reqwest", "serde", "tokio", @@ -893,6 +932,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + [[package]] name = "proc-macro2" version = "1.0.92" @@ -1364,6 +1409,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "untrusted" version = "0.9.0" @@ -1510,6 +1561,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "windows-registry" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 518c48a..fbb0f91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ authors = ["David Schütte"] [dependencies] clap = { version = "4.5.23", features = ["derive", "std"] } futures = "0.3.31" +indicatif = "0.17.9" reqwest = { version = "0.12.9", features = ["json", "stream"] } serde = { version = "1.0.216", features = ["derive"] } tokio = { version = "1.42.0", default-features = false, features = ["full"] } diff --git a/src/main.rs b/src/main.rs index 73cd6b8..86c0fbc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use futures::TryFutureExt; +use indicatif::ProgressBar; use reqwest::{Client, Url}; use futures::stream::TryStreamExt; @@ -94,6 +95,7 @@ async fn download_file( query_url: Url, cli: Arc, sem: Arc, + bar: Arc, ) -> Result<(), std::io::Error> { let _permit = sem.clone().acquire_owned().await; let mut file = file; @@ -115,13 +117,14 @@ async fn download_file( if let Ok(fd) = fd { if let Ok(metadata) = fd.metadata().await { - println!("Skipping {}", file.title); + // println!("Skipping {}", file.title); if metadata.len() == selected_download.file_size { + bar.inc(1); return Ok(()); } } } - println!("Downloading {}", file.title); + // println!("Downloading {}", file.title); let mut fd = File::create(&filepath).await?; let mut reader = StreamReader::new( resp.bytes_stream() @@ -129,6 +132,8 @@ async fn download_file( ); copy(&mut reader, &mut fd).await?; + bar.inc(1); + Ok(()) } @@ -229,7 +234,7 @@ async fn main() -> Result<(), Box> { let downloads = all_files; let len = downloads.len(); - println!("Total files: {}", len); + let bar = Arc::new(ProgressBar::new(len as u64)); let mut handles = Vec::with_capacity(len); let sem = Arc::new(Semaphore::new(10)); @@ -238,6 +243,7 @@ async fn main() -> Result<(), Box> { let client = client.clone(); let cli = cli.clone(); let sem = sem.clone(); + let bar = bar.clone(); let job = tokio::spawn(download_file( file, @@ -246,6 +252,7 @@ async fn main() -> Result<(), Box> { query_url.clone(), cli, sem, + bar, )); handles.push(job); } @@ -254,5 +261,7 @@ async fn main() -> Result<(), Box> { job.await; } + bar.finish(); + Ok(()) }