You need to sign in or sign up before continuing.
Commit 7a8a9c10 authored by J. Alexander Treuman's avatar J. Alexander Treuman

Adding count command. It's usage is identical to find, but instead of

returning a list of matching songs, the number of results and total play time of the results are returned. git-svn-id: https://svn.musicpd.org/mpd/trunk@5950 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 7fd98595
......@@ -17,6 +17,7 @@ ver 0.13.0 (2007/??/??)
* New tagtypes command for retrieving a list of available tag types
* Fix a bug where no ACK was returned if loading a playlist failed
* Fix a bug where db_update in stats would be 0 after initial database creation
* New count command for getting stats on found songs (similar to "find")
* Lots of bug fixes, cleaned up code, and performance improvements
ver 0.12.2 (2007/3/20)
......
......@@ -96,6 +96,7 @@
#define COMMAND_PLAYLISTFIND "playlistfind"
#define COMMAND_PLAYLISTSEARCH "playlistsearch"
#define COMMAND_TAGTYPES "tagtypes"
#define COMMAND_COUNT "count"
#define COMMAND_STATUS_VOLUME "volume"
#define COMMAND_STATUS_STATE "state"
......@@ -518,6 +519,27 @@ static int handleSearch(int fd, int *permission, int argc, char *argv[])
return ret;
}
static int handleCount(int fd, int *permission, int argc, char *argv[])
{
int ret;
LocateTagItem *items;
int numItems = newLocateTagItemArrayFromArgArray(argv + 1,
argc - 1,
&items);
if (numItems <= 0) {
commandError(fd, ACK_ERROR_ARG, "incorrect arguments");
return -1;
}
ret = searchStatsForSongsIn(fd, NULL, numItems, items);
freeLocateTagItemArray(numItems, items);
return ret;
}
static int handlePlaylistFind(int fd, int *permission, int argc, char *argv[])
{
LocateTagItem *items;
......@@ -1051,6 +1073,7 @@ void initCommands(void)
addCommand(COMMAND_PLAYLISTFIND, PERMISSION_READ, 2, -1, handlePlaylistFind, NULL);
addCommand(COMMAND_PLAYLISTSEARCH, PERMISSION_READ, 2, -1, handlePlaylistSearch, NULL);
addCommand(COMMAND_TAGTYPES, PERMISSION_READ, 0, 0, handleTagTypes, NULL);
addCommand(COMMAND_COUNT, PERMISSION_READ, 2, -1, handleCount, NULL);
sortList(commandList);
}
......
......@@ -38,6 +38,12 @@ typedef struct _LocateTagItemArray {
LocateTagItem *items;
} LocateTagItemArray;
typedef struct _SearchStats {
LocateTagItemArray locateArray;
int numberOfSongs;
int playTime;
} SearchStats;
static int countSongsInDirectory(int fd, Directory * directory, void *data)
{
int *count = (int *)data;
......@@ -120,6 +126,44 @@ int findSongsIn(int fd, char *name, int numItems, LocateTagItem * items)
return traverseAllIn(fd, name, findInDirectory, NULL, (void *)&array);
}
static void printSearchStats(int fd, SearchStats *stats)
{
fdprintf(fd, "songs: %i\n", stats->numberOfSongs);
fdprintf(fd, "playtime: %i\n", stats->playTime);
}
static int searchStatsInDirectory(int fd, Song * song, void *data)
{
SearchStats *stats = data;
if (tagItemsFoundAndMatches(song, stats->locateArray.numItems,
stats->locateArray.items)) {
stats->numberOfSongs++;
if (song->tag->time > 0)
stats->playTime += song->tag->time;
}
return 0;
}
int searchStatsForSongsIn(int fd, char *name, int numItems,
LocateTagItem * items)
{
SearchStats stats;
int ret;
stats.locateArray.numItems = numItems;
stats.locateArray.items = items;
stats.numberOfSongs = 0;
stats.playTime = 0;
ret = traverseAllIn(fd, name, searchStatsInDirectory, NULL, &stats);
if (ret == 0)
printSearchStats(fd, &stats);
return ret;
}
int printAllIn(int fd, char *name)
{
return traverseAllIn(fd, name, printSongInDirectory,
......
......@@ -32,10 +32,13 @@ int addAllInToStoredPlaylist(int fd, char *name, char *utf8file);
int printInfoForAllIn(int fd, char *name);
int searchForSongsIn(int fd, char *name, int numItems,
LocateTagItem * items);
LocateTagItem * items);
int findSongsIn(int fd, char *name, int numItems, LocateTagItem * items);
int searchStatsForSongsIn(int fd, char *name, int numItems,
LocateTagItem * items);
int countSongsIn(int fd, char *name);
unsigned long sumSongTimesIn(int fd, 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