diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5e04246..094c895 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,7 @@ set(CPACK_DEBIAN_PACKAGE_MAINTAINER "andy@ndyk.de")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.0.0,libmpdclient2")
option(WITH_STATIC_WEBSOCKETS "Build with static libwebsockets library" ON)
+option(WITH_MPD_HOST_CHANGE "Let users of the web frontend change the MPD Host" ON)
find_package(LibMPDClient REQUIRED)
find_package(LibWebSockets REQUIRED)
diff --git a/htdocs/index.html b/htdocs/index.html
index 8f40d8f..04e2bd4 100644
--- a/htdocs/index.html
+++ b/htdocs/index.html
@@ -40,6 +40,7 @@
Playlist
Browse database
About
+ Settings
@@ -185,6 +186,37 @@
+
+
+
+
diff --git a/htdocs/js/mpd.js b/htdocs/js/mpd.js
index bc16615..60114da 100644
--- a/htdocs/js/mpd.js
+++ b/htdocs/js/mpd.js
@@ -311,6 +311,10 @@ function webSocketConnect() {
type: "info",
}).show();
+ break;
+ case "mpdhost":
+ $('#mpdhost').val(obj.data.host);
+ $('#mpdport').val(obj.data.port);
break;
case "error":
$('.top-right').notify({
@@ -452,6 +456,23 @@ function getVersion()
});
}
+function getHost() {
+ socket.send('MPD_API_GET_MPDHOST');
+
+ function onEnter(event) {
+ if ( event.which == 13 )
+ setHost();
+ $('#settings').modal('hide');
+ }
+
+ $('#mpdhost').keypress(onEnter);
+ $('#mpdport').keypress(onEnter);
+}
+
+function setHost() {
+ socket.send('MPD_API_SET_MPDHOST,'+$('#mpdport').val()+','+$('#mpdhost').val());
+}
+
function notificationsSupported() {
return "webkitNotifications" in window;
}
diff --git a/src/config.h.in b/src/config.h.in
index d4f6010..33681c9 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -34,6 +34,6 @@
#define YMPD_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}
#define DATADIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}"
#define LOCAL_RESOURCE_PATH DATADIR"/htdocs"
-
+#cmakedefine WITH_MPD_HOST_CHANGE
#endif
diff --git a/src/mpd_client.c b/src/mpd_client.c
index c613dc0..3c34ac5 100644
--- a/src/mpd_client.c
+++ b/src/mpd_client.c
@@ -40,6 +40,7 @@
#include
#include "mpd_client.h"
+#include "config.h"
struct mpd_connection *conn = NULL;
enum mpd_conn_states mpd_conn_state = MPD_DISCONNECTED;
@@ -94,6 +95,12 @@ int callback_ympd(struct libwebsocket_context *context,
pss->do_send &= ~DO_SEND_BROWSE;
free(pss->browse_path);
}
+ else if(pss->do_send & DO_SEND_MPDHOST) {
+ n = snprintf(p, MAX_SIZE, "{\"type\":\"mpdhost\", \"data\": "
+ "{\"host\" : \"%s\", \"port\": \"%d\"}"
+ "}", mpd_host, mpd_port);
+ pss->do_send &= ~DO_SEND_MPDHOST;
+ }
else {
/* Default Action */
int current_song_id;
@@ -209,11 +216,25 @@ int callback_ympd(struct libwebsocket_context *context,
free(uri);
}
}
-
+#ifdef WITH_MPD_HOST_CHANGE
+ else if(!strncmp((const char *)in, MPD_API_SET_MPDHOST, sizeof(MPD_API_SET_MPDHOST)-1)) {
+ char *host;
+ int port = 0;
+ if(sscanf(in, "MPD_API_SET_MPDHOST,%d,%m[^\t\n ]", &port, &host) && host != NULL && port > 0) {
+ strncpy(mpd_host, host, sizeof(mpd_host));
+ free(host);
+ mpd_port = port;
+ mpd_conn_state = MPD_RECONNECT;
+ break;
+ }
+ }
+ else if(!strncmp((const char *)in, MPD_API_GET_MPDHOST, sizeof(MPD_API_GET_MPDHOST)-1)) {
+ pss->do_send |= DO_SEND_MPDHOST;
+ }
+#endif
- if(mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS)
+ if(mpd_conn_state == MPD_CONNECTED && mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS)
pss->do_send |= DO_SEND_ERROR;
-
break;
default:
@@ -249,6 +270,7 @@ void mpd_loop()
case MPD_FAILURE:
lwsl_err("MPD connection failed.\n");
+ case MPD_RECONNECT:
if(conn != NULL)
mpd_connection_free(conn);
conn = NULL;
diff --git a/src/mpd_client.h b/src/mpd_client.h
index 6bece9a..5ca70d6 100644
--- a/src/mpd_client.h
+++ b/src/mpd_client.h
@@ -38,12 +38,13 @@
#define DO_SEND_TRACK_INFO (1 << 2)
#define DO_SEND_BROWSE (1 << 3)
#define DO_SEND_ERROR (1 << 4)
-
+#define DO_SEND_MPDHOST (1 << 5)
#define MPD_API_GET_SEEK "MPD_API_GET_SEEK"
#define MPD_API_GET_PLAYLIST "MPD_API_GET_PLAYLIST"
#define MPD_API_GET_TRACK_INFO "MPD_API_GET_TRACK_INFO"
#define MPD_API_GET_BROWSE "MPD_API_GET_BROWSE"
+#define MPD_API_GET_MPDHOST "MPD_API_GET_MPDHOST"
#define MPD_API_ADD_TRACK "MPD_API_ADD_TRACK"
#define MPD_API_ADD_PLAY_TRACK "MPD_API_ADD_PLAY_TRACK"
#define MPD_API_PLAY_TRACK "MPD_API_PLAY_TRACK"
@@ -56,6 +57,7 @@
#define MPD_API_SET_SEEK "MPD_API_SET_SEEK"
#define MPD_API_SET_NEXT "MPD_API_SET_PREV"
#define MPD_API_SET_PREV "MPD_API_SET_NEXT"
+#define MPD_API_SET_MPDHOST "MPD_API_SET_MPDHOST"
#define MPD_API_UPDATE_DB "MPD_API_UPDATE_DB"
#define MPD_API_TOGGLE_RANDOM "MPD_API_TOGGLE_RANDOM"
#define MPD_API_TOGGLE_CONSUME "MPD_API_TOGGLE_CONSUME"
@@ -72,7 +74,8 @@ struct per_session_data__ympd {
enum mpd_conn_states {
MPD_FAILURE,
MPD_DISCONNECTED,
- MPD_CONNECTED
+ MPD_CONNECTED,
+ MPD_RECONNECT
};
void *mpd_idle_connection(void *_data);
@@ -87,7 +90,7 @@ int mpd_put_playlist(char *buffer);
int mpd_put_browse(char *buffer, char *path);
int mpd_port;
-const char *mpd_host;
+char mpd_host[255];
#endif
diff --git a/src/ympd.c b/src/ympd.c
index 2633f1e..92a28d8 100644
--- a/src/ympd.c
+++ b/src/ympd.c
@@ -81,7 +81,7 @@ int main(int argc, char **argv)
atexit(bye);
memset(&info, 0, sizeof info);
info.port = 8080;
- mpd_host = "127.0.0.1";
+ strcpy(mpd_host, "127.0.0.1");
mpd_port = 6600;
lws_set_log_level(LLL_ERR | LLL_WARN, NULL);
@@ -105,7 +105,7 @@ int main(int argc, char **argv)
long_options, &option_index)) != -1) {
switch (n) {
case 'h':
- mpd_host = optarg;
+ strncpy(mpd_host, optarg, sizeof(mpd_host));
break;
case 'p':
mpd_port = atoi(optarg);