mirror of
https://github.com/SuperBFG7/ympd
synced 2024-12-26 11:00:27 +00:00
Feat: configurable max_elements_per_page #47
This commit is contained in:
parent
2d2949d6f7
commit
f53c20296a
@ -37,3 +37,6 @@ taglist = Artist,Album,AlbumArtist,Title,Track,Genre,Date,Composer,Performer
|
||||
|
||||
#Enable smart playlists
|
||||
smartpls = true
|
||||
|
||||
#Elements per page for pagination, max: 400
|
||||
max_elements_per_page = 100
|
||||
|
@ -814,11 +814,8 @@ int mympd_get_updatedb_state(char *buffer) {
|
||||
struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE);
|
||||
|
||||
status = mpd_run_status(mpd.conn);
|
||||
if (!status) {
|
||||
printf("MPD mpd_run_status: %s\n", mpd_connection_get_error_message(mpd.conn));
|
||||
mpd.conn_state = MPD_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
if (!status)
|
||||
RETURN_ERROR_AND_RECOVER("replay_gain_status");
|
||||
update_id = mpd_status_get_update_id(status);
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Update database ID: %d\n", update_id);
|
||||
@ -830,8 +827,7 @@ int mympd_get_updatedb_state(char *buffer) {
|
||||
|
||||
mpd_status_free(status);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1142,8 +1138,7 @@ int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, int *
|
||||
*queue_length = mpd_status_get_queue_length(status);
|
||||
mpd_status_free(status);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1164,8 +1159,7 @@ int mympd_put_volume(char *buffer) {
|
||||
);
|
||||
mpd_status_free(status);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1175,8 +1169,7 @@ int mympd_put_welcome(char *buffer) {
|
||||
|
||||
len = json_printf(&out, "{type: welcome, data: {version: %Q}}", MYMPD_VERSION);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1264,7 +1257,7 @@ int mympd_put_settings(char *buffer) {
|
||||
config.stickers,
|
||||
config.mixramp,
|
||||
config.smartpls,
|
||||
MAX_ELEMENTS_PER_PAGE,
|
||||
config.max_elements_per_page,
|
||||
replaygain,
|
||||
mympd_state.notificationWeb,
|
||||
mympd_state.notificationPage,
|
||||
@ -1285,8 +1278,7 @@ int mympd_put_settings(char *buffer) {
|
||||
|
||||
len += json_printf(&out, "]}}");
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1317,8 +1309,7 @@ int mympd_put_outputs(char *buffer) {
|
||||
|
||||
len += json_printf(&out,"]}}");
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1409,8 +1400,7 @@ int mympd_put_current_song(char *buffer) {
|
||||
len += json_printf(&out, "}}");
|
||||
mpd_song_free(song);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1459,8 +1449,7 @@ int mympd_put_songdetails(char *buffer, char *uri) {
|
||||
}
|
||||
len += json_printf(&out, "}}");
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1476,7 +1465,7 @@ int mympd_put_queue(char *buffer, unsigned int offset, unsigned *queue_version,
|
||||
if (!status)
|
||||
RETURN_ERROR_AND_RECOVER("mpd_run_status");
|
||||
|
||||
if (!mpd_send_list_queue_range_meta(mpd.conn, offset, offset + MAX_ELEMENTS_PER_PAGE))
|
||||
if (!mpd_send_list_queue_range_meta(mpd.conn, offset, offset + config.max_elements_per_page))
|
||||
RETURN_ERROR_AND_RECOVER("mpd_send_list_queue_meta");
|
||||
|
||||
len = json_printf(&out, "{type: queue, data: [");
|
||||
@ -1516,8 +1505,7 @@ int mympd_put_queue(char *buffer, unsigned int offset, unsigned *queue_version,
|
||||
*queue_length = mpd_status_get_queue_length(status);
|
||||
mpd_status_free(status);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1541,7 +1529,7 @@ int mympd_put_browse(char *buffer, char *path, unsigned int offset, char *filter
|
||||
const struct mpd_song *song;
|
||||
const struct mpd_directory *dir;
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
switch (mpd_entity_get_type(entity)) {
|
||||
case MPD_ENTITY_TYPE_UNKNOWN:
|
||||
entity_count --;
|
||||
@ -1637,8 +1625,7 @@ int mympd_put_browse(char *buffer, char *path, unsigned int offset, char *filter
|
||||
filter
|
||||
);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1663,7 +1650,7 @@ int mympd_put_db_tag(char *buffer, unsigned int offset, char *mpdtagtype, char *
|
||||
len = json_printf(&out, "{type: listDBtags, data: [");
|
||||
while ((pair = mpd_recv_pair_tag(mpd.conn, mpd_tag_name_parse(mpdtagtype))) != NULL) {
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
if (strcmp(pair->value, "") == 0) {
|
||||
entity_count --;
|
||||
}
|
||||
@ -1694,8 +1681,7 @@ int mympd_put_db_tag(char *buffer, unsigned int offset, char *mpdtagtype, char *
|
||||
filter
|
||||
);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1724,7 +1710,7 @@ int mympd_put_songs_in_album(char *buffer, char *album, char *search, char *tag)
|
||||
|
||||
while ((song = mpd_recv_song(mpd.conn)) != NULL) {
|
||||
entity_count ++;
|
||||
if (entity_count <= MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count <= config.max_elements_per_page) {
|
||||
if (entities_returned ++)
|
||||
len += json_printf(&out, ", ");
|
||||
else {
|
||||
@ -1753,8 +1739,7 @@ int mympd_put_songs_in_album(char *buffer, char *album, char *search, char *tag)
|
||||
}
|
||||
free(albumartist);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1775,7 +1760,7 @@ int mympd_put_playlists(char *buffer, unsigned int offset, char *filter) {
|
||||
|
||||
while ((pl = mpd_recv_playlist(mpd.conn)) != NULL) {
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
plpath = mpd_playlist_get_path(pl);
|
||||
if (strncmp(filter,"-",1) == 0 || strncasecmp(filter, plpath, 1) == 0 ||
|
||||
(strncmp(filter, "0", 1) == 0 && isalpha(*plpath) == 0 )
|
||||
@ -1806,8 +1791,7 @@ int mympd_put_playlists(char *buffer, unsigned int offset, char *filter) {
|
||||
entities_returned
|
||||
);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1829,7 +1813,7 @@ int mympd_put_playlist_list(char *buffer, char *uri, unsigned int offset, char *
|
||||
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
||||
const struct mpd_song *song;
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
song = mpd_entity_get_song(entity);
|
||||
entityName = mympd_get_tag(song, MPD_TAG_TITLE);
|
||||
if (strncmp(filter, "-", 1) == 0 || strncasecmp(filter, entityName, 1) == 0 ||
|
||||
@ -1865,8 +1849,7 @@ int mympd_put_playlist_list(char *buffer, char *uri, unsigned int offset, char *
|
||||
smartpls
|
||||
);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1894,7 +1877,7 @@ int mympd_search(char *buffer, char *searchstr, char *filter, char *plist, unsig
|
||||
if (strcmp(plist, "") == 0) {
|
||||
while ((song = mpd_recv_song(mpd.conn)) != NULL) {
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
if (entities_returned ++)
|
||||
len += json_printf(&out, ", ");
|
||||
len += json_printf(&out, "{type: song, uri: %Q, album: %Q, artist: %Q, duration: %d, title: %Q, name: %Q}",
|
||||
@ -1923,8 +1906,7 @@ int mympd_search(char *buffer, char *searchstr, char *filter, char *plist, unsig
|
||||
else
|
||||
len = json_printf(&out, "{type: result, data: ok}");
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1952,8 +1934,7 @@ int mympd_queue_crop(char *buffer) {
|
||||
|
||||
mpd_status_free(status);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -1984,7 +1965,7 @@ int mympd_search_queue(char *buffer, char *mpdtagtype, unsigned int offset, char
|
||||
|
||||
while ((song = mpd_recv_song(mpd.conn)) != NULL) {
|
||||
entity_count ++;
|
||||
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
|
||||
if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) {
|
||||
if (entities_returned ++)
|
||||
len += json_printf(&out, ", ");
|
||||
len += json_printf(&out, "{type: song, id: %d, pos: %d, album: %Q, artist: %Q, duration: %d, title: %Q}",
|
||||
@ -2007,8 +1988,7 @@ int mympd_search_queue(char *buffer, char *mpdtagtype, unsigned int offset, char
|
||||
);
|
||||
}
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
@ -2036,8 +2016,7 @@ int mympd_put_stats(char *buffer) {
|
||||
);
|
||||
mpd_stats_free(stats);
|
||||
|
||||
if (len > MAX_SIZE)
|
||||
printf("Buffer truncated\n");
|
||||
CHECK_RETURN_LEN();
|
||||
return len;
|
||||
}
|
||||
|
||||
|
@ -44,8 +44,14 @@
|
||||
mpd.conn_state = MPD_FAILURE; \
|
||||
} while (0)
|
||||
|
||||
#define MAX_SIZE 1024 * 100
|
||||
#define MAX_ELEMENTS_PER_PAGE 100
|
||||
#define CHECK_RETURN_LEN() do { \
|
||||
if (len > MAX_SIZE) \
|
||||
printf("Buffer truncated: %d, %d\n", len, MAX_SIZE); \
|
||||
return len; \
|
||||
} while (0)
|
||||
|
||||
#define MAX_SIZE 2048 * 400
|
||||
#define MAX_ELEMENTS_PER_PAGE 400
|
||||
|
||||
#define GEN_ENUM(X) X,
|
||||
#define GEN_STR(X) #X,
|
||||
@ -161,6 +167,7 @@ typedef struct {
|
||||
const char* taglist;
|
||||
bool smartpls;
|
||||
const char* varlibdir;
|
||||
long max_elements_per_page;
|
||||
} t_config;
|
||||
|
||||
t_config config;
|
||||
|
10
src/mympd.c
10
src/mympd.c
@ -173,7 +173,14 @@ static int inihandler(void* user, const char* section, const char* name, const c
|
||||
else
|
||||
p_config->mixramp = false;
|
||||
else if (MATCH("taglist"))
|
||||
p_config->taglist = strdup(value);
|
||||
p_config->taglist = strdup(value);
|
||||
else if (MATCH("max_elements_per_page")) {
|
||||
p_config->max_elements_per_page = strtol(value, &crap, 10);
|
||||
if (p_config->max_elements_per_page > MAX_ELEMENTS_PER_PAGE) {
|
||||
printf("Setting max_elements_per_page to maximal value %d", MAX_ELEMENTS_PER_PAGE);
|
||||
p_config->max_elements_per_page = MAX_ELEMENTS_PER_PAGE;
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0; /* unknown section/name, error */
|
||||
|
||||
@ -267,6 +274,7 @@ int main(int argc, char **argv) {
|
||||
config.mixramp = true;
|
||||
config.taglist = "Artist,Album,AlbumArtist,Title,Track,Genre,Date,Composer,Performer";
|
||||
config.smartpls = true;
|
||||
config.max_elements_per_page = 100;
|
||||
|
||||
mpd.timeout = 3000;
|
||||
mpd.last_update_sticker_song_id = -1;
|
||||
|
Loading…
Reference in New Issue
Block a user