Fix: keep last_song_id to prevent multiple playcounts

This commit is contained in:
jcorporation 2018-08-23 16:24:37 +01:00
parent 409b77cfb7
commit eeb7a16abc
2 changed files with 17 additions and 12 deletions

View File

@ -110,7 +110,7 @@ void callback_mympd(struct mg_connection *nc, const struct mg_str msg) {
} }
break; break;
case MPD_API_GET_STATE: case MPD_API_GET_STATE:
n = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.queue_version, &mpd.queue_length); n = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.last_song_id, &mpd.queue_version, &mpd.queue_length);
break; break;
case MPD_API_SET_SETTINGS: case MPD_API_SET_SETTINGS:
je = json_scanf(msg.p, msg.len, "{data: {notificationWeb: %d, notificationPage: %d}}", &state.a, &state.b); je = json_scanf(msg.p, msg.len, "{data: {notificationWeb: %d, notificationPage: %d}}", &state.a, &state.b);
@ -539,7 +539,7 @@ void mympd_notify(struct mg_mgr *s) {
#endif #endif
} }
void mympd_parse_idle(struct mg_mgr *s, enum mpd_idle idle_bitmask) { void mympd_parse_idle(struct mg_mgr *s, int idle_bitmask) {
int len = 0; int len = 0;
for (unsigned j = 0;; j ++) { for (unsigned j = 0;; j ++) {
enum mpd_idle idle_event = 1 << j; enum mpd_idle idle_event = 1 << j;
@ -561,14 +561,14 @@ void mympd_parse_idle(struct mg_mgr *s, enum mpd_idle idle_bitmask) {
len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_queue\"}"); len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_queue\"}");
break; break;
case MPD_IDLE_PLAYER: case MPD_IDLE_PLAYER:
len = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.queue_version, &mpd.queue_length); len = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.last_song_id, &mpd.queue_version, &mpd.queue_length);
if (config.stickers) { if (config.stickers && mpd.song_id != mpd.last_song_id) {
mympd_count_song_id(mpd.song_id, "playCount", 1); mympd_count_song_id(mpd.song_id, "playCount", 1);
mympd_last_played_song_id(mpd.song_id); mympd_last_played_song_id(mpd.song_id);
} }
break; break;
case MPD_IDLE_MIXER: case MPD_IDLE_MIXER:
len = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.queue_version, &mpd.queue_length); len = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.last_song_id, &mpd.queue_version, &mpd.queue_length);
break; break;
case MPD_IDLE_OUTPUT: case MPD_IDLE_OUTPUT:
len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_outputs\"}"); len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_outputs\"}");
@ -792,7 +792,7 @@ char* mympd_get_tag(struct mpd_song const *song, enum mpd_tag_type tag) {
return str; return str;
} }
int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsigned *queue_version, unsigned *queue_length) { int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, int *last_song_id, unsigned *queue_version, unsigned *queue_length) {
struct mpd_status *status; struct mpd_status *status;
const struct mpd_audio_format *audioformat; const struct mpd_audio_format *audioformat;
int len; int len;
@ -805,19 +805,22 @@ int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsig
return 0; return 0;
} }
audioformat = mpd_status_get_audio_format(status); audioformat = mpd_status_get_audio_format(status);
int song_id = mpd_status_get_song_id(status);
if (*current_song_id != song_id)
*last_song_id = *current_song_id;
len = json_printf(&out, "{type: update_state, data: {" len = json_printf(&out, "{type: update_state, data: {"
"state: %d, volume: %d, songPos: %d, elapsedTime: %d, " "state: %d, volume: %d, songPos: %d, elapsedTime: %d, "
"totalTime: %d, currentSongId: %d, kbitrate: %d, " "totalTime: %d, currentSongId: %d, kbitrate: %d, "
"audioFormat: { sampleRate: %d, bits: %d, channels: %d}, " "audioFormat: { sampleRate: %d, bits: %d, channels: %d}, "
"queueLength: %d, nextSongPos: %d, nextSongId: %d, " "queueLength: %d, nextSongPos: %d, nextSongId: %d, lastSongId: %d, "
"queueVersion: %d", "queueVersion: %d",
mpd_status_get_state(status), mpd_status_get_state(status),
mpd_status_get_volume(status), mpd_status_get_volume(status),
mpd_status_get_song_pos(status), mpd_status_get_song_pos(status),
mpd_status_get_elapsed_time(status), mpd_status_get_elapsed_time(status),
mpd_status_get_total_time(status), mpd_status_get_total_time(status),
mpd_status_get_song_id(status), song_id,
mpd_status_get_kbit_rate(status), mpd_status_get_kbit_rate(status),
audioformat ? audioformat->sample_rate : 0, audioformat ? audioformat->sample_rate : 0,
audioformat ? audioformat->bits : 0, audioformat ? audioformat->bits : 0,
@ -825,12 +828,13 @@ int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsig
mpd_status_get_queue_length(status), mpd_status_get_queue_length(status),
mpd_status_get_next_song_pos(status), mpd_status_get_next_song_pos(status),
mpd_status_get_next_song_id(status), mpd_status_get_next_song_id(status),
*last_song_id ? *last_song_id : -1,
mpd_status_get_queue_version(status) mpd_status_get_queue_version(status)
); );
len += json_printf(&out, "}}"); len += json_printf(&out, "}}");
*current_song_id = mpd_status_get_song_id(status); *current_song_id = song_id;
*next_song_id = mpd_status_get_next_song_id(status); *next_song_id = mpd_status_get_next_song_id(status);
*queue_version = mpd_status_get_queue_version(status); *queue_version = mpd_status_get_queue_version(status);
*queue_length = mpd_status_get_queue_length(status); *queue_length = mpd_status_get_queue_length(status);

