erome: single-word queries that are uploader names go to the uploader
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
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};
|
||||
use crate::status::*;
|
||||
use crate::util::parse_abbreviated_number;
|
||||
use crate::videos::{ServerOptions, VideoItem};
|
||||
@@ -164,6 +164,26 @@ impl EromeProvider {
|
||||
(!slug.is_empty()).then_some(slug)
|
||||
}
|
||||
|
||||
/// A single-word query that is an existing uploader name (`/{name}` answers
|
||||
/// 404 otherwise) goes to that uploader's albums, else keyword search.
|
||||
async fn resolve_keyword(&self, query: &str, options: &ServerOptions) -> Option<Target> {
|
||||
let slug = query.trim().trim_start_matches('@');
|
||||
if slug.is_empty()
|
||||
|| !slug
|
||||
.chars()
|
||||
.all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-')
|
||||
{
|
||||
return None;
|
||||
}
|
||||
let url = format!("{}/{slug}", self.url);
|
||||
let mut requester = requester_or_default(options, CHANNEL_ID, "resolve_keyword");
|
||||
probe_first_archive(&mut requester, &[url], &format!("{}/", self.url), |body| {
|
||||
body.contains("album-link")
|
||||
})
|
||||
.await
|
||||
.map(|_| Target::UploaderPosts { slug: slug.to_string() })
|
||||
}
|
||||
|
||||
fn resolve_target(&self, query: &str, options: &ServerOptions, sort: &str) -> Target {
|
||||
if let Some(site) = options.sites.as_deref() {
|
||||
let normalized = site.trim();
|
||||
@@ -367,7 +387,12 @@ impl Provider for EromeProvider {
|
||||
};
|
||||
let query_value = query.unwrap_or_default();
|
||||
let page_value = page.parse::<u16>().unwrap_or(1);
|
||||
let target = self.resolve_target(&query_value, &options, &sort_value);
|
||||
let mut target = self.resolve_target(&query_value, &options, &sort_value);
|
||||
if let Target::Search { query, .. } = &target {
|
||||
if let Some(found) = self.resolve_keyword(query, &options).await {
|
||||
target = found;
|
||||
}
|
||||
}
|
||||
let url = self.build_url_for_target(&target, page_value);
|
||||
|
||||
match self.fetch_page(&options, &url).await {
|
||||
|
||||
Reference in New Issue
Block a user