From 50bdb438b582d34529c4cfb156d7dd8154525030 Mon Sep 17 00:00:00 2001 From: yggverse Date: Tue, 12 Aug 2025 00:58:40 +0300 Subject: [PATCH] make sure the keyword is really empty (does not contain separators only) --- src/public.rs | 77 ++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/src/public.rs b/src/public.rs index 77e95b9..9c9ae96 100644 --- a/src/public.rs +++ b/src/public.rs @@ -103,6 +103,10 @@ impl Public { keyword: Option<&str>, sort_order: Option<(Sort, Order)>, ) -> Result, Error> { + const S: &[char] = &[ + '_', '-', ':', ';', ',', '(', ')', '[', ']', '/', '!', '?', + ' ', // @TODO make separators list optional + ]; let mut files = Vec::with_capacity(self.default_capacity); for dir_entry in fs::read_dir(&self.root)? { let entry = dir_entry?; @@ -111,48 +115,45 @@ impl Public { continue; } if let Some(k) = keyword - && !k.is_empty() + && !k.trim_matches(S).is_empty() && !librqbit_core::torrent_metainfo::torrent_from_bytes(&fs::read(&path)?) .is_ok_and(|m: librqbit_core::torrent_metainfo::TorrentMetaV1Owned| { - k.split([ - '_', '-', ':', ';', ',', '(', ')', '[', ']', '/', '!', '?', - ' ', // @TODO make separators list optional - ]) - .filter(|s| !s.is_empty()) - .map(|s| s.trim().to_lowercase()) - .all(|q| { - m.info_hash.as_string().to_lowercase().contains(&q) - || m.info - .name - .as_ref() - .is_some_and(|n| n.to_string().to_lowercase().contains(&q)) - || m.comment - .as_ref() - .is_some_and(|c| c.to_string().to_lowercase().contains(&q)) - || m.created_by - .as_ref() - .is_some_and(|c| c.to_string().to_lowercase().contains(&q)) - || m.publisher - .as_ref() - .is_some_and(|p| p.to_string().to_lowercase().contains(&q)) - || m.publisher_url - .as_ref() - .is_some_and(|u| u.to_string().to_lowercase().contains(&q)) - || m.announce - .as_ref() - .is_some_and(|a| a.to_string().to_lowercase().contains(&q)) - || m.announce_list.iter().any(|l| { - l.iter().any(|a| a.to_string().to_lowercase().contains(&q)) - }) - || m.info.files.as_ref().is_some_and(|f| { - f.iter().any(|f| { - let mut p = PathBuf::new(); - f.full_path(&mut p).is_ok_and(|_| { - p.to_string_lossy().to_lowercase().contains(&q) + k.split(S) + .filter(|s| !s.is_empty()) + .map(|s| s.trim().to_lowercase()) + .all(|q| { + m.info_hash.as_string().to_lowercase().contains(&q) + || m.info + .name + .as_ref() + .is_some_and(|n| n.to_string().to_lowercase().contains(&q)) + || m.comment + .as_ref() + .is_some_and(|c| c.to_string().to_lowercase().contains(&q)) + || m.created_by + .as_ref() + .is_some_and(|c| c.to_string().to_lowercase().contains(&q)) + || m.publisher + .as_ref() + .is_some_and(|p| p.to_string().to_lowercase().contains(&q)) + || m.publisher_url + .as_ref() + .is_some_and(|u| u.to_string().to_lowercase().contains(&q)) + || m.announce + .as_ref() + .is_some_and(|a| a.to_string().to_lowercase().contains(&q)) + || m.announce_list.iter().any(|l| { + l.iter().any(|a| a.to_string().to_lowercase().contains(&q)) + }) + || m.info.files.as_ref().is_some_and(|f| { + f.iter().any(|f| { + let mut p = PathBuf::new(); + f.full_path(&mut p).is_ok_and(|_| { + p.to_string_lossy().to_lowercase().contains(&q) + }) }) }) - }) - }) + }) }) { continue;