blob: 05c54cb9f3c2de553db4adaba7cf912b8d67628b (
plain) (
tree)
|
|
use std::{io::Write, fs::File};
use reqwest::Client;
use futures_util::StreamExt;
use crate::{get_current_list, config::Cfg, db::get_dl_links};
pub async fn download(config: Cfg) -> Result<(), Box<dyn std::error::Error>> {
let list = get_current_list(config.clone())?;
let links = get_dl_links(config.clone(), list)?;
download_links(config, links).await?;
Ok(())
}
async fn download_links(config: Cfg, links: Vec<String>) -> Result<String, Box<dyn std::error::Error>> {
let dl_path = String::from(&config.downloads);
for link in links {
let filename = link.split('/').last().unwrap();
let dl_path_file = format!("{}/{}", config.downloads, filename);
println!("Downloading {}", link);
let res = Client::new()
.get(String::from(&link))
.send()
.await
.or(Err(format!("Failed to GET from '{}'", &link)))?;
// download chunks
let mut file = File::create(String::from(&dl_path_file)).or(Err(format!("Failed to create file '{}'", dl_path_file)))?;
let mut stream = res.bytes_stream();
while let Some(item) = stream.next().await {
let chunk = item.or(Err("Error while downloading file"))?;
file.write_all(&chunk)
.or(Err("Error while writing to file"))?;
}
}
Ok(dl_path)
}
|