Commit 1f118ea9 authored by Warren Dukes's avatar Warren Dukes

now more flexible list, search, find, where you can enter pairs of

"conditionals". Note that logical and is implied. git-svn-id: https://svn.musicpd.org/mpd/trunk@2624 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 18a2d5ab
0.12 0.12
---- ----
*) rewrite search, find, locate to tag LocateTagItem pairs
*) better handle streams so they don't use TagTracker *) better handle streams so they don't use TagTracker
*) implement listener socket protocol as documented here: *) implement listener socket protocol as documented here:
http://www.musicpd.org/wiki/moin.cgi/MpdListenerProtocol http://www.musicpd.org/wiki/moin.cgi/MpdListenerProtocol
*) add support for coverart using freedesktop standard for icons/images *) add support for coverart
*) using freedesktop standard for icons/images
*) use coverart in tags in the audio file
*) rewrite saved playlist code *) rewrite saved playlist code
*) abstract out saved playlists from playlist.c *) abstract out saved playlists from playlist.c
......
...@@ -444,17 +444,18 @@ int handleFind(FILE * fp, unsigned int * permission, int argArrayLength, ...@@ -444,17 +444,18 @@ int handleFind(FILE * fp, unsigned int * permission, int argArrayLength,
{ {
int ret; int ret;
LocateTagItem * item = newLocateTagItem(argArray[1], argArray[2]); LocateTagItem * items;
int numItems = newLocateTagItemArrayFromArgArray(argArray+1,
argArrayLength-1, &items);
if(!item) { if(numItems <= 0) {
commandError(fp, ACK_ERROR_ARG, "\%s\" isn't recognized", commandError(fp, ACK_ERROR_ARG, "incorrect ags", NULL);
argArray[1]);
return -1; return -1;
} }
ret = findSongsIn(fp, NULL, item); ret = findSongsIn(fp, NULL, numItems, items);
freeLocateTagItem(item); freeLocateTagItemArray(numItems, items);
return ret; return ret;
} }
...@@ -464,17 +465,18 @@ int handleSearch(FILE * fp, unsigned int * permission, int argArrayLength, ...@@ -464,17 +465,18 @@ int handleSearch(FILE * fp, unsigned int * permission, int argArrayLength,
{ {
int ret; int ret;
LocateTagItem * item = newLocateTagItem(argArray[1], argArray[2]); LocateTagItem * items;
int numItems = newLocateTagItemArrayFromArgArray(argArray+1,
argArrayLength-1, &items);
if(!item) { if(numItems <= 0) {
commandError(fp, ACK_ERROR_ARG, "\%s\" isn't recognized", commandError(fp, ACK_ERROR_ARG, "incorrect ags", NULL);
argArray[1]);
return -1; return -1;
} }
ret = searchForSongsIn(fp, NULL, item); ret = searchForSongsIn(fp, NULL, numItems, items);
freeLocateTagItem(item); freeLocateTagItemArray(numItems, items);
return ret; return ret;
} }
...@@ -636,10 +638,20 @@ int handleList(FILE * fp, unsigned int * permission, int argArrayLength, ...@@ -636,10 +638,20 @@ int handleList(FILE * fp, unsigned int * permission, int argArrayLength,
argArray[2]); argArray[2]);
numConditionals = 1; numConditionals = 1;
} }
else {
numConditionals = newLocateTagItemArrayFromArgArray(argArray+2,
argArrayLength-2, &conditionals);
if(numConditionals < 0) {
commandError(fp, ACK_ERROR_ARG,
"not able to parse args", NULL);
return -1;
}
}
ret = listAllUniqueTags(fp, tagType, numConditionals,conditionals); ret = listAllUniqueTags(fp, tagType, numConditionals,conditionals);
if(conditionals) free(conditionals); if(conditionals) freeLocateTagItemArray(numConditionals, conditionals);
return ret; return ret;
} }
...@@ -904,8 +916,8 @@ void initCommands() { ...@@ -904,8 +916,8 @@ void initCommands() {
addCommand(COMMAND_LSINFO ,PERMISSION_READ, 0, 1,handleLsInfo,NULL); addCommand(COMMAND_LSINFO ,PERMISSION_READ, 0, 1,handleLsInfo,NULL);
addCommand(COMMAND_RM ,PERMISSION_CONTROL, 1, 1,handleRm,NULL); addCommand(COMMAND_RM ,PERMISSION_CONTROL, 1, 1,handleRm,NULL);
addCommand(COMMAND_PLAYLISTINFO,PERMISSION_READ, 0, 1,handlePlaylistInfo,NULL); addCommand(COMMAND_PLAYLISTINFO,PERMISSION_READ, 0, 1,handlePlaylistInfo,NULL);
addCommand(COMMAND_FIND ,PERMISSION_READ, 2, 2,handleFind,NULL); addCommand(COMMAND_FIND ,PERMISSION_READ, 2,-1,handleFind,NULL);
addCommand(COMMAND_SEARCH ,PERMISSION_READ, 2, 2,handleSearch,NULL); addCommand(COMMAND_SEARCH ,PERMISSION_READ, 2,-1,handleSearch,NULL);
addCommand(COMMAND_UPDATE ,PERMISSION_ADMIN, 0, 1,handleUpdate,listHandleUpdate); addCommand(COMMAND_UPDATE ,PERMISSION_ADMIN, 0, 1,handleUpdate,listHandleUpdate);
addCommand(COMMAND_NEXT ,PERMISSION_CONTROL, 0, 0,handleNext,NULL); addCommand(COMMAND_NEXT ,PERMISSION_CONTROL, 0, 0,handleNext,NULL);
addCommand(COMMAND_PREVIOUS ,PERMISSION_CONTROL, 0, 0,handlePrevious,NULL); addCommand(COMMAND_PREVIOUS ,PERMISSION_CONTROL, 0, 0,handlePrevious,NULL);
...@@ -915,7 +927,7 @@ void initCommands() { ...@@ -915,7 +927,7 @@ void initCommands() {
addCommand(COMMAND_RANDOM ,PERMISSION_CONTROL, 1, 1,handleRandom,NULL); addCommand(COMMAND_RANDOM ,PERMISSION_CONTROL, 1, 1,handleRandom,NULL);
addCommand(COMMAND_STATS ,PERMISSION_READ, 0, 0,handleStats,NULL); addCommand(COMMAND_STATS ,PERMISSION_READ, 0, 0,handleStats,NULL);
addCommand(COMMAND_CLEAR_ERROR ,PERMISSION_CONTROL, 0, 0,handleClearError,NULL); addCommand(COMMAND_CLEAR_ERROR ,PERMISSION_CONTROL, 0, 0,handleClearError,NULL);
addCommand(COMMAND_LIST ,PERMISSION_READ, 1, 2,handleList,NULL); addCommand(COMMAND_LIST ,PERMISSION_READ, 1,-1,handleList,NULL);
addCommand(COMMAND_MOVE ,PERMISSION_CONTROL, 2, 2,handleMove,NULL); addCommand(COMMAND_MOVE ,PERMISSION_CONTROL, 2, 2,handleMove,NULL);
addCommand(COMMAND_MOVEID ,PERMISSION_CONTROL, 2, 2,handleMoveId,NULL); addCommand(COMMAND_MOVEID ,PERMISSION_CONTROL, 2, 2,handleMoveId,NULL);
addCommand(COMMAND_SWAP ,PERMISSION_CONTROL, 2, 2,handleSwap,NULL); addCommand(COMMAND_SWAP ,PERMISSION_CONTROL, 2, 2,handleSwap,NULL);
......
...@@ -11,12 +11,17 @@ ...@@ -11,12 +11,17 @@
#define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10 #define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10
#define LOCATE_TAG_FILE_KEY "filename" #define LOCATE_TAG_FILE_KEY "filename"
typedef struct ListCommandItem { typedef struct _ListCommandItem {
mpd_sint8 tagType; mpd_sint8 tagType;
int numConditionals; int numConditionals;
LocateTagItem * conditionals; LocateTagItem * conditionals;
} ListCommandItem; } ListCommandItem;
typedef struct _LocateTagItemArray {
int numItems;
LocateTagItem * items;
} LocateTagItemArray;
int getLocateTagItemType(char * str) { int getLocateTagItemType(char * str) {
int i; int i;
...@@ -31,21 +36,67 @@ int getLocateTagItemType(char * str) { ...@@ -31,21 +36,67 @@ int getLocateTagItemType(char * str) {
return -1; return -1;
} }
static int initLocateTagItem(LocateTagItem * item, char * typeStr,
char * needle)
{
item->tagType = getLocateTagItemType(typeStr);
if(item->tagType < 0) return -1;
item->needle = strdup(needle);
return 0;
}
LocateTagItem * newLocateTagItem(char * typeStr, char * needle) { LocateTagItem * newLocateTagItem(char * typeStr, char * needle) {
LocateTagItem * ret = malloc(sizeof(LocateTagItem)); LocateTagItem * ret = malloc(sizeof(LocateTagItem));
ret->tagType = getLocateTagItemType(typeStr); if(initLocateTagItem(ret, typeStr, needle) < 0) {
if(ret->tagType < 0) {
free(ret); free(ret);
return NULL; ret = NULL;
} }
ret->needle = strdup(needle);
return ret; return ret;
} }
void freeLocateTagItemArray(int count, LocateTagItem * array) {
int i;
for(i = 0; i < count; i++) free(array[i].needle);
free(array);
}
int newLocateTagItemArrayFromArgArray(char * argArray[],
int numArgs,
LocateTagItem ** arrayRet)
{
int i,j;
LocateTagItem * item;
if(numArgs == 0) return 0;
if(numArgs%2 != 0) return -1;
*arrayRet = malloc(sizeof(LocateTagItem)*numArgs/2);
for(i = 0, item = *arrayRet; i < numArgs/2; i++, item++) {
if(initLocateTagItem(item, argArray[i*2], argArray[i*2+1]) < 0)
goto fail;
}
return numArgs/2;
fail:
for(j = 0; j < i; j++) {
free((*arrayRet)[j].needle);
}
free(*arrayRet);
*arrayRet = NULL;
return -1;
}
void freeLocateTagItem(LocateTagItem * item) { void freeLocateTagItem(LocateTagItem * item) {
free(item->needle); free(item->needle);
free(item); free(item);
...@@ -96,25 +147,48 @@ static inline int strstrSearchTag(Song * song, int type, char * str) { ...@@ -96,25 +147,48 @@ static inline int strstrSearchTag(Song * song, int type, char * str) {
return ret; return ret;
} }
int searchInDirectory(FILE * fp, Song * song, void * item) { int searchInDirectory(FILE * fp, Song * song, void * data) {
if(strstrSearchTag(song, ((LocateTagItem *)item)->tagType, LocateTagItemArray * array = data;
((LocateTagItem *)item)->needle)) { int i;
printSongInfo(fp, song);
for(i = 0; i < array->numItems; i++) {
if(!strstrSearchTag(song, array->items[i].tagType,
array->items[i].needle))
{
return 0;
}
} }
printSongInfo(fp, song);
return 0; return 0;
} }
int searchForSongsIn(FILE * fp, char * name, LocateTagItem * item) { int searchForSongsIn(FILE * fp, char * name, int numItems,
char * originalNeedle = item->needle; LocateTagItem * items)
{
int ret = -1; int ret = -1;
int i;
item->needle = strDupToUpper(originalNeedle); char ** originalNeedles = malloc(numItems*sizeof(char *));
LocateTagItemArray array;
ret = traverseAllIn(fp,name,searchInDirectory, NULL, for(i = 0; i < numItems; i++) {
(void *)item); originalNeedles[i] = items[i].needle;
items[i].needle = strDupToUpper(originalNeedles[i]);
}
free(item->needle); array.numItems = numItems;
item->needle = originalNeedle; array.items = items;
ret = traverseAllIn(fp,name,searchInDirectory, NULL, &array);
for(i = 0; i < numItems; i++) {
free(items[i].needle);
items[i].needle = originalNeedles[i];
}
free(originalNeedles);
return ret; return ret;
} }
...@@ -137,17 +211,31 @@ static inline int tagItemFoundAndMatches(Song * song, int type, char * str) { ...@@ -137,17 +211,31 @@ static inline int tagItemFoundAndMatches(Song * song, int type, char * str) {
return 0; return 0;
} }
int findInDirectory(FILE * fp, Song * song, void * item) { int findInDirectory(FILE * fp, Song * song, void * data) {
if(tagItemFoundAndMatches(song, ((LocateTagItem *)item)->tagType, LocateTagItemArray * array = data;
((LocateTagItem *)item)->needle)) { int i;
printSongInfo(fp, song);
for(i = 0; i < 0; i++) {
if(!tagItemFoundAndMatches(song, array->items[i].tagType,
array->items[i].needle))
{
return 0;
}
} }
printSongInfo(fp, song);
return 0; return 0;
} }
int findSongsIn(FILE * fp, char * name, LocateTagItem * item) { int findSongsIn(FILE * fp, char * name, int numItems, LocateTagItem * items) {
LocateTagItemArray array;
array.numItems = numItems;
array.items = items;
return traverseAllIn(fp, name, findInDirectory, NULL, return traverseAllIn(fp, name, findInDirectory, NULL,
(void *)item); (void *)&array);
} }
int printAllIn(FILE * fp, char * name) { int printAllIn(FILE * fp, char * name) {
......
...@@ -12,10 +12,17 @@ typedef struct _LocateTagItem { ...@@ -12,10 +12,17 @@ typedef struct _LocateTagItem {
char * needle; char * needle;
} LocateTagItem; } LocateTagItem;
int getLocateTagItemType(char * str);
/* returns NULL if not a known type */ /* returns NULL if not a known type */
LocateTagItem * newLocateTagItem(char * typeString, char * needle); LocateTagItem * newLocateTagItem(char * typeString, char * needle);
int getLocateTagItemType(char * str); /* return number of items or -1 on error */
int newLocateTagItemArrayFromArgArray(char * argArray[], int numArgs,
LocateTagItem ** arrayRet);
void freeLocateTagItemArray(int count, LocateTagItem * array);
void freeLocateTagItem(LocateTagItem * item); void freeLocateTagItem(LocateTagItem * item);
...@@ -25,9 +32,11 @@ int addAllIn(FILE * fp, char * name); ...@@ -25,9 +32,11 @@ int addAllIn(FILE * fp, char * name);
int printInfoForAllIn(FILE * fp, char * name); int printInfoForAllIn(FILE * fp, char * name);
int searchForSongsIn(FILE * fp, char * name, LocateTagItem * item); int searchForSongsIn(FILE * fp, char * name, int numItems,
LocateTagItem * items);
int findSongsIn(FILE * fp, char * name, LocateTagItem * item); int findSongsIn(FILE * fp, char * name, int numItems,
LocateTagItem * items);
int countSongsIn(FILE * fp, char * name); int countSongsIn(FILE * fp, char * name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment