From ae8fd8e922fb87b69067317a4d56d10e67fe1ec8 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 1 Jun 2025 18:09:20 +0000 Subject: [PATCH] MOCK API for tests --- src/api.rs | 109 +++++++++++++++++++++++++----------- src/providers/perverzija.rs | 12 ++-- src/util/flaresolverr.rs | 16 +++--- 3 files changed, 94 insertions(+), 43 deletions(-) diff --git a/src/api.rs b/src/api.rs index 656458e..3a9301a 100644 --- a/src/api.rs +++ b/src/api.rs @@ -165,6 +165,57 @@ async fn status(req: HttpRequest) -> Result { async fn videos_post( video_request: web::types::Json, ) -> Result { + // let mut format = Video_Format::new( + // "https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a" + // .to_string(), + // "1080p".to_string(), + // "m3u8".to_string(), + // ); + // format.add_http_header( + // "Referer".to_string(), + // "https://pervl2.xtremestream.xyz" + // .to_string(), + // ); + // let mut videos = Videos { + // pageInfo: PageInfo { + // hasNextPage: true, + // resultsPerPage: 10, + // }, + // items: vec![], + // }; + // let channel: String = video_request + // .channel + // .as_deref() + // .unwrap_or("all") + // .to_string(); + // let sort: String = video_request.sort.as_deref().unwrap_or("date").to_string(); + // let mut query: Option = video_request.query.clone(); + // if video_request.query.as_deref() == Some("") { + // query = None; + // } + // let page: u8 = video_request + // .page + // .as_deref() + // .unwrap_or("1") + // .to_string() + // .parse() + // .unwrap(); + // let perPage: u8 = video_request + // .perPage + // .as_deref() + // .unwrap_or("10") + // .to_string() + // .parse() + // .unwrap(); + // let featured = video_request.featured.as_deref().unwrap_or("all").to_string(); + // let provider = PerverzijaProvider::new(); + // let video_items = provider + // .get_videos(channel, sort, query, page.to_string(), perPage.to_string(), featured) + // .await; + // videos.items = video_items.clone(); + + /// #### MOCK RESPONSE + /// let mut format = Video_Format::new( "https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a" .to_string(), @@ -176,43 +227,37 @@ async fn videos_post( "https://pervl2.xtremestream.xyz" .to_string(), ); - let mut videos = Videos { + let videos = Videos { pageInfo: PageInfo { hasNextPage: true, resultsPerPage: 10, }, - items: vec![], + items: vec![ + Video_Item{ + duration: 110, // 110, + views: Some(14622653), // 14622653, + rating: Some(0.0), // 0.0, + id: "794a51bb65913debd98f73111705738a".to_string(), // "c85017ca87477168d648727753c4ded8a35f173e22ef93743e707b296becb299", + title: "BrazzersExxtra – Give Me A D! The Best Of Cheerleaders".to_string(), // "20 Minutes of Adorable Kittens BEST Compilation", + // url: "https://tube.perverzija.com/brazzersexxtra-give-me-a-d-the-best-of-cheerleaders/".to_string(), + // url : "https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a".to_string(), // "https://www.youtube.com/watch?v=y0sF5xhGreA", + url : "https://pervl2.xtremestream.xyz/player/index.php?data=794a51bb65913debd98f73111705738a".to_string(), + channel: "perverzija".to_string(), // "youtube", + thumb: "https://tube.perverzija.com/wp-content/uploads/2025/05/BrazzersExxtra-Give-Me-A-D-The-Best-Of-Cheerleaders.jpg".to_string(), // "https://i.ytimg.com/vi/y0sF5xhGreA/hqdefault.jpg", + uploader: Some("Brazzers".to_string()), // "The Pet Collective", + uploaderUrl: Some("https://brazzers.com".to_string()), // "https://www.youtube.com/@petcollective", + verified: Some(false), // false, + tags: Some(vec![]), // [], + uploadedAt: Some(1741142954), // 1741142954 + formats: Some(vec![format]), // Additional HTTP headers if needed + embed: None, + + } + ], }; - let channel: String = video_request - .channel - .as_deref() - .unwrap_or("all") - .to_string(); - let sort: String = video_request.sort.as_deref().unwrap_or("date").to_string(); - let mut query: Option = video_request.query.clone(); - if video_request.query.as_deref() == Some("") { - query = None; - } - let page: u8 = video_request - .page - .as_deref() - .unwrap_or("1") - .to_string() - .parse() - .unwrap(); - let perPage: u8 = video_request - .perPage - .as_deref() - .unwrap_or("10") - .to_string() - .parse() - .unwrap(); - let featured = video_request.featured.as_deref().unwrap_or("all").to_string(); - let provider = PerverzijaProvider::new(); - let video_items = provider - .get_videos(channel, sort, query, page.to_string(), perPage.to_string(), featured) - .await; - videos.items = video_items.clone(); + + println!("Video: {:?}", videos); + Ok(web::HttpResponse::Ok().json(&videos)) } diff --git a/src/providers/perverzija.rs b/src/providers/perverzija.rs index 992372e..8aa68af 100644 --- a/src/providers/perverzija.rs +++ b/src/providers/perverzija.rs @@ -27,6 +27,7 @@ impl PerverzijaProvider { } } async fn get(&self, page: &u8, featured: String) -> Result> { + println!("get"); let mut prefix_uri = "".to_string(); if featured == "featured" { prefix_uri = "featured-scenes/".to_string(); @@ -41,10 +42,10 @@ impl PerverzijaProvider { let req = FlareSolverrRequest { cmd: "request.get".to_string(), url: url.clone(), - session: "hottub".to_string(), maxTimeout: 60000, }; let response = flare.solve(req).await; + // println!("Response: {:?}", response); match response { Ok(html) => { let video_items = self.get_video_items_from_html(html.clone()); @@ -57,6 +58,7 @@ impl PerverzijaProvider { } } async fn query(&self, page: &u8, query: &str) -> Result> { + println!("query: {}", query); let search_string = query.replace(" ", "+"); let mut url = format!( "{}advanced-search/?_sf_s={}&sf_paged={}", @@ -72,7 +74,6 @@ impl PerverzijaProvider { let req = FlareSolverrRequest { cmd: "request.get".to_string(), url: url.clone(), - session: "hottub".to_string(), maxTimeout: 60000, }; let response = flare.solve(req).await; @@ -89,17 +90,19 @@ impl PerverzijaProvider { } fn get_video_items_from_html(&self, html: String) -> Vec { + // println!("HTML: {}", html); let mut items: Vec = Vec::new(); let video_listing_content = html.split("video-listing-content").collect::>()[1]; let raw_videos = video_listing_content .split("video-item post") .collect::>()[1..] .to_vec(); - // println!("Raw Videos: {:?}", raw_videos); + println!("Raw Videos: {:?}", raw_videos); for video_segment in &raw_videos { let vid = video_segment.split("\n").collect::>(); - let mut index = 0; + // let mut index = 0; if vid.len() > 20 { + println!("Skipping video segment with unexpected length: {}", vid.len()); continue; } // for line in vid.clone() { @@ -111,6 +114,7 @@ impl PerverzijaProvider { .split("<") .collect::>()[0] .to_string(); + println!("Title: {}", title); // html decode title = decode(title.as_bytes()).to_string().unwrap_or(title); let url = vid[1].split("iframe src="").collect::>()[1] diff --git a/src/util/flaresolverr.rs b/src/util/flaresolverr.rs index 1a92e48..542557b 100644 --- a/src/util/flaresolverr.rs +++ b/src/util/flaresolverr.rs @@ -7,7 +7,6 @@ use serde_json::json; pub struct FlareSolverrRequest { pub cmd: String, pub url: String, - pub session: String, pub maxTimeout: u32, } @@ -49,21 +48,24 @@ struct FlareSolverrResponse { version: String, } pub struct Flaresolverr { - url: String, - session: String + url: String } impl Flaresolverr { pub fn new(url: String) -> Self { Flaresolverr { - url: url, - session: "hottub".to_string() } + url: url + } } pub async fn solve( &self, request: FlareSolverrRequest, ) -> Result> { - let client = Client::new(); + let client = Client::builder() + .proxy(Proxy::https("http://192.168.0.101:8080").unwrap()) + .proxy(Proxy::http("http://192.168.0.101:8080").unwrap()) + .danger_accept_invalid_certs(true) + .build()?; let response = client .post("http://192.168.0.103:8191/v1") @@ -71,12 +73,12 @@ impl Flaresolverr { .json(&json!({ "cmd": request.cmd, "url": request.url, - "session": request.session, "maxTimeout": request.maxTimeout, })) .send().await?; let body: FlareSolverrResponse = response.json::().await?; + println!("FlareSolverr response: {:?}, {}", body.status, body.solution.response.len()); Ok(body.solution.response) } }