mirror of
https://github.com/yuhkix/wuwa-downloader.git
synced 2025-06-04 08:53:41 +00:00
updated / improved ctrlc handling
This commit is contained in:
parent
989eeba12b
commit
fad1c96da4
2 changed files with 22 additions and 43 deletions
47
src/main.rs
47
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();
|
||||
|
||||
|
|
|
@ -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()));
|
||||
|
|
Loading…
Reference in a new issue