youporn: resolve pornstar/channel/amateur names without prefix

This commit is contained in:
Simon
2026-10-17 05:38:47 +00:00
parent 1e56fe2da5
commit 1f95549167

View File

@@ -1,8 +1,11 @@
use crate::DbPool;
use crate::api::ClientVersion;
use crate::providers::{Provider, report_provider_error, requester_or_default};
use crate::providers::{
Provider, probe_first_archive, report_provider_error, requester_or_default, slug_dashed,
};
use crate::status::*;
use crate::util::cache::VideoCache;
use crate::util::requester::Requester;
use crate::util::parse_abbreviated_number;
use crate::util::time::parse_time_to_seconds;
use crate::videos::{ServerOptions, VideoItem};
@@ -248,6 +251,33 @@ impl YoupornProvider {
}
}
/// A free-form query that names a pornstar, channel or amateur goes to that
/// archive (probed on the site; unknown names 404), else keyword search.
async fn resolve_keyword(
&self,
requester: &mut Requester,
query: &str,
sort: &str,
) -> Option<Target> {
let slug = slug_dashed(query);
if slug.is_empty() {
return None;
}
let sort = Self::normalized_sort(sort).to_string();
let candidates = [
Target::Pornstar { slug: slug.clone(), sort: sort.clone() },
Target::Channel { slug: slug.clone(), sort: sort.clone() },
Target::Amateur { slug, sort },
];
let urls: Vec<String> = candidates.iter().map(|t| self.build_url(t, 1)).collect();
let referer = format!("{}/", self.url.trim_end_matches('/'));
let (index, _) = probe_first_archive(requester, &urls, &referer, |body| {
body.contains("js_video-box")
})
.await?;
candidates.into_iter().nth(index)
}
fn build_url(&self, target: &Target, page: u8) -> String {
match target {
Target::Latest { sort } => format!(
@@ -543,7 +573,13 @@ impl Provider for YoupornProvider {
) -> Vec<VideoItem> {
let query = query.unwrap_or_default();
let page = page.parse::<u8>().unwrap_or(1);
let target = self.target_from_query(&query, &sort);
let mut requester = requester_or_default(&options, CHANNEL_ID, "get_videos");
let mut target = self.target_from_query(&query, &sort);
if let Target::Search { query } = &target {
if let Some(found) = self.resolve_keyword(&mut requester, query, &sort).await {
target = found;
}
}
let video_url = self.build_url(&target, page);
let old_items = match cache.get(&video_url) {
@@ -554,7 +590,6 @@ impl Provider for YoupornProvider {
None => vec![],
};
let mut requester = requester_or_default(&options, CHANNEL_ID, "get_videos");
let referer = format!("{}/", self.url.trim_end_matches('/'));
let text = match requester
.get_with_headers(&video_url, Self::html_headers(&referer), Some(Version::HTTP_11))