From 6c2e981509d3906c2c1046e86aa8d5871f369626 Mon Sep 17 00:00:00 2001 From: blank X Date: Thu, 4 Feb 2021 12:59:11 +0700 Subject: [PATCH] Show file size in view and download --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/commands/download.rs | 20 ++++++++++---------- src/structs.rs | 30 +++++++++++++++++++----------- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f545be..91c8a5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "hanimers" -version = "0.1.3" +version = "0.1.4" dependencies = [ "clap", "quick-xml", diff --git a/Cargo.toml b/Cargo.toml index e26691b..41c9002 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hanimers" -version = "0.1.3" +version = "0.1.4" authors = ["blank X "] edition = "2018" diff --git a/src/commands/download.rs b/src/commands/download.rs index 9b117ab..42196a4 100644 --- a/src/commands/download.rs +++ b/src/commands/download.rs @@ -37,8 +37,8 @@ pub async fn download(arg_m: &ArgMatches<'_>) { continue; } let mut download_url = None; - let mut perm_urls: HashMap = HashMap::new(); - let mut temp_urls: HashMap = HashMap::new(); + let mut perm_urls: HashMap = HashMap::new(); + let mut temp_urls: HashMap = HashMap::new(); for server in hentai_info.state.data.video.videos_manifest.servers { let mut to_hashmap = match server.is_permanent { true => perm_urls.clone(), @@ -49,11 +49,11 @@ pub async fn download(arg_m: &ArgMatches<'_>) { continue; } if server.is_permanent && Some(stream.height.as_str()) == resolution { - download_url = Some(stream.url); + download_url = Some((stream.url, stream.filesize_mbs)); break; } if !to_hashmap.contains_key(&stream.height) { - to_hashmap.insert(stream.height, stream.url); + to_hashmap.insert(stream.height, (stream.url, stream.filesize_mbs)); }; } if download_url.is_some() { @@ -66,7 +66,7 @@ pub async fn download(arg_m: &ArgMatches<'_>) { } if download_url.is_none() { if resolution.is_some() { - download_url = temp_urls.get(resolution.unwrap()).map(|i| i.to_string()); + download_url = temp_urls.get(resolution.unwrap()).map(|i| (i.0.to_string(), i.1)); } if download_url.is_none() { download_url = magic_thing(perm_urls).or_else(|| { magic_thing(temp_urls) }); @@ -77,14 +77,14 @@ pub async fn download(arg_m: &ArgMatches<'_>) { } } } - let download_url = download_url.unwrap(); + let (download_url, filesize_mbs) = download_url.unwrap(); if print_only { println!("{}", download_url); } else { let mut fail_dl = true; let tmp_filename = format!("{}.tmp", &slug); for i in 0..MAX_DOWNLOAD_ATTEMPTS { - eprintln!("Downloading {} (attempt {})", &filename, i); + eprintln!("Downloading {} ({}MB, attempt {})", &filename, filesize_mbs, i); match Command::new("ffmpeg").args(&["-v", "warning", "-stats", "-nostdin", "-y", "-i", &download_url, "-c", "copy", "-f", "matroska", &tmp_filename]).spawn() { Ok(mut child) => { match child.wait() { @@ -128,7 +128,7 @@ pub async fn download(arg_m: &ArgMatches<'_>) { } } -fn magic_thing(map: HashMap) -> Option { +fn magic_thing(map: HashMap) -> Option<(String, i32)> { let mut keys = Vec::new(); for i in map.keys() { match i.parse::() { @@ -141,12 +141,12 @@ fn magic_thing(map: HashMap) -> Option { } keys.sort(); match keys.pop() { - Some(key) => Some(map.get(&key.to_string()).unwrap().to_string()), + Some(key) => map.get(&key.to_string()).map(|i| i.clone()), None => { let mut keys: Vec<_> = map.keys().collect(); keys.sort(); match keys.pop() { - Some(key) => Some(map.get(&key.to_string()).unwrap().to_string()), + Some(key) => map.get(key.as_str()).map(|i| i.clone()), None => None } } diff --git a/src/structs.rs b/src/structs.rs index ac4c410..4b030c4 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,5 +1,6 @@ use std::fmt; use std::marker::PhantomData; +use std::collections::HashMap; use serde::de::{self, Visitor}; use serde::{Deserialize, Deserializer}; use quick_xml::Reader; @@ -84,33 +85,39 @@ impl fmt::Display for HentaiInfo { ); let servers = &self.state.data.video.videos_manifest.servers; if !servers.is_empty() { - let mut string_servers = Vec::new(); + let mut string_servers = HashMap::new(); for server in servers { let mut tmp_string_servers = string_servers.clone(); for stream in &server.streams { - if !stream.url.is_empty() && !tmp_string_servers.contains(&stream.height) { - tmp_string_servers.push(stream.height.clone()); + if !stream.url.is_empty() && !tmp_string_servers.contains_key(&stream.height) { + tmp_string_servers.insert(&stream.height, stream.filesize_mbs); } } string_servers.extend(tmp_string_servers); } if !string_servers.is_empty() { - string_servers.sort(); - let mut int_servers = Vec::with_capacity(string_servers.len()); - for i in &string_servers { + let mut int_servers = HashMap::with_capacity(string_servers.len()); + for (i, j) in &string_servers { match i.parse::() { - Ok(i) => int_servers.push(i), + Ok(i) => int_servers.insert(i, j), Err(_) => { int_servers.clear(); break; } }; } - int_servers.sort(); text.push_str(&format!("Resolution: {}\n", match int_servers.is_empty() { - true => string_servers.join(", "), - false => int_servers.iter().map(|i| i.to_string()).collect::>().join(", ") + true => { + let mut keys: Vec<&&String> = string_servers.keys().collect(); + keys.sort(); + keys.iter().map(|&i| format!("{} ({}MB)", i, string_servers.get(i).unwrap())).collect::>().join(", ") + }, + false => { + let mut keys: Vec<&i32> = int_servers.keys().collect(); + keys.sort(); + keys.iter().map(|i| format!("{} ({}MB)", i, int_servers.get(i).unwrap())).collect::>().join(", ") + } } )); } @@ -160,7 +167,8 @@ pub struct VideoServer { #[derive(Deserialize, Debug)] pub struct VideoStream { pub height: String, - pub url: String + pub url: String, + pub filesize_mbs: i32 } fn remove_html<'de, D>(deserializer: D) -> Result