allow searching for albums with an empty tag
tfing wrote:
> I have quite some files with an empty album tag as they do not come
> from a particular album.
>
> If I want to look for those files and browse them, this happens:
> :: nc localhost 6600
> OK MPD 0.12.0
> find album ""
> ACK [2@0] {find} too few arguments for "find"
>
> I'd like to be able to browse those files in a client like gmpc.
> So these 2 items would have to be developed:
> - list album should report that some files have an empty tag
> - it should be possible to search for an empty tag with the find command
Patch-by: Marc Pavot
ref: http://musicpd.org/mantis/view.php?id=464
			
			
This commit is contained in:
		
				
					committed by
					
						
						Max Kellermann
					
				
			
			
				
	
			
			
			
						parent
						
							5f0ed72c48
						
					
				
				
					commit
					a4019f7d21
				
			@@ -295,8 +295,10 @@ static void visitTag(struct client *client, struct strset *set,
 | 
			
		||||
	for (i = 0; i < tag->numOfItems; i++) {
 | 
			
		||||
		if (tag->items[i]->type == tagType) {
 | 
			
		||||
			strset_add(set, tag->items[i]->value);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	strset_add(set, "");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct list_tags_data {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								src/locate.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/locate.c
									
									
									
									
									
								
							@@ -127,6 +127,7 @@ static int strstrSearchTag(Song * song, enum tag_type type, char *str)
 | 
			
		||||
	int i;
 | 
			
		||||
	char *duplicate;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	mpd_sint8 visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
 | 
			
		||||
 | 
			
		||||
	if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
 | 
			
		||||
		char path_max_tmp[MPD_PATH_MAX];
 | 
			
		||||
@@ -142,17 +143,27 @@ static int strstrSearchTag(Song * song, enum tag_type type, char *str)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < song->tag->numOfItems && !ret; i++) {
 | 
			
		||||
		visitedTypes[song->tag->items[i]->type] = 1;
 | 
			
		||||
		if (type != LOCATE_TAG_ANY_TYPE &&
 | 
			
		||||
		    song->tag->items[i]->type != type) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		duplicate = strDupToUpper(song->tag->items[i]->value);
 | 
			
		||||
		if (strstr(duplicate, str))
 | 
			
		||||
		if (*str && strstr(duplicate, str))
 | 
			
		||||
			ret = 1;
 | 
			
		||||
		free(duplicate);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/** 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 1.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!*str && !visitedTypes[type])
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -173,6 +184,7 @@ int strstrSearchTags(Song * song, int numItems, LocateTagItem * items)
 | 
			
		||||
static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	mpd_sint8 visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
 | 
			
		||||
 | 
			
		||||
	if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
 | 
			
		||||
		char path_max_tmp[MPD_PATH_MAX];
 | 
			
		||||
@@ -186,6 +198,7 @@ static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < song->tag->numOfItems; i++) {
 | 
			
		||||
		visitedTypes[song->tag->items[i]->type] = 1;
 | 
			
		||||
		if (type != LOCATE_TAG_ANY_TYPE &&
 | 
			
		||||
		    song->tag->items[i]->type != type) {
 | 
			
		||||
			continue;
 | 
			
		||||
@@ -195,6 +208,15 @@ static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
 | 
			
		||||
			return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/** 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 1.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!*str && !visitedTypes[type])
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user