mirror of
https://github.com/yuhkix/wuwa-downloader.git
synced 2025-06-06 17:53:44 +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::{
|
io::{
|
||||||
console::print_results,
|
console::print_results,
|
||||||
file::get_dir,
|
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},
|
network::client::{download_file, fetch_index, get_predownload},
|
||||||
};
|
};
|
||||||
|
@ -137,52 +139,11 @@ fn main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
let should_stop_ctrlc = should_stop.clone();
|
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 || {
|
ctrlc::set_handler(move || {
|
||||||
should_stop_ctrlc.store(true, std::sync::atomic::Ordering::SeqCst);
|
should_stop_ctrlc.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||||
|
|
||||||
clear().unwrap();
|
clear().unwrap();
|
||||||
println!("{} Download interrupted by user", Status::warning());
|
println!("\n{} 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);
|
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
|
|
@ -115,13 +115,23 @@ pub fn download_file(
|
||||||
should_stop: &std::sync::atomic::AtomicBool,
|
should_stop: &std::sync::atomic::AtomicBool,
|
||||||
progress: &DownloadProgress,
|
progress: &DownloadProgress,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
if should_stop.load(std::sync::atomic::Ordering::SeqCst) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let dest = dest.replace('\\', "/");
|
let dest = dest.replace('\\', "/");
|
||||||
let path = folder.join(&dest);
|
let path = folder.join(&dest);
|
||||||
let filename = get_filename(&dest);
|
let filename = get_filename(&dest);
|
||||||
|
|
||||||
let mut file_size = None;
|
let mut file_size = None;
|
||||||
|
|
||||||
for base_url in &config.zip_bases {
|
for base_url in &config.zip_bases {
|
||||||
|
if should_stop.load(std::sync::atomic::Ordering::SeqCst) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let url = format!("{}{}", base_url, dest);
|
let url = format!("{}{}", base_url, dest);
|
||||||
|
|
||||||
if let Ok(head_response) = client.head(&url).timeout(Duration::from_secs(10)).send() {
|
if let Ok(head_response) = client.head(&url).timeout(Duration::from_secs(10)).send() {
|
||||||
if let Some(size) = head_response.headers()
|
if let Some(size) = head_response.headers()
|
||||||
.get("content-length")
|
.get("content-length")
|
||||||
|
@ -188,6 +198,10 @@ pub fn download_file(
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => break,
|
Ok(_) => break,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
if should_stop.load(std::sync::atomic::Ordering::SeqCst) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
last_error = Some(e);
|
last_error = Some(e);
|
||||||
retries -= 1;
|
retries -= 1;
|
||||||
let _ = fs::remove_file(&path);
|
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 {
|
if retries == 0 {
|
||||||
log_error(log_file, &format!("Failed after retries for {}: {}", dest,
|
log_error(log_file, &format!("Failed after retries for {}: {}", dest,
|
||||||
last_error.unwrap_or_default()));
|
last_error.unwrap_or_default()));
|
||||||
|
|
Loading…
Reference in a new issue