MOCK API for tests
This commit is contained in:
109
src/api.rs
109
src/api.rs
@@ -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{
|
||||||
|
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
|
println!("Video: {:?}", videos);
|
||||||
.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();
|
|
||||||
Ok(web::HttpResponse::Ok().json(&videos))
|
Ok(web::HttpResponse::Ok().json(&videos))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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="").collect::<Vec<&str>>()[1]
|
let url = vid[1].split("iframe src="").collect::<Vec<&str>>()[1]
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user