45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use std::sync::{Arc, Mutex};
|
|
use futures::AsyncReadExt;
|
|
use rand::{distr::Alphanumeric, Rng};
|
|
use tokio::{fs::File, io::AsyncWriteExt};
|
|
use tokio::sync::mpsc::{Sender, UnboundedReceiver, UnboundedSender};
|
|
use tokio::sync::{mpsc};
|
|
use crate::launcher::Launcher;
|
|
|
|
pub fn random_string(len: usize) -> String {
|
|
rand::rng()
|
|
.sample_iter(&Alphanumeric)
|
|
.take(len)
|
|
.map(char::from)
|
|
.collect()
|
|
}
|
|
|
|
pub fn download_file(url: &str, file_path: &str, size: u64, sender: UnboundedSender<(usize, String)>, status: &str) -> Result<(), Box<dyn std::error::Error>> {
|
|
let url = url.to_string();
|
|
let file_path = file_path.to_string();
|
|
let status = status.to_string();
|
|
tokio::spawn( async move {
|
|
let mut res = surf::get(url).await.unwrap();
|
|
|
|
let total_size = res.len().unwrap_or(0); // Total size in bytes (if available)
|
|
let mut downloaded = 0;
|
|
let mut buf = vec![0; 8192]; // Buffer for reading chunks
|
|
|
|
let mut file = File::create(file_path).await.unwrap();
|
|
|
|
let mut r= res.take_body().into_reader();
|
|
while let Ok(n) = r.read(&mut buf).await {
|
|
if n == 0 {
|
|
break;
|
|
}
|
|
downloaded += n;
|
|
|
|
file.write(&buf[..n]).await;
|
|
}
|
|
sender.send((downloaded, status.clone()));
|
|
});
|
|
Ok(())
|
|
}
|
|
|
|
|