From a486bc550244966b90a4d318ad317023bd2ac158 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 17 Oct 2026 06:03:58 +0000 Subject: [PATCH] erome: single-word queries that are uploader names go to the uploader --- src/providers/erome.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/providers/erome.rs b/src/providers/erome.rs index 38293dc..74fa325 100644 --- a/src/providers/erome.rs +++ b/src/providers/erome.rs @@ -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 { + 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::().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 {