From 44faf1080c944b4b9f579e34346c0b0d56de7da2 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
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;
 }