fixes and cleanup

This commit is contained in:
Simon
2026-03-05 18:18:48 +00:00
parent 76fd5a4f4f
commit 2627505ade
49 changed files with 3245 additions and 1376 deletions

View File

@@ -1,19 +1,19 @@
use crate::api::ClientVersion;
use crate::util::parse_abbreviated_number;
use crate::DbPool;
use crate::api::ClientVersion;
use crate::providers::{Provider, report_provider_error};
use crate::status::*;
use crate::util::cache::VideoCache;
use crate::util::flaresolverr::{FlareSolverrRequest, Flaresolverr};
use crate::util::parse_abbreviated_number;
use crate::util::time::parse_time_to_seconds;
use crate::videos::{ServerOptions, VideoItem};
use async_trait::async_trait;
use error_chain::error_chain;
use htmlentity::entity::{ICodedDataTrait, decode};
use std::env;
use std::vec;
use wreq::{Client};
use wreq::Client;
use wreq_util::Emulation;
use async_trait::async_trait;
error_chain! {
foreign_links {
@@ -68,12 +68,7 @@ impl OkxxxProvider {
cacheDuration: Some(1800),
}
}
async fn get(
&self,
cache: VideoCache,
page: u8,
sort: &str,
) -> Result<Vec<VideoItem>> {
async fn get(&self, cache: VideoCache, page: u8, sort: &str) -> Result<Vec<VideoItem>> {
let sort_string = match sort {
"trending" => "/trending",
"popular" => "/popular",
@@ -94,13 +89,22 @@ impl OkxxxProvider {
};
// let proxy = Proxy::all("http://192.168.0.103:8081").unwrap();
let client = Client::builder().cert_verification(false).emulation(Emulation::Firefox136).build()?;
let client = Client::builder()
.cert_verification(false)
.emulation(Emulation::Firefox136)
.build()?;
let mut response = client.get(video_url.clone())
// .proxy(proxy.clone())
.send().await?;
let mut response = client
.get(video_url.clone())
// .proxy(proxy.clone())
.send()
.await?;
if response.status().is_redirection() {
let location = match response.headers().get("Location").and_then(|h| h.to_str().ok()) {
let location = match response
.headers()
.get("Location")
.and_then(|h| h.to_str().ok())
{
Some(location) => location,
None => {
report_provider_error(
@@ -133,12 +137,7 @@ impl OkxxxProvider {
let flare_url = match env::var("FLARE_URL") {
Ok(url) => url,
Err(e) => {
report_provider_error(
"okxxx",
"get.flare_url",
&e.to_string(),
)
.await;
report_provider_error("okxxx", "get.flare_url", &e.to_string()).await;
return Ok(old_items);
}
};
@@ -169,17 +168,18 @@ impl OkxxxProvider {
Ok(video_items)
}
}
async fn query(
&self,
cache: VideoCache,
page: u8,
query: &str,
) -> Result<Vec<VideoItem>> {
async fn query(&self, cache: VideoCache, page: u8, query: &str) -> Result<Vec<VideoItem>> {
let search_string = query.to_lowercase().trim().replace(" ", "-");
let mut video_url = format!("{}/search/{}/{}/", self.url, search_string, page);
if search_string.starts_with("@"){
let url_part = search_string.split("@").collect::<Vec<&str>>().get(1).copied().unwrap_or_default().replace(":", "/");
if search_string.starts_with("@") {
let url_part = search_string
.split("@")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.replace(":", "/");
video_url = format!("{}/{}/", self.url, url_part);
}
// Check our Video Cache. If the result is younger than 1 hour, we return it.
@@ -198,14 +198,23 @@ impl OkxxxProvider {
};
// let proxy = Proxy::all("http://192.168.0.103:8081").unwrap();
let client = Client::builder().cert_verification(false).emulation(Emulation::Firefox136).build()?;
let client = Client::builder()
.cert_verification(false)
.emulation(Emulation::Firefox136)
.build()?;
let mut response = client.get(video_url.clone())
// .proxy(proxy.clone())
.send().await?;
let mut response = client
.get(video_url.clone())
// .proxy(proxy.clone())
.send()
.await?;
if response.status().is_redirection() {
let location = match response.headers().get("Location").and_then(|h| h.to_str().ok()) {
let location = match response
.headers()
.get("Location")
.and_then(|h| h.to_str().ok())
{
Some(location) => location,
None => {
report_provider_error(
@@ -238,12 +247,7 @@ impl OkxxxProvider {
let flare_url = match env::var("FLARE_URL") {
Ok(url) => url,
Err(e) => {
report_provider_error(
"okxxx",
"query.flare_url",
&e.to_string(),
)
.await;
report_provider_error("okxxx", "query.flare_url", &e.to_string()).await;
return Ok(old_items);
}
};
@@ -278,7 +282,12 @@ impl OkxxxProvider {
return vec![];
}
let mut items: Vec<VideoItem> = Vec::new();
let raw_videos = html.split("<div class=\"pagination\"").collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
let raw_videos = html
.split("<div class=\"pagination\"")
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.split("item thumb-bl thumb-bl-video video_")
.collect::<Vec<&str>>()[1..]
.to_vec();
@@ -287,61 +296,150 @@ impl OkxxxProvider {
// for (index, line) in vid.iter().enumerate() {
// println!("Line {}: {}", index, line);
// }
let video_url: String = format!("{}{}", self.url, video_segment.split("<a href=\"").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
let video_url: String = format!(
"{}{}",
self.url,
video_segment
.split("<a href=\"")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("\"")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default());
let preview_url = video_segment.split("data-preview-custom=\"").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
);
let preview_url = video_segment
.split("data-preview-custom=\"")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("\"")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string();
let mut title = video_segment.split("\" title=\"").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
let mut title = video_segment
.split("\" title=\"")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("\"")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string();
// html decode
title = decode(title.as_bytes()).to_string().unwrap_or(title);
let id = video_url.split("/").collect::<Vec<&str>>().get(4).copied().unwrap_or_default().to_string();
let raw_duration = video_segment.split("fa fa-clock-o").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
.split("<span>").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
let id = video_url
.split("/")
.collect::<Vec<&str>>()
.get(4)
.copied()
.unwrap_or_default()
.to_string();
let raw_duration = video_segment
.split("fa fa-clock-o")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("<span>")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("<")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string();
let duration = parse_time_to_seconds(&raw_duration).unwrap_or(0) as u32;
let thumb = format!("https:{}", video_segment.split(" class=\"thumb lazy-load\"").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
.split("data-original=\"").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
.split("\"")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.to_string());
let thumb = format!(
"https:{}",
video_segment
.split(" class=\"thumb lazy-load\"")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("data-original=\"")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("\"")
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string()
);
let mut tags = vec![];
if video_segment.contains("href=\"/sites/"){
if video_segment.contains("href=\"/sites/") {
let raw_tags = video_segment.split("href=\"/sites/").collect::<Vec<&str>>()[1..]
.iter()
.map(|s| s.split("/\"").collect::<Vec<&str>>().get(0).copied().unwrap_or_default().to_string())
.map(|s| {
s.split("/\"")
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string()
})
.collect::<Vec<String>>();
for tag in raw_tags {
if !tag.is_empty() {
tags.push(format!("@sites:{}",tag));
tags.push(format!("@sites:{}", tag));
}
}
}
if video_segment.contains("href=\"/models/"){
let raw_tags = video_segment.split("href=\"/models/").collect::<Vec<&str>>()[1..]
if video_segment.contains("href=\"/models/") {
let raw_tags = video_segment
.split("href=\"/models/")
.collect::<Vec<&str>>()[1..]
.iter()
.map(|s| s.split("/\"").collect::<Vec<&str>>().get(0).copied().unwrap_or_default().to_string())
.map(|s| {
s.split("/\"")
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string()
})
.collect::<Vec<String>>();
for tag in raw_tags {
if !tag.is_empty() {
tags.push(format!("@models:{}",tag));
tags.push(format!("@models:{}", tag));
}
}
}
let views_part = video_segment.split("fa fa-eye").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
.split("<span>").collect::<Vec<&str>>().get(1).copied().unwrap_or_default()
let views_part = video_segment
.split("fa fa-eye")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("<span>")
.collect::<Vec<&str>>()
.get(1)
.copied()
.unwrap_or_default()
.split("<")
.collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.collect::<Vec<&str>>()
.get(0)
.copied()
.unwrap_or_default()
.to_string();
let views = parse_abbreviated_number(&views_part).unwrap_or(0) as u32;
@@ -355,14 +453,11 @@ impl OkxxxProvider {
)
.preview(preview_url)
.views(views)
.tags(tags)
;
.tags(tags);
items.push(video_item);
}
return items;
}
}
#[async_trait]
@@ -381,10 +476,7 @@ impl Provider for OkxxxProvider {
let _ = per_page;
let _ = pool;
let videos: std::result::Result<Vec<VideoItem>, Error> = match query {
Some(q) => {
self.query(cache, page.parse::<u8>().unwrap_or(1), &q,)
.await
}
Some(q) => self.query(cache, page.parse::<u8>().unwrap_or(1), &q).await,
None => {
self.get(cache, page.parse::<u8>().unwrap_or(1), &sort)
.await