make sure the keyword is really empty (does not contain separators only)

This commit is contained in:
yggverse 2025-08-12 00:58:40 +03:00
parent e2e7ceda9d
commit 50bdb438b5

View file

@ -103,6 +103,10 @@ impl Public {
keyword: Option<&str>, keyword: Option<&str>,
sort_order: Option<(Sort, Order)>, sort_order: Option<(Sort, Order)>,
) -> Result<Vec<File>, Error> { ) -> Result<Vec<File>, Error> {
const S: &[char] = &[
'_', '-', ':', ';', ',', '(', ')', '[', ']', '/', '!', '?',
' ', // @TODO make separators list optional
];
let mut files = Vec::with_capacity(self.default_capacity); let mut files = Vec::with_capacity(self.default_capacity);
for dir_entry in fs::read_dir(&self.root)? { for dir_entry in fs::read_dir(&self.root)? {
let entry = dir_entry?; let entry = dir_entry?;
@ -111,48 +115,45 @@ impl Public {
continue; continue;
} }
if let Some(k) = keyword if let Some(k) = keyword
&& !k.is_empty() && !k.trim_matches(S).is_empty()
&& !librqbit_core::torrent_metainfo::torrent_from_bytes(&fs::read(&path)?) && !librqbit_core::torrent_metainfo::torrent_from_bytes(&fs::read(&path)?)
.is_ok_and(|m: librqbit_core::torrent_metainfo::TorrentMetaV1Owned| { .is_ok_and(|m: librqbit_core::torrent_metainfo::TorrentMetaV1Owned| {
k.split([ k.split(S)
'_', '-', ':', ';', ',', '(', ')', '[', ']', '/', '!', '?', .filter(|s| !s.is_empty())
' ', // @TODO make separators list optional .map(|s| s.trim().to_lowercase())
]) .all(|q| {
.filter(|s| !s.is_empty()) m.info_hash.as_string().to_lowercase().contains(&q)
.map(|s| s.trim().to_lowercase()) || m.info
.all(|q| { .name
m.info_hash.as_string().to_lowercase().contains(&q) .as_ref()
|| m.info .is_some_and(|n| n.to_string().to_lowercase().contains(&q))
.name || m.comment
.as_ref() .as_ref()
.is_some_and(|n| n.to_string().to_lowercase().contains(&q)) .is_some_and(|c| c.to_string().to_lowercase().contains(&q))
|| m.comment || m.created_by
.as_ref() .as_ref()
.is_some_and(|c| c.to_string().to_lowercase().contains(&q)) .is_some_and(|c| c.to_string().to_lowercase().contains(&q))
|| m.created_by || m.publisher
.as_ref() .as_ref()
.is_some_and(|c| c.to_string().to_lowercase().contains(&q)) .is_some_and(|p| p.to_string().to_lowercase().contains(&q))
|| m.publisher || m.publisher_url
.as_ref() .as_ref()
.is_some_and(|p| p.to_string().to_lowercase().contains(&q)) .is_some_and(|u| u.to_string().to_lowercase().contains(&q))
|| m.publisher_url || m.announce
.as_ref() .as_ref()
.is_some_and(|u| u.to_string().to_lowercase().contains(&q)) .is_some_and(|a| a.to_string().to_lowercase().contains(&q))
|| m.announce || m.announce_list.iter().any(|l| {
.as_ref() l.iter().any(|a| a.to_string().to_lowercase().contains(&q))
.is_some_and(|a| a.to_string().to_lowercase().contains(&q)) })
|| m.announce_list.iter().any(|l| { || m.info.files.as_ref().is_some_and(|f| {
l.iter().any(|a| a.to_string().to_lowercase().contains(&q)) f.iter().any(|f| {
}) let mut p = PathBuf::new();
|| m.info.files.as_ref().is_some_and(|f| { f.full_path(&mut p).is_ok_and(|_| {
f.iter().any(|f| { p.to_string_lossy().to_lowercase().contains(&q)
let mut p = PathBuf::new(); })
f.full_path(&mut p).is_ok_and(|_| {
p.to_string_lossy().to_lowercase().contains(&q)
}) })
}) })
}) })
})
}) })
{ {
continue; continue;