Create info.txt if all the queries are successful, download now prints to stderr and speed boost
This commit is contained in:
parent
045bb9d6ca
commit
c5b61bac25
|
@ -421,7 +421,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nhentairs"
|
name = "nhentairs"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "nhentairs"
|
name = "nhentairs"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
authors = ["blank X <theblankx@protonmail.com>"]
|
authors = ["blank X <theblankx@protonmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,11 @@ use crate::utils;
|
||||||
use crate::structs;
|
use crate::structs;
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::sync::Arc;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
use tokio::sync::Mutex;
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
use std::collections::HashMap;
|
|
||||||
use tokio::sync::{mpsc, oneshot};
|
|
||||||
use std::fs::{rename, create_dir, write};
|
use std::fs::{rename, create_dir, write};
|
||||||
extern crate tokio;
|
extern crate tokio;
|
||||||
extern crate reqwest;
|
extern crate reqwest;
|
||||||
|
@ -20,23 +20,27 @@ pub async fn run(args: env::Args) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let mut handles: Vec<JoinHandle<()>> = Vec::new();
|
let mut pages_vec: Vec<(String, String)> = Vec::new();
|
||||||
let mut hashm = HashMap::new();
|
{
|
||||||
let (tx, mut rx) = mpsc::channel(100);
|
let mut handles: Vec<JoinHandle<structs::GalleryInfoSuccess>> = Vec::with_capacity(sauces.len());
|
||||||
for sauce in sauces {
|
let mut sauce_info_vec: Vec<structs::GalleryInfoSuccess> = Vec::with_capacity(sauces.len());
|
||||||
let cloned_client = client.clone();
|
for sauce in sauces {
|
||||||
let mut cloned_tx = tx.clone();
|
let cloned_client = client.clone();
|
||||||
handles.push(tokio::spawn(async move {
|
handles.push(tokio::spawn(async move {
|
||||||
let sauce_info = match utils::get_sauce_info(cloned_client, sauce).await.unwrap() {
|
match utils::get_sauce_info(cloned_client, sauce).await.unwrap() {
|
||||||
structs::GalleryInfo::Info(sauce_info) => sauce_info,
|
structs::GalleryInfo::Info(sauce_info) => sauce_info,
|
||||||
structs::GalleryInfo::Error(sauce_error) => panic!("{} returned: {}", sauce, sauce_error.error)
|
structs::GalleryInfo::Error(sauce_error) => panic!("{} returned: {}", sauce, sauce_error.error)
|
||||||
};
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
for handle in handles {
|
||||||
|
sauce_info_vec.push(handle.await.unwrap());
|
||||||
|
}
|
||||||
|
for sauce_info in sauce_info_vec {
|
||||||
let base_path = sauce_info.id.to_string();
|
let base_path = sauce_info.id.to_string();
|
||||||
let base_path = Path::new(&base_path);
|
let base_path = Path::new(&base_path);
|
||||||
match create_dir(base_path) {
|
match create_dir(base_path) {
|
||||||
Ok(()) => {
|
Ok(()) => write(base_path.join("info.txt"), format!("{}\n", utils::human_sauce_info(&sauce_info))).unwrap(),
|
||||||
write(base_path.join("info.txt"), format!("{}\n", utils::human_sauce_info(&sauce_info))).unwrap();
|
|
||||||
},
|
|
||||||
Err(err) => match err.kind() {
|
Err(err) => match err.kind() {
|
||||||
std::io::ErrorKind::AlreadyExists => (),
|
std::io::ErrorKind::AlreadyExists => (),
|
||||||
_ => panic!("Got a weird error while creating dir: {}", err)
|
_ => panic!("Got a weird error while creating dir: {}", err)
|
||||||
|
@ -54,65 +58,44 @@ pub async fn run(args: env::Args) {
|
||||||
file_name.push_str(file_ext);
|
file_name.push_str(file_ext);
|
||||||
let file_path = base_path.join(&file_name);
|
let file_path = base_path.join(&file_name);
|
||||||
if !file_path.exists() {
|
if !file_path.exists() {
|
||||||
cloned_tx.send((
|
pages_vec.push((
|
||||||
String::from(file_path.to_str().unwrap()),
|
String::from(file_path.to_str().unwrap()),
|
||||||
format!("https://i.nhentai.net/galleries/{}/{}",
|
format!("https://i.nhentai.net/galleries/{}/{}",
|
||||||
sauce_info.media_id,
|
sauce_info.media_id,
|
||||||
file_name)
|
file_name)
|
||||||
)).await.unwrap();
|
));
|
||||||
}
|
}
|
||||||
page_num += 1;
|
page_num += 1;
|
||||||
}
|
}
|
||||||
}));
|
}
|
||||||
}
|
|
||||||
drop(tx);
|
|
||||||
while let Some((file_path, url)) = rx.recv().await {
|
|
||||||
hashm.insert(file_path, url);
|
|
||||||
}
|
|
||||||
for handle in handles {
|
|
||||||
handle.await.unwrap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut handles = Vec::with_capacity(DOWNLOAD_WORKERS);
|
let mut handles = Vec::with_capacity(DOWNLOAD_WORKERS);
|
||||||
let (tx, mut rx) = mpsc::channel(DOWNLOAD_WORKERS);
|
let mutex = Arc::new(Mutex::new(pages_vec));
|
||||||
tokio::spawn(async move {
|
|
||||||
while let Some(ntx) = rx.recv().await {
|
|
||||||
let ntx: oneshot::Sender<(String, String)> = ntx;
|
|
||||||
ntx.send(match hashm.iter().next() {
|
|
||||||
Some((key, value)) => {
|
|
||||||
let key = key.to_string();
|
|
||||||
let value = value.to_string();
|
|
||||||
hashm.remove(&key).unwrap();
|
|
||||||
(key, value)
|
|
||||||
},
|
|
||||||
None => (String::new(), String::new()),
|
|
||||||
}).unwrap();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for worker_id in 0..DOWNLOAD_WORKERS {
|
for worker_id in 0..DOWNLOAD_WORKERS {
|
||||||
let tcloned_client = client.clone();
|
let tcloned_client = client.clone();
|
||||||
let mut cloned_tx = tx.clone();
|
let tcloned_mutex = Arc::clone(&mutex);
|
||||||
handles.push(tokio::spawn(async move {
|
handles.push(tokio::spawn(async move {
|
||||||
println!("[DW{}] Up!", worker_id);
|
eprintln!("[DW{}] Up!", worker_id);
|
||||||
loop {
|
loop {
|
||||||
let cloned_client = tcloned_client.clone();
|
let cloned_client = tcloned_client.clone();
|
||||||
let (ntx, nrx) = oneshot::channel();
|
let cloned_mutex = Arc::clone(&tcloned_mutex);
|
||||||
cloned_tx.send(ntx).await.unwrap();
|
let mut pages_vec = cloned_mutex.lock().await;
|
||||||
let (file_path, url) = nrx.await.unwrap();
|
if pages_vec.len() < 1 {
|
||||||
if file_path.is_empty() && url.is_empty() {
|
eprintln!("[DW{}] Down!", worker_id);
|
||||||
println!("[DW{}] Down!", worker_id);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
println!("[DW{}] Downloading {} to {}", worker_id, url, file_path);
|
let (file_path, url) = pages_vec.remove(0);
|
||||||
let mut tmp_file_path = String::from(&file_path);
|
drop(pages_vec);
|
||||||
|
eprintln!("[DW{}] Downloading {} to {}", worker_id, url, file_path);
|
||||||
|
let mut tmp_file_path = file_path.clone();
|
||||||
tmp_file_path.push_str(".tmp");
|
tmp_file_path.push_str(".tmp");
|
||||||
utils::download_file(cloned_client, &url, &tmp_file_path).await.unwrap();
|
utils::download_file(cloned_client, &url, &tmp_file_path).await.unwrap();
|
||||||
rename(&tmp_file_path, &file_path).unwrap();
|
rename(&tmp_file_path, &file_path).unwrap();
|
||||||
println!("[DW{}] {} downloaded", worker_id, file_path);
|
eprintln!("[DW{}] {} downloaded", worker_id, file_path);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
drop(tx);
|
|
||||||
for handle in handles {
|
for handle in handles {
|
||||||
handle.await.unwrap();
|
handle.await.unwrap();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue