updated / improved ctrlc handling

This commit is contained in:
Yuhki 2025-03-26 03:53:16 +01:00
parent 989eeba12b
commit fad1c96da4
2 changed files with 22 additions and 43 deletions

View file

@ -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();

View file

@ -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()));