diff --git a/src/providers/javtiful.rs b/src/providers/javtiful.rs index 04e7e2b..935d6a6 100644 --- a/src/providers/javtiful.rs +++ b/src/providers/javtiful.rs @@ -366,36 +366,7 @@ impl JavtifulProvider { .unwrap_or(0); let quality="1080p".to_string(); - let video_id = url - .split('/') - .nth(4) - .ok_or_else(|| ErrorKind::Parse("video id for media".into()))? - .to_string(); - - let token = text.split("data-csrf-token=\"") - .nth(1) - .and_then(|s| s.split('"').next()) - .ok_or_else(|| ErrorKind::Parse("csrf token".into()))? - .to_string(); - - let form = wreq::multipart::Form::new() - .text("video_id", video_id.clone()) - .text("pid_c", "".to_string()) - .text("token", token.clone()); - let resp = requester - .post_multipart( - "https://javtiful.com/ajax/get_cdn", - form, - vec![("Referer".to_string(), url.to_string())], - Some(Version::HTTP_11), - ) - .await - .map_err(|e| Error::from(format!("{}", e)))?; - let text = resp.text().await?; - let json: serde_json::Value = serde_json::from_str(&text)?; - let video_url = json.get("playlists") - .ok_or_else(|| ErrorKind::Parse("video_url in json".into()))? - .to_string().replace("\"", ""); + let video_url = url.replace("javtiful.com","hottub.spacemoehre.de/proxy/javtiful"); Ok(( tags, vec![VideoFormat::new(video_url, quality, "video/mp4".into())], diff --git a/src/proxies/javtiful.rs b/src/proxies/javtiful.rs new file mode 100644 index 0000000..886585c --- /dev/null +++ b/src/proxies/javtiful.rs @@ -0,0 +1,64 @@ +use ntex::web; +use wreq::Version; + +use crate::util::requester::Requester; + + +#[derive(Debug, Clone)] +pub struct JavtifulProxy { +} + +impl JavtifulProxy { + pub fn new() -> Self { + JavtifulProxy { + } + } + + pub async fn get_video_url( + &self, + url: String, + requester: web::types::State, + ) -> String { + let mut requester = requester.get_ref().clone(); + let url = "https://javtiful.com/".to_string() + &url; + let text = requester.get(&url, None).await.unwrap_or("".to_string()); + if text.is_empty() { + return "".to_string(); + } + let video_id = url + .split('/') + .nth(4) + .unwrap_or("") + .to_string(); + + let token = text.split("data-csrf-token=\"") + .nth(1) + .and_then(|s| s.split('"').next()) + .unwrap_or("") + .to_string(); + + let form = wreq::multipart::Form::new() + .text("video_id", video_id.clone()) + .text("pid_c", "".to_string()) + .text("token", token.clone()); + let resp = match requester + .post_multipart( + "https://javtiful.com/ajax/get_cdn", + form, + vec![("Referer".to_string(), url.to_string())], + Some(Version::HTTP_11), + ) + .await + { + Ok(r) => r, + Err(_) => return "".to_string(), + }; + let text = resp.text().await.unwrap_or_default(); + let json: serde_json::Value = serde_json::from_str(&text).unwrap_or(serde_json::Value::Null); + let video_url = json.get("playlists") + .map(|v| v.to_string().replace("\"", "")) + .unwrap_or_default(); + + return video_url; + } +} \ No newline at end of file diff --git a/src/proxies/mod.rs b/src/proxies/mod.rs index 561aa24..ea97f11 100644 --- a/src/proxies/mod.rs +++ b/src/proxies/mod.rs @@ -4,10 +4,12 @@ use crate::{proxies::sxyprn::SxyprnProxy, util::requester::Requester}; pub mod sxyprn; pub mod hanimecdn; +pub mod javtiful; #[derive(Debug, Clone)] pub enum AnyProxy { Sxyprn(SxyprnProxy), + Javtiful(javtiful::JavtifulProxy), } pub trait Proxy { @@ -26,12 +28,8 @@ impl Proxy for AnyProxy { requester: web::types::State, ) -> String { match self { - AnyProxy::Sxyprn(p) => { - p.get_video_url( - url, - requester, - ).await - } + AnyProxy::Sxyprn(p) => p.get_video_url(url, requester).await, + AnyProxy::Javtiful(p) => p.get_video_url(url, requester).await, } } } \ No newline at end of file diff --git a/src/proxy.rs b/src/proxy.rs index 851aa19..41be9ff 100644 --- a/src/proxy.rs +++ b/src/proxy.rs @@ -1,5 +1,6 @@ use ntex::web::{self, HttpRequest}; +use crate::proxies::javtiful::JavtifulProxy; use crate::proxies::sxyprn::SxyprnProxy; use crate::util::requester::Requester; use crate::proxies::*; @@ -7,8 +8,13 @@ use crate::proxies::*; pub fn config(cfg: &mut web::ServiceConfig) { cfg.service( web::resource("/sxyprn/{endpoint}*") - .route(web::post().to(sxyprn)) - .route(web::get().to(sxyprn)), + .route(web::post().to(proxy2redirect)) + .route(web::get().to(proxy2redirect)), + ) + .service( + web::resource("/javtiful/{endpoint}*") + .route(web::post().to(proxy2redirect)) + .route(web::get().to(proxy2redirect)), ) .service( web::resource("/hanime-cdn/{endpoint}*") @@ -19,7 +25,7 @@ pub fn config(cfg: &mut web::ServiceConfig) { } -async fn sxyprn(req: HttpRequest, +async fn proxy2redirect(req: HttpRequest, requester: web::types::State,) -> Result { let proxy = get_proxy(req.uri().to_string().split("/").collect::>()[2]).unwrap(); let endpoint = req.match_info().query("endpoint").to_string(); @@ -35,6 +41,7 @@ async fn sxyprn(req: HttpRequest, fn get_proxy(proxy: &str) -> Option { match proxy { "sxyprn" => Some(AnyProxy::Sxyprn(SxyprnProxy::new())), + "javtiful" => Some(AnyProxy::Javtiful(JavtifulProxy::new())), _ => None, } } \ No newline at end of file