From 44faf1080c944b4b9f579e34346c0b0d56de7da2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 26 Sep 2013 19:25:13 +0200 Subject: [PATCH] SongFilter: search for album artist falls back to the artist tag Implement Mantis ticket 0003646. --- NEWS | 1 + src/SongFilter.cxx | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index dc6b16472..eb0cbce08 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ ver 0.18 (2012/??/??) - allow tilde paths for socket * protocol: - new command "toggleoutput" + - search for album artist falls back to the artist tag * innput: - curl: enable https - soup: plugin removed diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx index c0404406d..4b8ae20ba 100644 --- a/src/SongFilter.cxx +++ b/src/SongFilter.cxx @@ -94,15 +94,27 @@ SongFilter::Item::Match(const Tag &_tag) const return true; } - /** If the search critieron was not visited during the sweep - * through the song's tag, it means this field is absent from - * the tag or empty. Thus, if the searched string is also - * empty (first char is a \0), then it's a match as well and - * we should return true. - */ - if (*value == 0 && tag < TAG_NUM_OF_ITEM_TYPES && - !visited_types[tag]) - return true; + if (tag < TAG_NUM_OF_ITEM_TYPES && !visited_types[tag]) { + /* If the search critieron was not visited during the + sweep through the song's tag, it means this field + is absent from the tag or empty. Thus, if the + searched string is also empty (first char is a \0), + then it's a match as well and we should return + true. */ + if (*value == 0) + return true; + + if (tag == TAG_ALBUM_ARTIST && visited_types[TAG_ARTIST]) { + /* if we're looking for "album artist", but + only "artist" exists, use that */ + for (unsigned i = 0; i < _tag.num_items; i++) { + const TagItem &item = *_tag.items[i]; + if (item.type == TAG_ARTIST && + StringMatch(item.value)) + return true; + } + } + } return false; }