tube8: resolve pornstar/channel names without prefix
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
use crate::DbPool;
|
||||
use crate::api::ClientVersion;
|
||||
use crate::providers::{
|
||||
Provider, build_proxy_url, proxy_aylo_thumb, report_provider_error, requester_or_default,
|
||||
Provider, build_proxy_url, probe_first_archive, proxy_aylo_thumb, 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, VideoFormat, VideoItem};
|
||||
@@ -136,6 +138,25 @@ impl Tube8Provider {
|
||||
]
|
||||
}
|
||||
|
||||
/// A free-form query that names a pornstar or a channel goes to that
|
||||
/// archive (probed on the site; unknown names 404), else keyword search.
|
||||
async fn resolve_keyword(&self, requester: &mut Requester, query: &str) -> Option<Target> {
|
||||
let slug = slug_dashed(query);
|
||||
if slug.is_empty() {
|
||||
return None;
|
||||
}
|
||||
let candidates = [
|
||||
Target::Pornstar { slug: slug.clone() },
|
||||
Target::Channel { slug },
|
||||
];
|
||||
let urls: Vec<String> = candidates.iter().map(|t| self.build_url(t, 1)).collect();
|
||||
let (index, _) = probe_first_archive(requester, &urls, &format!("{BASE_URL}/"), |body| {
|
||||
body.contains("video-box")
|
||||
})
|
||||
.await?;
|
||||
candidates.into_iter().nth(index)
|
||||
}
|
||||
|
||||
fn target_from_request(query: Option<&str>, sort: &str) -> Target {
|
||||
if let Some(q) = query.map(str::trim).filter(|v| !v.is_empty()) {
|
||||
let lower = q.to_ascii_lowercase();
|
||||
@@ -439,7 +460,13 @@ impl Provider for Tube8Provider {
|
||||
options: ServerOptions,
|
||||
) -> Vec<VideoItem> {
|
||||
let page = page.parse::<u16>().unwrap_or(1).max(1);
|
||||
let target = Self::target_from_request(query.as_deref(), &sort);
|
||||
let mut requester = requester_or_default(&options, CHANNEL_ID, "get_videos");
|
||||
let mut target = Self::target_from_request(query.as_deref(), &sort);
|
||||
if let Target::Search { query } = &target {
|
||||
if let Some(found) = self.resolve_keyword(&mut requester, query).await {
|
||||
target = found;
|
||||
}
|
||||
}
|
||||
let url = self.build_url(&target, page);
|
||||
|
||||
let old_items = match cache.get(&url) {
|
||||
@@ -450,7 +477,6 @@ impl Provider for Tube8Provider {
|
||||
None => vec![],
|
||||
};
|
||||
|
||||
let mut requester = requester_or_default(&options, CHANNEL_ID, "get_videos");
|
||||
let text = match requester
|
||||
.get_with_headers(&url, Self::html_headers(), None)
|
||||
.await
|
||||
|
||||
Reference in New Issue
Block a user