erome: single-word queries that are uploader names go to the uploader

This commit is contained in:
Simon
2026-10-17 06:03:58 +00:00
parent 270b327f73
commit a486bc5502

View File

@@ -1,6 +1,6 @@
use crate::DbPool; use crate::DbPool;
use crate::api::ClientVersion; 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::status::*;
use crate::util::parse_abbreviated_number; use crate::util::parse_abbreviated_number;
use crate::videos::{ServerOptions, VideoItem}; use crate::videos::{ServerOptions, VideoItem};
@@ -164,6 +164,26 @@ impl EromeProvider {
(!slug.is_empty()).then_some(slug) (!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 { fn resolve_target(&self, query: &str, options: &ServerOptions, sort: &str) -> Target {
if let Some(site) = options.sites.as_deref() { if let Some(site) = options.sites.as_deref() {
let normalized = site.trim(); let normalized = site.trim();
@@ -367,7 +387,12 @@ impl Provider for EromeProvider {
}; };
let query_value = query.unwrap_or_default(); let query_value = query.unwrap_or_default();
let page_value = page.parse::<u16>().unwrap_or(1); 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); let url = self.build_url_for_target(&target, page_value);
match self.fetch_page(&options, &url).await { match self.fetch_page(&options, &url).await {