print download size
This commit is contained in:
parent
ca836bbda6
commit
9c26679a5a
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -30,7 +30,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "alterware-launcher"
|
name = "alterware-launcher"
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"colored",
|
"colored",
|
||||||
"http_req",
|
"http_req",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "alterware-launcher"
|
name = "alterware-launcher"
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
build = "res/build.rs"
|
build = "res/build.rs"
|
||||||
|
|
||||||
|
73
src/main.rs
73
src/main.rs
@ -180,21 +180,35 @@ fn manual_install(games: &[Game]) {
|
|||||||
std::process::exit(0);
|
std::process::exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn total_download_size(cdn_info: &Vec<CdnFile>, remote_dir: &str) -> u64 {
|
||||||
|
let remote_dir = format!("{}/", remote_dir);
|
||||||
|
let mut size: u64 = 0;
|
||||||
|
for file in cdn_info {
|
||||||
|
if !file.name.starts_with(&remote_dir) || file.name == "iw4/iw4x.dll" {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
size += file.size as u64;
|
||||||
|
}
|
||||||
|
size
|
||||||
|
}
|
||||||
|
|
||||||
fn update_dir(
|
fn update_dir(
|
||||||
cdn_info: &Vec<CdnFile>,
|
cdn_info: &Vec<CdnFile>,
|
||||||
remote_dir: &str,
|
remote_dir: &str,
|
||||||
dir: &Path,
|
dir: &Path,
|
||||||
hashes: &mut HashMap<String, String>,
|
hashes: &mut HashMap<String, String>,
|
||||||
) {
|
) {
|
||||||
let remote_dir = format!("{}/", remote_dir);
|
let remote_dir_pre = format!("{}/", remote_dir);
|
||||||
|
|
||||||
|
let mut files_to_download: Vec<CdnFile> = vec![];
|
||||||
|
|
||||||
for file in cdn_info {
|
for file in cdn_info {
|
||||||
if !file.name.starts_with(&remote_dir) || file.name == "iw4/iw4x.dll" {
|
if !file.name.starts_with(&remote_dir_pre) || file.name == "iw4/iw4x.dll" {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let sha1_remote = file.hash.to_lowercase();
|
let sha1_remote = file.hash.to_lowercase();
|
||||||
let file_name = &file.name.replace(remote_dir.as_str(), "");
|
let file_name = &file.name.replace(remote_dir_pre.as_str(), "");
|
||||||
let file_path = dir.join(file_name);
|
let file_path = dir.join(file_name);
|
||||||
if file_path.exists() {
|
if file_path.exists() {
|
||||||
let sha1_local = hashes
|
let sha1_local = hashes
|
||||||
@ -204,31 +218,46 @@ fn update_dir(
|
|||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
if sha1_local != sha1_remote {
|
if sha1_local != sha1_remote {
|
||||||
println!(
|
files_to_download.push(file.clone());
|
||||||
"[{}] {}",
|
|
||||||
"Updating".bright_yellow(),
|
|
||||||
file_path.display()
|
|
||||||
);
|
|
||||||
http::download_file(&format!("{}/{}", MASTER, file.name), &file_path);
|
|
||||||
} else {
|
} else {
|
||||||
println!("[{}] {}", "Checked".bright_blue(), file_path.display());
|
println!("[{}] {}", "Checked".bright_blue(), file_path.display());
|
||||||
}
|
}
|
||||||
hashes.insert(file_name.to_owned(), sha1_remote.to_owned());
|
|
||||||
} else {
|
} else {
|
||||||
println!(
|
files_to_download.push(file.clone());
|
||||||
"[{}] {}",
|
|
||||||
"Downloading".bright_yellow(),
|
|
||||||
file_path.display()
|
|
||||||
);
|
|
||||||
if let Some(parent) = file_path.parent() {
|
|
||||||
if !parent.exists() {
|
|
||||||
fs::create_dir_all(parent).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
http::download_file(&format!("{}/{}", MASTER, file.name), &file_path);
|
|
||||||
hashes.insert(file_name.to_owned(), sha1_remote.to_owned());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if files_to_download.is_empty() {
|
||||||
|
println!(
|
||||||
|
"[{}] No files to download for {}",
|
||||||
|
"Info".bright_magenta(),
|
||||||
|
remote_dir
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
println!(
|
||||||
|
"[{}] Downloading outdated or missing files for {}, {}",
|
||||||
|
"Info".bright_magenta(),
|
||||||
|
remote_dir,
|
||||||
|
misc::human_readable_bytes(total_download_size(&files_to_download, &remote_dir))
|
||||||
|
);
|
||||||
|
for file in files_to_download {
|
||||||
|
let file_name = &file.name.replace(&format!("{}/", remote_dir), "/");
|
||||||
|
let file_path = dir.join(file_name);
|
||||||
|
println!(
|
||||||
|
"[{}] {} ({})",
|
||||||
|
"Downloading".bright_yellow(),
|
||||||
|
file_path.display(),
|
||||||
|
misc::human_readable_bytes(file.size as u64)
|
||||||
|
);
|
||||||
|
if let Some(parent) = file_path.parent() {
|
||||||
|
if !parent.exists() {
|
||||||
|
fs::create_dir_all(parent).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http::download_file(&format!("{}/{}", MASTER, file.name), &file_path);
|
||||||
|
hashes.insert(file_name.to_owned(), file.hash.to_lowercase());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(game: &Game, dir: &Path, bonus_content: bool, force: bool) {
|
fn update(game: &Game, dir: &Path, bonus_content: bool, force: bool) {
|
||||||
|
11
src/misc.rs
11
src/misc.rs
@ -26,3 +26,14 @@ pub fn fatal_error(error: &str) {
|
|||||||
stdin();
|
stdin();
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn human_readable_bytes(bytes: u64) -> String {
|
||||||
|
let mut bytes = bytes as f64;
|
||||||
|
let mut i = 0;
|
||||||
|
let units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||||
|
while bytes > 1024.0 {
|
||||||
|
bytes /= 1024.0;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
format!("{:.2} {}", bytes, units[i])
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Clone)]
|
||||||
pub struct CdnFile {
|
pub struct CdnFile {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub size: u32,
|
pub size: u32,
|
||||||
|
Loading…
Reference in New Issue
Block a user