aboutsummaryrefslogtreecommitdiffstats
path: root/src/SongFilter.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/SongFilter.cxx')
-rw-r--r--src/SongFilter.cxx27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx
index 7592f2665..396bd7191 100644
--- a/src/SongFilter.cxx
+++ b/src/SongFilter.cxx
@@ -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();
+}