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:
parent
5f0ed72c48
commit
a4019f7d21
@ -295,8 +295,10 @@ static void visitTag(struct client *client, struct strset *set,
|
|||||||
for (i = 0; i < tag->numOfItems; i++) {
|
for (i = 0; i < tag->numOfItems; i++) {
|
||||||
if (tag->items[i]->type == tagType) {
|
if (tag->items[i]->type == tagType) {
|
||||||
strset_add(set, tag->items[i]->value);
|
strset_add(set, tag->items[i]->value);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
strset_add(set, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct list_tags_data {
|
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;
|
int i;
|
||||||
char *duplicate;
|
char *duplicate;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
mpd_sint8 visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
|
||||||
|
|
||||||
if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
|
if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
|
||||||
char path_max_tmp[MPD_PATH_MAX];
|
char path_max_tmp[MPD_PATH_MAX];
|
||||||
@ -142,17 +143,27 @@ static int strstrSearchTag(Song * song, enum tag_type type, char *str)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < song->tag->numOfItems && !ret; i++) {
|
for (i = 0; i < song->tag->numOfItems && !ret; i++) {
|
||||||
|
visitedTypes[song->tag->items[i]->type] = 1;
|
||||||
if (type != LOCATE_TAG_ANY_TYPE &&
|
if (type != LOCATE_TAG_ANY_TYPE &&
|
||||||
song->tag->items[i]->type != type) {
|
song->tag->items[i]->type != type) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
duplicate = strDupToUpper(song->tag->items[i]->value);
|
duplicate = strDupToUpper(song->tag->items[i]->value);
|
||||||
if (strstr(duplicate, str))
|
if (*str && strstr(duplicate, str))
|
||||||
ret = 1;
|
ret = 1;
|
||||||
free(duplicate);
|
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;
|
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)
|
static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
mpd_sint8 visitedTypes[TAG_NUM_OF_ITEM_TYPES] = { 0 };
|
||||||
|
|
||||||
if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
|
if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) {
|
||||||
char path_max_tmp[MPD_PATH_MAX];
|
char path_max_tmp[MPD_PATH_MAX];
|
||||||
@ -186,6 +198,7 @@ static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < song->tag->numOfItems; i++) {
|
for (i = 0; i < song->tag->numOfItems; i++) {
|
||||||
|
visitedTypes[song->tag->items[i]->type] = 1;
|
||||||
if (type != LOCATE_TAG_ANY_TYPE &&
|
if (type != LOCATE_TAG_ANY_TYPE &&
|
||||||
song->tag->items[i]->type != type) {
|
song->tag->items[i]->type != type) {
|
||||||
continue;
|
continue;
|
||||||
@ -195,6 +208,15 @@ static int tagItemFoundAndMatches(Song * song, enum tag_type type, char *str)
|
|||||||
return 1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user