From 23f6571911098451254fef84be0cbbe4cb98b69d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 1 Oct 2025 08:14:46 +0000 Subject: [PATCH] updates to sxyprn --- src/providers/sxyprn.rs | 234 ++++++++++++++++++++++++++++------------ src/videos.rs | 2 +- 2 files changed, 165 insertions(+), 71 deletions(-) diff --git a/src/providers/sxyprn.rs b/src/providers/sxyprn.rs index 5b2efe3..1f1f23d 100644 --- a/src/providers/sxyprn.rs +++ b/src/providers/sxyprn.rs @@ -1,15 +1,15 @@ -use std::vec; -use error_chain::error_chain; -use htmlentity::entity::{decode, ICodedDataTrait}; -use scraper::ElementRef; +use crate::DbPool; use crate::providers::Provider; use crate::util::cache::VideoCache; -use crate::util::time::parse_time_to_seconds; -use crate::videos::ServerOptions; -use crate::videos::{VideoItem}; -use crate::DbPool; use crate::util::requester::Requester; +use crate::util::time::parse_time_to_seconds; +use crate::videos::VideoItem; +use crate::videos::{self, ServerOptions, VideoFormat}; +use error_chain::error_chain; +use htmlentity::entity::{ICodedDataTrait, decode}; +use scraper::ElementRef; use scraper::{Html, Selector}; +use std::vec; error_chain! { foreign_links { @@ -19,7 +19,6 @@ error_chain! { } } - fn has_blacklisted_class(element: &ElementRef, blacklist: &[&str]) -> bool { element .value() @@ -35,11 +34,17 @@ pub struct SxyprnProvider { impl SxyprnProvider { pub fn new() -> Self { SxyprnProvider { - url: "https://sxyprn.com".to_string() + url: "https://sxyprn.com".to_string(), } } - async fn get(&self, cache:VideoCache, pool:DbPool, page: u8, sort: String, options: ServerOptions) -> Result> { - + async fn get( + &self, + cache: VideoCache, + pool: DbPool, + page: u8, + sort: String, + options: ServerOptions, + ) -> Result> { let sort_string = match sort.as_str() { "views" => "views", "rating" => "rating", @@ -55,14 +60,19 @@ impl SxyprnProvider { }; let mut requester = options.requester.clone().unwrap(); - let url_str = format!("{}/blog/all/{}.html?fl={}&sm={}", self.url, ((page as u32)-1)*20, filter_string, sort_string); - + let url_str = format!( + "{}/blog/all/{}.html?fl={}&sm={}", + self.url, + ((page as u32) - 1) * 20, + filter_string, + sort_string + ); + let old_items = match cache.get(&url_str) { Some((time, items)) => { if time.elapsed().unwrap_or_default().as_secs() < 60 * 60 { return Ok(items.clone()); - } - else{ + } else { items.clone() } } @@ -73,17 +83,27 @@ impl SxyprnProvider { let text = requester.get(&url_str).await.unwrap(); // Pass a reference to options if needed, or reconstruct as needed - let video_items: Vec = self.get_video_items_from_html(text.clone(), pool, requester).await; + let video_items: Vec = self + .get_video_items_from_html(text.clone(), pool, requester) + .await; if !video_items.is_empty() { cache.remove(&url_str); cache.insert(url_str.clone(), video_items.clone()); - } else{ + } else { return Ok(old_items); } Ok(video_items) } - async fn query(&self, cache: VideoCache, pool:DbPool, page: u8, query: &str, sort: String, options: ServerOptions) -> Result> { + async fn query( + &self, + cache: VideoCache, + pool: DbPool, + page: u8, + query: &str, + sort: String, + options: ServerOptions, + ) -> Result> { let sort_string = match sort.as_str() { "views" => "views", "rating" => "trending", @@ -102,52 +122,62 @@ impl SxyprnProvider { Some((time, items)) => { if time.elapsed().unwrap_or_default().as_secs() < 60 * 60 { return Ok(items.clone()); - } - else{ + } else { let _ = cache.check().await; - return Ok(items.clone()) + return Ok(items.clone()); } } None => { vec![] } - }; + }; let text = requester.get(&url_str).await.unwrap(); - let video_items: Vec = self.get_video_items_from_html(text.clone(), pool, requester).await; + let video_items: Vec = self + .get_video_items_from_html(text.clone(), pool, requester) + .await; if !video_items.is_empty() { cache.remove(&url_str); cache.insert(url_str.clone(), video_items.clone()); - } else{ + } else { return Ok(old_items); } Ok(video_items) } - async fn get_video_items_from_html(&self, html: String, pool: DbPool, requester: Requester) -> Vec { + async fn get_video_items_from_html( + &self, + html: String, + pool: DbPool, + requester: Requester, + ) -> Vec { if html.is_empty() { println!("HTML is empty"); return vec![]; } - let raw_videos = html - .split("