diff --git a/htdocs/js/mympd.js b/htdocs/js/mympd.js
index 90a56de..26e583f 100644
--- a/htdocs/js/mympd.js
+++ b/htdocs/js/mympd.js
@@ -1535,16 +1535,14 @@ function parseSongDetails(obj) {
modal.getElementsByTagName('h1')[0].innerText = obj.data.title;
var songDetails = '';
- for (var key in settings.tags) {
- if (settings.tags[key] == true) {
- var value = obj.data[key.toLowerCase()];
- if (key == 'duration') {
- var minutes = Math.floor(value / 60);
- var seconds = value - minutes * 60;
- value = minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
- }
- songDetails += '
' + key + ' | ' + value + ' |
';
+ for (var i = 0; i < settings.tags.length; i++) {
+ var value = obj.data[settings.tags[i].toLowerCase()];
+ if (settings.tags[i] == 'duration') {
+ var minutes = Math.floor(value / 60);
+ var seconds = value - minutes * 60;
+ value = minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
}
+ songDetails += '' + settings.tags[i] + ' | ' + value + ' |
';
}
songDetails += 'Uri | ' + obj.data.uri + ' |
';
@@ -1676,9 +1674,9 @@ function parseSmartPlaylist(obj) {
document.getElementById('saveSmartPlaylistSticker').classList.add('hide');
document.getElementById('saveSmartPlaylistNewest').classList.add('hide');
var tagList = '';
- for (var key in settings.tags) {
- if (settings.tags[key] == true && key != 'Track') {
- tagList += '';
+ for (var i = 0; i < settings.tags.length; i++) {
+ if (settings.tags[i] != 'Track') {
+ tagList += '';
}
}
document.getElementById('selectSaveSmartPlaylistTag').innerHTML = tagList;
@@ -2398,9 +2396,9 @@ function addTagList(x, any) {
var tagList = '';
if (any == true)
tagList += '';
- for (var key in settings.tags) {
- if (settings.tags[key] == true && key != 'Track') {
- tagList += '';
+ for (var i = 0; i < settings.tags.length; i++) {
+ if (settings.tags[i] != 'Track') {
+ tagList += '';
}
}
var tagListEl = document.getElementById(x);
diff --git a/src/list.c b/src/list.c
index a9ecd44..9652ab5 100644
--- a/src/list.c
+++ b/src/list.c
@@ -10,8 +10,20 @@ int list_init(struct list *l) {
return 0;
}
+int list_get_value(const struct list *l, char *data) {
+ int value = 0;
+ struct node *current = l->list;
+ while (current != NULL) {
+ if (strcmp(current->data, data) == 0) {
+ value = current->value;
+ break;
+ }
+ current = current->next;
+ }
+ return value;
+}
-struct node *list_node_at(const struct list * l, unsigned index) {
+struct node *list_node_at(const struct list *l, unsigned index) {
/* if there's no data in the list, fail */
if (l->list == NULL) { return NULL; }
struct node * current = l->list;
diff --git a/src/list.h b/src/list.h
index 07b09ce..1e11da9 100644
--- a/src/list.h
+++ b/src/list.h
@@ -15,7 +15,7 @@ int list_init(struct list *l);
int list_push(struct list *l, char *data, int value);
int list_replace(struct list *l, int pos, char *data, int value);
int list_free(struct list *l);
-
+int list_get_value(const struct list *l, char *data);
int list_shuffle(struct list *l);
int list_swap_item(struct node *n1, struct node *n2);
struct node *list_node_at(const struct list * l, unsigned index);
diff --git a/src/mpd_client.c b/src/mpd_client.c
index 798a07c..378ee1c 100644
--- a/src/mpd_client.c
+++ b/src/mpd_client.c
@@ -33,7 +33,6 @@
#include
#include "mpd_client.h"
-#include "list.h"
#include "config.h"
#include "../dist/src/frozen/frozen.h"
@@ -681,15 +680,6 @@ void mympd_mpd_features() {
// Defaults
mpd.feat_sticker = false;
- mpd.tag_artist = false;
- mpd.tag_album = false;
- mpd.tag_album_artist = false;
- mpd.tag_title = false;
- mpd.tag_track = false;
- mpd.tag_genre = false;
- mpd.tag_date = false;
- mpd.tag_composer = false;
- mpd.tag_performer = false;
mpd_send_allowed_commands(mpd.conn);
while ((pair = mpd_recv_command_pair(mpd.conn)) != NULL) {
@@ -709,69 +699,22 @@ void mympd_mpd_features() {
}
printf("MPD supported tags: ");
+ list_free(&mpd_tags);
mpd_send_list_tag_types(mpd.conn);
while ((pair = mpd_recv_tag_type_pair(mpd.conn)) != NULL) {
printf("%s ", pair->value);
- if (strcmp(pair->value, "Artist") == 0)
- mpd.tag_artist = true;
- else if (strcmp(pair->value, "Album") == 0)
- mpd.tag_album = true;
- else if (strcmp(pair->value, "AlbumArtist") == 0)
- mpd.tag_album_artist = true;
- else if (strcmp(pair->value, "Title") == 0)
- mpd.tag_title = true;
- else if (strcmp(pair->value, "Track") == 0)
- mpd.tag_track = true;
- else if (strcmp(pair->value, "Genre") == 0)
- mpd.tag_genre = true;
- else if (strcmp(pair->value, "Date") == 0)
- mpd.tag_date = true;
- else if (strcmp(pair->value, "Composer") == 0)
- mpd.tag_composer = true;
- else if (strcmp(pair->value, "Performer") == 0)
- mpd.tag_performer = true;
+ list_push(&mpd_tags, pair->value, 1);
mpd_return_pair(mpd.conn, pair);
}
mpd_response_finish(mpd.conn);
printf("\nmyMPD enabled tags: ");
+ list_free(&mympd_tags);
token = strtok(str, s);
while (token != NULL) {
- if (strcmp(token, "Artist") == 0) {
- if (mpd.tag_artist == true) printf("%s ", token);
- else mpd.tag_artist = false;
- }
- else if (strcmp(token, "Album") == 0) {
- if (mpd.tag_album == true) printf("%s ", token);
- else mpd.tag_album = false;
- }
- else if (strcmp(token, "AlbumArtist") == 0) {
- if (mpd.tag_album_artist == true) printf("%s ", token);
- else mpd.tag_album_artist = false;
- }
- else if (strcmp(token, "Title") == 0) {
- if (mpd.tag_title == true) printf("%s ", token);
- else mpd.tag_title = false;
- }
- else if (strcmp(token, "Track") == 0) {
- if (mpd.tag_track == true) printf("%s ", token);
- else mpd.tag_track = false;
- }
- else if (strcmp(token, "Genre") == 0) {
- if (mpd.tag_genre == true) printf("%s ", token);
- else mpd.tag_genre = false;
- }
- else if (strcmp(token, "Date") == 0) {
- if (mpd.tag_date == true) printf("%s ", token);
- else mpd.tag_date = false;
- }
- else if (strcmp(token, "Composer") == 0) {
- if (mpd.tag_composer == true) printf("%s ", token);
- else mpd.tag_composer = false;
- }
- else if (strcmp(token, "Performer") == 0) {
- if (mpd.tag_performer == true) printf("%s ", token);
- else mpd.tag_performer = false;
+ if (list_get_value(&mpd_tags, token) == 1) {
+ list_push(&mympd_tags, token, 1);
+ printf("%s ", token);
}
token = strtok(NULL, s);
}
@@ -1257,6 +1200,7 @@ int mympd_put_settings(char *buffer) {
struct mpd_status *status;
char *replaygain = strdup("");
int len;
+ int nr = 0;
struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE);
status = mpd_run_status(mpd.conn);
@@ -1279,9 +1223,7 @@ int mympd_put_settings(char *buffer) {
"mixrampdb: %f, mixrampdelay: %f, mpdhost: %Q, mpdport: %d, passwort_set: %B, "
"streamport: %d, coverimage: %Q, stickers: %B, mixramp: %B, smartpls: %B, maxElementsPerPage: %d, "
"replaygain: %Q, notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d, "
- "tags: { Artist: %B, Album: %B, AlbumArtist: %B, Title: %B, Track: %B, Genre: %B, Date: %B,"
- "Composer: %B, Performer: %B }"
- "}}",
+ "tags: [",
mpd_status_get_repeat(status),
mpd_status_get_single(status),
mpd_status_get_crossfade(status),
@@ -1303,19 +1245,20 @@ int mympd_put_settings(char *buffer) {
mympd_state.notificationPage,
mympd_state.jukeboxMode,
mympd_state.jukeboxPlaylist,
- mympd_state.jukeboxQueueLength,
- mpd.tag_artist,
- mpd.tag_album,
- mpd.tag_album_artist,
- mpd.tag_title,
- mpd.tag_track,
- mpd.tag_genre,
- mpd.tag_date,
- mpd.tag_composer,
- mpd.tag_performer
+ mympd_state.jukeboxQueueLength
);
mpd_status_free(status);
free(replaygain);
+
+ struct node *current = mympd_tags.list;
+ while (current != NULL) {
+ if (nr ++)
+ len += json_printf(&out, ",");
+ len += json_printf(&out, "%Q", current->data);
+ current = current->next;
+ }
+
+ len += json_printf(&out, "]}}");
if (len > MAX_SIZE)
printf("Buffer truncated\n");
diff --git a/src/mpd_client.h b/src/mpd_client.h
index a34a2b5..472dbbe 100644
--- a/src/mpd_client.h
+++ b/src/mpd_client.h
@@ -26,6 +26,7 @@
#define __MPD_CLIENT_H__
#include "../dist/src/mongoose/mongoose.h"
+#include "list.h"
#define RETURN_ERROR_AND_RECOVER(X) do { \
printf("MPD X: %s\n", mpd_connection_get_error_message(mpd.conn)); \
@@ -137,17 +138,11 @@ struct t_mpd {
const unsigned* protocol;
// Supported tags
bool feat_sticker;
- bool tag_artist;
- bool tag_album;
- bool tag_album_artist;
- bool tag_title;
- bool tag_track;
- bool tag_genre;
- bool tag_date;
- bool tag_composer;
- bool tag_performer;
} mpd;
+struct list mpd_tags;
+struct list mympd_tags;
+
typedef struct {
long mpdport;
const char* mpdhost;
diff --git a/src/mympd.c b/src/mympd.c
index 1c67c1c..94b9769 100644
--- a/src/mympd.c
+++ b/src/mympd.c
@@ -371,6 +371,9 @@ int main(int argc, char **argv) {
return EXIT_FAILURE;
read_statefiles();
+
+ list_init(&mpd_tags);
+ list_init(&mympd_tags);
if (config.ssl == true)
mg_set_protocol_http_websocket(nc_http);
@@ -388,6 +391,8 @@ int main(int argc, char **argv) {
mympd_idle(&mgr, 0);
}
mg_mgr_free(&mgr);
+ list_free(&mpd_tags);
+ list_free(&mympd_tags);
mympd_disconnect();
return EXIT_SUCCESS;
}