use crate::util::parse_abbreviated_number; use crate::DbPool; use crate::providers::Provider; use crate::util::cache::VideoCache; use crate::util::time::parse_time_to_seconds; use crate::videos::{ServerOptions, VideoItem}; use error_chain::error_chain; use htmlentity::entity::{decode, ICodedDataTrait}; use async_trait::async_trait; use std::vec; error_chain! { foreign_links { Io(std::io::Error); HttpRequest(wreq::Error); } errors { Parse(msg: String) { description("parse error") display("parse error: {}", msg) } } } #[derive(Debug, Clone)] pub struct PornhubProvider { url: String, } impl PornhubProvider { pub fn new() -> Self { Self { url: "https://www.pornhub.com".to_string(), } } async fn get( &self, cache: VideoCache, page: u8, sort: &str, options: ServerOptions, ) -> 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 => { return Ok(items.clone()); } Some((_, items)) => items.clone(), None => vec![], }; let mut requester = match options.requester.clone() { Some(r) => r, None => return Ok(old_items), }; let text = match requester.get(&video_url, None).await { Ok(t) => t, Err(_) => return Ok(old_items), }; let video_items = self.get_video_items_from_html(text, "