MOCK API for tests

This commit is contained in:
Simon
2025-06-01 18:09:20 +00:00
parent 918ed1a125
commit ae8fd8e922
3 changed files with 94 additions and 43 deletions

View File

@@ -165,6 +165,57 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
async fn videos_post( async fn videos_post(
video_request: web::types::Json<Videos_Request>, video_request: web::types::Json<Videos_Request>,
) -> Result<impl web::Responder, web::Error> { ) -> Result<impl web::Responder, web::Error> {
// 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<String> = 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( let mut format = Video_Format::new(
"https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a" "https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a"
.to_string(), .to_string(),
@@ -176,43 +227,37 @@ async fn videos_post(
"https://pervl2.xtremestream.xyz" "https://pervl2.xtremestream.xyz"
.to_string(), .to_string(),
); );
let mut videos = Videos { let videos = Videos {
pageInfo: PageInfo { pageInfo: PageInfo {
hasNextPage: true, hasNextPage: true,
resultsPerPage: 10, resultsPerPage: 10,
}, },
items: vec![], items: vec![
}; Video_Item{
let channel: String = video_request duration: 110, // 110,
.channel views: Some(14622653), // 14622653,
.as_deref() rating: Some(0.0), // 0.0,
.unwrap_or("all") id: "794a51bb65913debd98f73111705738a".to_string(), // "c85017ca87477168d648727753c4ded8a35f173e22ef93743e707b296becb299",
.to_string(); title: "BrazzersExxtra &#8211; Give Me A D! The Best Of Cheerleaders".to_string(), // "20 Minutes of Adorable Kittens BEST Compilation",
let sort: String = video_request.sort.as_deref().unwrap_or("date").to_string(); // url: "https://tube.perverzija.com/brazzersexxtra-give-me-a-d-the-best-of-cheerleaders/".to_string(),
let mut query: Option<String> = video_request.query.clone(); // url : "https://pervl2.xtremestream.xyz/player/xs1.php?data=794a51bb65913debd98f73111705738a".to_string(), // "https://www.youtube.com/watch?v=y0sF5xhGreA",
if video_request.query.as_deref() == Some("") { url : "https://pervl2.xtremestream.xyz/player/index.php?data=794a51bb65913debd98f73111705738a".to_string(),
query = None; 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 page: u8 = video_request ],
.page };
.as_deref()
.unwrap_or("1") println!("Video: {:?}", videos);
.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();
Ok(web::HttpResponse::Ok().json(&videos)) Ok(web::HttpResponse::Ok().json(&videos))
} }

View File

@@ -27,6 +27,7 @@ impl PerverzijaProvider {
} }
} }
async fn get(&self, page: &u8, featured: String) -> Result<Vec<Video_Item>> { async fn get(&self, page: &u8, featured: String) -> Result<Vec<Video_Item>> {
println!("get");
let mut prefix_uri = "".to_string(); let mut prefix_uri = "".to_string();
if featured == "featured" { if featured == "featured" {
prefix_uri = "featured-scenes/".to_string(); prefix_uri = "featured-scenes/".to_string();
@@ -41,10 +42,10 @@ impl PerverzijaProvider {
let req = FlareSolverrRequest { let req = FlareSolverrRequest {
cmd: "request.get".to_string(), cmd: "request.get".to_string(),
url: url.clone(), url: url.clone(),
session: "hottub".to_string(),
maxTimeout: 60000, maxTimeout: 60000,
}; };
let response = flare.solve(req).await; let response = flare.solve(req).await;
// println!("Response: {:?}", response);
match response { match response {
Ok(html) => { Ok(html) => {
let video_items = self.get_video_items_from_html(html.clone()); 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<Vec<Video_Item>> { async fn query(&self, page: &u8, query: &str) -> Result<Vec<Video_Item>> {
println!("query: {}", query);
let search_string = query.replace(" ", "+"); let search_string = query.replace(" ", "+");
let mut url = format!( let mut url = format!(
"{}advanced-search/?_sf_s={}&sf_paged={}", "{}advanced-search/?_sf_s={}&sf_paged={}",
@@ -72,7 +74,6 @@ impl PerverzijaProvider {
let req = FlareSolverrRequest { let req = FlareSolverrRequest {
cmd: "request.get".to_string(), cmd: "request.get".to_string(),
url: url.clone(), url: url.clone(),
session: "hottub".to_string(),
maxTimeout: 60000, maxTimeout: 60000,
}; };
let response = flare.solve(req).await; let response = flare.solve(req).await;
@@ -89,17 +90,19 @@ impl PerverzijaProvider {
} }
fn get_video_items_from_html(&self, html: String) -> Vec<Video_Item> { fn get_video_items_from_html(&self, html: String) -> Vec<Video_Item> {
// println!("HTML: {}", html);
let mut items: Vec<Video_Item> = Vec::new(); let mut items: Vec<Video_Item> = Vec::new();
let video_listing_content = html.split("video-listing-content").collect::<Vec<&str>>()[1]; let video_listing_content = html.split("video-listing-content").collect::<Vec<&str>>()[1];
let raw_videos = video_listing_content let raw_videos = video_listing_content
.split("video-item post") .split("video-item post")
.collect::<Vec<&str>>()[1..] .collect::<Vec<&str>>()[1..]
.to_vec(); .to_vec();
// println!("Raw Videos: {:?}", raw_videos); println!("Raw Videos: {:?}", raw_videos);
for video_segment in &raw_videos { for video_segment in &raw_videos {
let vid = video_segment.split("\n").collect::<Vec<&str>>(); let vid = video_segment.split("\n").collect::<Vec<&str>>();
let mut index = 0; // let mut index = 0;
if vid.len() > 20 { if vid.len() > 20 {
println!("Skipping video segment with unexpected length: {}", vid.len());
continue; continue;
} }
// for line in vid.clone() { // for line in vid.clone() {
@@ -111,6 +114,7 @@ impl PerverzijaProvider {
.split("<") .split("<")
.collect::<Vec<&str>>()[0] .collect::<Vec<&str>>()[0]
.to_string(); .to_string();
println!("Title: {}", title);
// html decode // html decode
title = decode(title.as_bytes()).to_string().unwrap_or(title); title = decode(title.as_bytes()).to_string().unwrap_or(title);
let url = vid[1].split("iframe src=&quot;").collect::<Vec<&str>>()[1] let url = vid[1].split("iframe src=&quot;").collect::<Vec<&str>>()[1]

View File

@@ -7,7 +7,6 @@ use serde_json::json;
pub struct FlareSolverrRequest { pub struct FlareSolverrRequest {
pub cmd: String, pub cmd: String,
pub url: String, pub url: String,
pub session: String,
pub maxTimeout: u32, pub maxTimeout: u32,
} }
@@ -49,21 +48,24 @@ struct FlareSolverrResponse {
version: String, version: String,
} }
pub struct Flaresolverr { pub struct Flaresolverr {
url: String, url: String
session: String
} }
impl Flaresolverr { impl Flaresolverr {
pub fn new(url: String) -> Self { pub fn new(url: String) -> Self {
Flaresolverr { Flaresolverr {
url: url, url: url
session: "hottub".to_string() } }
} }
pub async fn solve( pub async fn solve(
&self, &self,
request: FlareSolverrRequest, request: FlareSolverrRequest,
) -> Result<String, Box<dyn std::error::Error>> { ) -> Result<String, Box<dyn std::error::Error>> {
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 let response = client
.post("http://192.168.0.103:8191/v1") .post("http://192.168.0.103:8191/v1")
@@ -71,12 +73,12 @@ impl Flaresolverr {
.json(&json!({ .json(&json!({
"cmd": request.cmd, "cmd": request.cmd,
"url": request.url, "url": request.url,
"session": request.session,
"maxTimeout": request.maxTimeout, "maxTimeout": request.maxTimeout,
})) }))
.send().await?; .send().await?;
let body: FlareSolverrResponse = response.json::<FlareSolverrResponse>().await?; let body: FlareSolverrResponse = response.json::<FlareSolverrResponse>().await?;
println!("FlareSolverr response: {:?}, {}", body.status, body.solution.response.len());
Ok(body.solution.response) Ok(body.solution.response)
} }
} }