SongFilter: add special keyword "base"
Restores the features from the previous draft commands "findin" / "searchin".
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include "Song.hxx"
|
||||
#include "tag/Tag.hxx"
|
||||
#include "util/ASCII.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
@@ -43,6 +44,9 @@ locate_parse_type(const char *str)
|
||||
if (StringEqualsCaseASCII(str, LOCATE_TAG_ANY_KEY))
|
||||
return LOCATE_TAG_ANY_TYPE;
|
||||
|
||||
if (strcmp(str, "base") == 0)
|
||||
return LOCATE_TAG_BASE_TYPE;
|
||||
|
||||
return tag_name_parse_i(str);
|
||||
}
|
||||
|
||||
@@ -134,6 +138,11 @@ SongFilter::Item::Match(const Tag &_tag) const
|
||||
bool
|
||||
SongFilter::Item::Match(const Song &song) const
|
||||
{
|
||||
if (tag == LOCATE_TAG_BASE_TYPE) {
|
||||
const auto uri = song.GetURI();
|
||||
return uri_is_child_or_same(value.c_str(), uri.c_str());
|
||||
}
|
||||
|
||||
if (tag == LOCATE_TAG_FILE_TYPE) {
|
||||
const auto uri = song.GetURI();
|
||||
return StringMatch(uri.c_str());
|
||||
@@ -159,6 +168,14 @@ SongFilter::Parse(const char *tag_string, const char *value, bool fold_case)
|
||||
if (tag == TAG_NUM_OF_ITEM_TYPES)
|
||||
return false;
|
||||
|
||||
if (tag == LOCATE_TAG_BASE_TYPE) {
|
||||
if (!uri_safe_local(value))
|
||||
return false;
|
||||
|
||||
/* case folding doesn't work with "base" */
|
||||
fold_case = false;
|
||||
}
|
||||
|
||||
items.push_back(Item(tag, value, fold_case));
|
||||
return true;
|
||||
}
|
||||
@@ -185,3 +202,13 @@ SongFilter::Match(const Song &song) const
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string
|
||||
SongFilter::GetBase() const
|
||||
{
|
||||
for (const auto &i : items)
|
||||
if (i.GetTag() == LOCATE_TAG_BASE_TYPE)
|
||||
return i.GetValue();
|
||||
|
||||
return std::string();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user