View File

@ -123,6 +123,7 @@ struct t_mpd {
int song_id; int song_id;
int next_song_id; int next_song_id;
int last_song_id;
unsigned queue_version; unsigned queue_version;
unsigned queue_length; unsigned queue_length;
int timeout; int timeout;
@ -159,7 +160,7 @@ static int is_websocket(const struct mg_connection *nc) {
} }
void mympd_idle(struct mg_mgr *sm, int timeout); void mympd_idle(struct mg_mgr *sm, int timeout);
void mympd_parse_idle(struct mg_mgr *s, enum mpd_idle idle_bitmask); void mympd_parse_idle(struct mg_mgr *s, int idle_bitmask);
void callback_mympd(struct mg_connection *nc, const struct mg_str msg); void callback_mympd(struct mg_connection *nc, const struct mg_str msg);
void mympd_notify(struct mg_mgr *s); void mympd_notify(struct mg_mgr *s);
void mympd_count_song_id(int song_id, char *name, int value); void mympd_count_song_id(int song_id, char *name, int value);
@ -168,7 +169,7 @@ void mympd_like_song_uri(const char *uri, int value);
void mympd_last_played_song_uri(const char *uri); void mympd_last_played_song_uri(const char *uri);
void mympd_last_played_song_id(int song_id); void mympd_last_played_song_id(int song_id);
void mympd_get_sticker(const char *uri, t_sticker *sticker); void mympd_get_sticker(const char *uri, t_sticker *sticker);
int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsigned *queue_version, unsigned *queue_length); int mympd_put_state(char *buffer, int *current_song_id, int *next_song_id, int *last_song_id, unsigned *queue_version, unsigned *queue_length);
int mympd_put_outputs(char *buffer); int mympd_put_outputs(char *buffer);
int mympd_put_current_song(char *buffer); int mympd_put_current_song(char *buffer);
int mympd_put_queue(char *buffer, unsigned int offset); int mympd_put_queue(char *buffer, unsigned int offset);