diff --git a/src/main.rs b/src/main.rs index 83af561..5c878ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,9 @@ use wuwa_downloader::{ io::{ console::print_results, file::get_dir, - logging::{bytes_to_human, format_duration, log_error, setup_logging, calculate_total_size}, + logging::{ + bytes_to_human, calculate_total_size, format_duration, log_error, setup_logging, + }, }, network::client::{download_file, fetch_index, get_predownload}, }; @@ -137,52 +139,11 @@ fn main() { }); let should_stop_ctrlc = should_stop.clone(); - let success_ctrlc = success.clone(); - let folder_ctrlc = folder.clone(); - let log_file_ctrlc = log_file.try_clone().unwrap(); ctrlc::set_handler(move || { should_stop_ctrlc.store(true, std::sync::atomic::Ordering::SeqCst); - clear().unwrap(); - println!("{} Download interrupted by user", Status::warning()); - let success_count = success_ctrlc.load(std::sync::atomic::Ordering::SeqCst); - - let title = if success_count == total_files { - " DOWNLOAD COMPLETE ".on_blue().white().bold() - } else { - " PARTIAL DOWNLOAD ".on_blue().white().bold() - }; - - println!("\n{}\n", title); - println!( - "{} Successfully downloaded: {}", - Status::success(), - success_count.to_string().green() - ); - println!( - "{} Failed downloads: {}", - Status::error(), - (total_files - success_count).to_string().red() - ); - println!( - "{} Files saved to: {}", - Status::info(), - folder_ctrlc.display().to_string().cyan() - ); - println!("\n{} Press Enter to exit...", Status::warning()); - - let mut input = String::new(); - io::stdin().read_line(&mut input).unwrap(); - - log_error( - &log_file_ctrlc, - &format!( - "Download interrupted by user. Success: {}/{}", - success_count, total_files - ), - ); - std::process::exit(0); + println!("\n{} Download interrupted by user", Status::warning()); }) .unwrap(); diff --git a/src/network/client.rs b/src/network/client.rs index 40f77e6..3dee63f 100644 --- a/src/network/client.rs +++ b/src/network/client.rs @@ -115,13 +115,23 @@ pub fn download_file( should_stop: &std::sync::atomic::AtomicBool, progress: &DownloadProgress, ) -> bool { + if should_stop.load(std::sync::atomic::Ordering::SeqCst) { + return false; + } + let dest = dest.replace('\\', "/"); let path = folder.join(&dest); let filename = get_filename(&dest); let mut file_size = None; + for base_url in &config.zip_bases { + if should_stop.load(std::sync::atomic::Ordering::SeqCst) { + return false; + } + let url = format!("{}{}", base_url, dest); + if let Ok(head_response) = client.head(&url).timeout(Duration::from_secs(10)).send() { if let Some(size) = head_response.headers() .get("content-length") @@ -188,6 +198,10 @@ pub fn download_file( match result { Ok(_) => break, Err(e) => { + if should_stop.load(std::sync::atomic::Ordering::SeqCst) { + return false; + } + last_error = Some(e); retries -= 1; let _ = fs::remove_file(&path); @@ -200,6 +214,10 @@ pub fn download_file( } } + if should_stop.load(std::sync::atomic::Ordering::SeqCst) { + return false; + } + if retries == 0 { log_error(log_file, &format!("Failed after retries for {}: {}", dest, last_error.unwrap_or_default()));