commit
ef09737c17
@ -1,3 +1,4 @@
|
|||||||
pub mod import_builder;
|
pub mod import_builder;
|
||||||
pub mod tagging_builder;
|
pub mod tagging_builder;
|
||||||
pub mod tag_builder;
|
pub mod tag_builder;
|
||||||
|
pub mod search_builder;
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
use crate::api_core::searching_and_fetching_files::FileSearchOptions;
|
||||||
|
use crate::error::Result;
|
||||||
|
use crate::utils::tag_list_to_string_list;
|
||||||
|
use crate::wrapper::hydrus_file::HydrusFile;
|
||||||
|
use crate::wrapper::service::ServiceName;
|
||||||
|
use crate::wrapper::tag::Tag;
|
||||||
|
use crate::Client;
|
||||||
|
|
||||||
|
pub enum SortType {
|
||||||
|
FileSize,
|
||||||
|
Duration,
|
||||||
|
ImportTime,
|
||||||
|
FileType,
|
||||||
|
Random,
|
||||||
|
Width,
|
||||||
|
Height,
|
||||||
|
Ratio,
|
||||||
|
NumberOfPixels,
|
||||||
|
NumberOfTags,
|
||||||
|
NumberOfMediaViewers,
|
||||||
|
MediaViewTime,
|
||||||
|
Bitrate,
|
||||||
|
HasAudio,
|
||||||
|
ModifiedTime,
|
||||||
|
Framerate,
|
||||||
|
NumberOfFrames,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct SearchBuilder {
|
||||||
|
client: Client,
|
||||||
|
tags: Vec<Tag>,
|
||||||
|
options: FileSearchOptions,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SearchBuilder {
|
||||||
|
pub(crate) fn new(client: Client) -> Self {
|
||||||
|
Self {
|
||||||
|
client,
|
||||||
|
tags: Vec::new(),
|
||||||
|
options: FileSearchOptions::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add multiple tags to filter by
|
||||||
|
pub fn add_tags(mut self, mut tags: Vec<Tag>) -> Self {
|
||||||
|
self.tags.append(&mut tags);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add a tag to filter by
|
||||||
|
pub fn add_tag(mut self, tag: Tag) -> Self {
|
||||||
|
self.tags.push(tag);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the sort type
|
||||||
|
pub fn sort_by(mut self, sort_type: SortType) -> Self {
|
||||||
|
self.options = self.options.sort_type(sort_type as u8);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sorts descending
|
||||||
|
pub fn sort_descending(mut self) -> Self {
|
||||||
|
self.options = self.options.desc();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sorts ascending
|
||||||
|
pub fn sort_ascending(mut self) -> Self {
|
||||||
|
self.options = self.options.asc();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the file service name to search in
|
||||||
|
pub fn file_service_name(mut self, service: ServiceName) -> Self {
|
||||||
|
self.options = self.options.file_service_name(service);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the tag service to search by
|
||||||
|
pub fn tag_service_name(mut self, service: ServiceName) -> Self {
|
||||||
|
self.options = self.options.tag_service_name(service);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the file service key. This option is preferred over
|
||||||
|
/// setting it by name because it's faster
|
||||||
|
pub fn file_service_key<S: ToString>(mut self, key: S) -> Self {
|
||||||
|
self.options = self.options.file_service_key(key);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the tag service key. This option is preferred over
|
||||||
|
/// setting it by name because it's faster
|
||||||
|
pub fn tag_service_key<S: ToString>(mut self, key: S) -> Self {
|
||||||
|
self.options = self.options.tag_service_key(key);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Runs the search
|
||||||
|
pub async fn run(self) -> Result<Vec<HydrusFile>> {
|
||||||
|
let client = self.client.clone();
|
||||||
|
let response = client
|
||||||
|
.search_files(tag_list_to_string_list(self.tags), self.options)
|
||||||
|
.await?;
|
||||||
|
let files = response
|
||||||
|
.file_ids
|
||||||
|
.into_iter()
|
||||||
|
.map(|id| HydrusFile::from_id(client.clone(), id))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(files)
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,8 @@
|
|||||||
|
mod test_address;
|
||||||
mod test_files;
|
mod test_files;
|
||||||
mod test_hydrus;
|
mod test_hydrus;
|
||||||
mod test_import;
|
mod test_import;
|
||||||
mod test_url;
|
|
||||||
mod test_page;
|
mod test_page;
|
||||||
mod test_address;
|
mod test_service;
|
||||||
mod test_tags;
|
mod test_tags;
|
||||||
|
mod test_url;
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
use super::super::common;
|
||||||
|
use hydrus_api::wrapper::service::{Service, ServiceType, Services};
|
||||||
|
|
||||||
|
async fn get_services() -> Services {
|
||||||
|
let hydrus = common::get_hydrus();
|
||||||
|
hydrus.services().await.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_file_service() -> Service {
|
||||||
|
let services = get_services().await;
|
||||||
|
services
|
||||||
|
.get_services(ServiceType::LocalFiles)
|
||||||
|
.pop()
|
||||||
|
.unwrap()
|
||||||
|
.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn it_searches_for_files() {
|
||||||
|
let service = get_file_service().await;
|
||||||
|
service
|
||||||
|
.search()
|
||||||
|
.add_tag("character:rimuru tempest".into())
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
Loading…
Reference in New Issue