use std::{io::Write, fs::File}; use reqwest::Client; use futures_util::StreamExt; use crate::{get_current_list, config::Cfg, db::userlist_get_all_downloads}; pub async fn download(config: Cfg) -> Result<(), Box> { let list = get_current_list(config.clone())?; let links = userlist_get_all_downloads(config.clone(), list.id)?; download_links(config, links).await?; Ok(()) } async fn download_links(config: Cfg, links: Vec) -> Result> { 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) }