From 7a8a9c10e1ea06b6ee2d79da83fa82cbddb5449f Mon Sep 17 00:00:00 2001 From: "J. Alexander Treuman" Date: Wed, 25 Apr 2007 23:46:11 +0000 Subject: [PATCH] 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 --- ChangeLog | 1 + src/command.c | 23 +++++++++++++++++++++++ src/dbUtils.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/dbUtils.h | 5 ++++- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5e43b7ad8..1d71bb317 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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) diff --git a/src/command.c b/src/command.c index e62919e90..519f6ff19 100644 --- a/src/command.c +++ b/src/command.c @@ -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); } diff --git a/src/dbUtils.c b/src/dbUtils.c index 370a38dd6..756431650 100644 --- a/src/dbUtils.c +++ b/src/dbUtils.c @@ -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, diff --git a/src/dbUtils.h b/src/dbUtils.h index 722ff15b0..0607bc3b5 100644 --- a/src/dbUtils.h +++ b/src/dbUtils.h @@ -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);