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::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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user