provider refactors and fixes

This commit is contained in:
Simon
2026-03-05 13:28:38 +00:00
parent 060d8e7937
commit 8157e223fe
33 changed files with 3051 additions and 1694 deletions

View File

@@ -1,6 +1,6 @@
use crate::DbPool;
use crate::api::ClientVersion;
use crate::providers::Provider;
use crate::providers::{Provider, report_provider_error};
use crate::status::*;
use crate::util::cache::VideoCache;
use crate::videos::{ServerOptions, VideoItem};
@@ -89,17 +89,38 @@ impl ChaturbateProvider {
}
};
let mut requester = options.requester.clone().unwrap();
let text = requester
let mut requester =
crate::providers::requester_or_default(&options, module_path!(), "missing_requester");
let response = match requester
.get_raw_with_headers(
&video_url,
vec![("X-Requested-With".to_string(), "XMLHttpRequest".to_string())],
)
.await
.unwrap()
.text()
.await
.unwrap();
{
Ok(response) => response,
Err(e) => {
report_provider_error(
"chaturbate",
"get.request",
&format!("url={video_url}; error={e}"),
)
.await;
return Ok(old_items);
}
};
let text = match response.text().await {
Ok(text) => text,
Err(e) => {
report_provider_error(
"chaturbate",
"get.response_text",
&format!("url={video_url}; error={e}"),
)
.await;
return Ok(old_items);
}
};
let video_items: Vec<VideoItem> = self.get_video_items_from_html(text.clone());
if !video_items.is_empty() {
cache.remove(&video_url);
@@ -139,18 +160,38 @@ impl ChaturbateProvider {
}
};
let mut requester = options.requester.clone().unwrap();
let text = requester
let mut requester =
crate::providers::requester_or_default(&options, module_path!(), "missing_requester");
let response = match requester
.get_raw_with_headers(
&video_url,
vec![("X-Requested-With".to_string(), "XMLHttpRequest".to_string())],
)
.await
.unwrap()
.text()
.await
.unwrap();
{
Ok(response) => response,
Err(e) => {
report_provider_error(
"chaturbate",
"query.request",
&format!("url={video_url}; error={e}"),
)
.await;
return Ok(old_items);
}
};
let text = match response.text().await {
Ok(text) => text,
Err(e) => {
report_provider_error(
"chaturbate",
"query.response_text",
&format!("url={video_url}; error={e}"),
)
.await;
return Ok(old_items);
}
};
let video_items: Vec<VideoItem> = self.get_video_items_from_html(text.clone());
if !video_items.is_empty() {
cache.remove(&video_url);
@@ -171,7 +212,18 @@ impl ChaturbateProvider {
println!("Failed to parse JSON: {}", e);
serde_json::Value::Null
});
for video_segment in json.get("rooms").unwrap().as_array().unwrap_or(&vec![]) {
let rooms = match json.get("rooms").and_then(|v| v.as_array()) {
Some(rooms) => rooms,
None => {
crate::providers::report_provider_error_background(
"chaturbate",
"get_video_items_from_html.rooms_missing",
"missing rooms array",
);
return items;
}
};
for video_segment in rooms {
if video_segment
.get("has_password")
.unwrap_or(&serde_json::Value::Bool(false))
@@ -184,10 +236,18 @@ impl ChaturbateProvider {
// for (index, line) in vid.iter().enumerate() {
// println!("Line {}: {}", index, line);
// }
let username = video_segment
let Some(username) = video_segment
.get("username")
.and_then(|v| v.as_str())
.map(String::from).unwrap();
.map(String::from)
else {
crate::providers::report_provider_error_background(
"chaturbate",
"get_video_items_from_html.username_missing",
"missing username field",
);
continue;
};
let video_url: String = format!("{}/{}/", self.url, username);
let mut title = video_segment
.get("room_subject")
@@ -202,7 +262,7 @@ impl ChaturbateProvider {
.unwrap_or(&serde_json::Value::String("".to_string()))
.as_str()
.unwrap_or("")
.split("?").collect::<Vec<&str>>()[0]
.split("?").collect::<Vec<&str>>().get(0).copied().unwrap_or_default()
.to_string();
let views = video_segment
.get("viewers")