Remove utils::fix_gallery
This commit is contained in:
parent
829e8ad36c
commit
cea920a080
|
@ -421,7 +421,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nhentairs"
|
name = "nhentairs"
|
||||||
version = "0.2.1"
|
version = "0.2.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "nhentairs"
|
name = "nhentairs"
|
||||||
version = "0.2.1"
|
version = "0.2.2"
|
||||||
authors = ["blank X <theblankx@protonmail.com>"]
|
authors = ["blank X <theblankx@protonmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
|
103
src/structs.rs
103
src/structs.rs
|
@ -1,4 +1,7 @@
|
||||||
use serde::Deserialize;
|
use std::fmt;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
use serde::de::{self, Visitor};
|
||||||
|
use serde::{Deserialize, Deserializer};
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct GalleryTitleInfo {
|
pub struct GalleryTitleInfo {
|
||||||
|
@ -32,6 +35,7 @@ pub struct GalleryTagInfo {
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct GalleryInfoSuccess {
|
pub struct GalleryInfoSuccess {
|
||||||
|
#[serde(deserialize_with = "convert_to_i32")]
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
pub media_id: String,
|
pub media_id: String,
|
||||||
pub title: GalleryTitleInfo,
|
pub title: GalleryTitleInfo,
|
||||||
|
@ -61,3 +65,100 @@ pub struct SearchInfo {
|
||||||
pub num_pages: i32,
|
pub num_pages: i32,
|
||||||
pub per_page: i32
|
pub per_page: i32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn convert_to_i32<'de, D>(deserializer: D) -> Result<i32, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>
|
||||||
|
{
|
||||||
|
struct ConvertToI32<T>(PhantomData<fn() -> T>);
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for ConvertToI32<i32>
|
||||||
|
{
|
||||||
|
type Value = i32;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("an integer between -2^31 and 2^31")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
Ok(i32::from(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
Ok(i32::from(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
use std::i32;
|
||||||
|
if value >= i64::from(i32::MIN) && value <= i64::from(i32::MAX) {
|
||||||
|
Ok(value as i32)
|
||||||
|
} else {
|
||||||
|
Err(E::custom(format!("i32 out of range: {}", value)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
Ok(i32::from(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
Ok(i32::from(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
use std::{i32, u32};
|
||||||
|
if value <= i32::MAX as u32 {
|
||||||
|
Ok(value as i32)
|
||||||
|
} else {
|
||||||
|
Err(E::custom(format!("i32 out of range: {}", value)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
use std::{i32, u64};
|
||||||
|
if value <= i32::MAX as u64 {
|
||||||
|
Ok(value as i32)
|
||||||
|
} else {
|
||||||
|
Err(E::custom(format!("i32 out of range: {}", value)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error
|
||||||
|
{
|
||||||
|
// https://brokenco.de/2020/08/03/serde-deserialize-with-string.html
|
||||||
|
value.parse::<i32>().map_err(serde::de::Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_any(ConvertToI32(PhantomData))
|
||||||
|
}
|
||||||
|
|
22
src/utils.rs
22
src/utils.rs
|
@ -8,25 +8,13 @@ use std::collections::BTreeMap;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate reqwest;
|
extern crate reqwest;
|
||||||
|
|
||||||
fn fix_gallery(body: &mut serde_json::Value) -> Result<(), serde_json::Error> {
|
|
||||||
if body["id"].is_string() {
|
|
||||||
body["id"] = serde_json::json!(
|
|
||||||
body["id"].as_str().unwrap().parse::<i32>().unwrap()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_sauce_info(client: reqwest::Client, sauce: i32) -> Result<structs::GalleryInfo, reqwest::Error> {
|
pub async fn get_sauce_info(client: reqwest::Client, sauce: i32) -> Result<structs::GalleryInfo, reqwest::Error> {
|
||||||
let mut uri = String::from("https://nhentai.net/api/gallery/");
|
let mut uri = String::from("https://nhentai.net/api/gallery/");
|
||||||
uri.push_str(&sauce.to_string());
|
uri.push_str(&sauce.to_string());
|
||||||
let resp = client.get(&uri)
|
let resp = client.get(&uri)
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await?;
|
||||||
let body = resp.text().await?;
|
Ok(serde_json::from_str(&resp.text().await?).unwrap())
|
||||||
let mut body: serde_json::Value = serde_json::from_str(&body).unwrap();
|
|
||||||
fix_gallery(&mut body).unwrap();
|
|
||||||
Ok(serde_json::from_str(&serde_json::to_string(&body).unwrap()).unwrap())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_search_info(client: reqwest::Client, search_query: &str) -> Result<structs::SearchInfo, reqwest::Error> {
|
pub async fn get_search_info(client: reqwest::Client, search_query: &str) -> Result<structs::SearchInfo, reqwest::Error> {
|
||||||
|
@ -35,13 +23,7 @@ pub async fn get_search_info(client: reqwest::Client, search_query: &str) -> Res
|
||||||
.query(&[("query", search_query)])
|
.query(&[("query", search_query)])
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await?;
|
||||||
assert!(resp.status().is_success());
|
Ok(serde_json::from_str(&resp.text().await?).unwrap())
|
||||||
let body = resp.text().await?;
|
|
||||||
let mut body: serde_json::Value = serde_json::from_str(&body).unwrap();
|
|
||||||
for i in 0..body["result"].as_array().unwrap().len() {
|
|
||||||
fix_gallery(&mut body["result"][i]).unwrap();
|
|
||||||
}
|
|
||||||
Ok(serde_json::from_str(&serde_json::to_string(&body).unwrap()).unwrap())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn download_file(client: reqwest::Client, url: &str, file_name: &str) -> Result<(), reqwest::Error> {
|
pub async fn download_file(client: reqwest::Client, url: &str, file_name: &str) -> Result<(), reqwest::Error> {
|
||||||
|
|
Loading…
Reference in New Issue