use crate::schema::videos::url; use crate::util::parse_abbreviated_number; use crate::DbPool; use crate::providers::Provider; use crate::util::cache::VideoCache; use crate::util::flaresolverr::{FlareSolverrRequest, Flaresolverr}; use crate::util::time::parse_time_to_seconds; use crate::videos::{VideoItem}; use error_chain::error_chain; use futures::stream::SplitSink; use htmlentity::entity::{ICodedDataTrait, decode}; use std::env; use std::vec; use wreq::{Client, Proxy}; use wreq_util::Emulation; error_chain! { foreign_links { Io(std::io::Error); HttpRequest(wreq::Error); } } #[derive(Debug, Clone)] pub struct PornhubProvider { url: String, } impl PornhubProvider { pub fn new() -> Self { PornhubProvider { url: "https://www.pornhub.com".to_string(), } } async fn get( &self, cache: VideoCache, page: u8, sort: &str, ) -> Result> { let video_url = format!("{}/video?o={}&page={}", self.url, sort, page); let old_items = match cache.get(&video_url) { Some((time, items)) => { if time.elapsed().unwrap_or_default().as_secs() < 60 * 5 { println!("Cache hit for URL: {}", video_url); return Ok(items.clone()); } else { items.clone() } } None => { vec![] } }; let proxy = Proxy::all("http://192.168.0.103:8081").unwrap(); let client = Client::builder().cert_verification(false).emulation(Emulation::Firefox136).build()?; let mut response = client.get(video_url.clone()) // .proxy(proxy.clone()) .send().await?; if response.status().is_redirection(){ response = client.get(self.url.clone() + response.headers()["Location"].to_str().unwrap()) // .proxy(proxy) .send().await?; } if response.status().is_success() { let text = response.text().await?; let video_items: Vec = self.get_video_items_from_html(text.clone(),"