mirror of
https://github.com/SuperBFG7/ympd
synced 2025-12-03 21:28:05 +00:00
Replaces jquery.cookie.js with version from https://github.com/js-cookie/js-cookie
Added streamport option to commandline Fixed description of options in manpage and help and README Removed mpd host options from settings menu Removed http stream options from settings menu
This commit is contained in:
@@ -1,4 +1,10 @@
|
||||
/* ympd
|
||||
/* myMPD
|
||||
(c) 2018 Juergen Mang <mail@jcgames.de>
|
||||
This project's homepage is: https://github.com/jcorporation/ympd
|
||||
|
||||
myMPD ist fork of:
|
||||
|
||||
ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
@@ -23,6 +29,4 @@
|
||||
#define YMPD_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}
|
||||
#define YMPD_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}
|
||||
#define SRC_PATH "${ASSETS_PATH}"
|
||||
#cmakedefine WITH_MPD_HOST_CHANGE
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* ympd
|
||||
/* myMPD
|
||||
(c) 2018 Juergen Mang <mail@jcgames.de>
|
||||
This project's homepage is: https://github.com/jcorporation/ympd
|
||||
|
||||
myMPD ist fork of:
|
||||
|
||||
ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* ympd
|
||||
/* myMPD
|
||||
(c) 2018 Juergen Mang <mail@jcgames.de>
|
||||
This project's homepage is: https://github.com/jcorporation/ympd
|
||||
|
||||
myMPD ist fork of:
|
||||
|
||||
ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* ympd
|
||||
/* myMPD
|
||||
(c) 2018 Juergen Mang <mail@jcgames.de>
|
||||
This project's homepage is: https://github.com/jcorporation/ympd
|
||||
|
||||
myMPD ist fork of:
|
||||
|
||||
ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
@@ -63,9 +69,9 @@ int callback_mpd(struct mg_connection *c)
|
||||
if(cmd_id == -1)
|
||||
return MG_TRUE;
|
||||
|
||||
if(mpd.conn_state != MPD_CONNECTED && cmd_id != MPD_API_SET_MPDHOST &&
|
||||
cmd_id != MPD_API_GET_MPDHOST && cmd_id != MPD_API_SET_MPDPASS)
|
||||
return MG_TRUE;
|
||||
// if(mpd.conn_state != MPD_CONNECTED && cmd_id != MPD_API_SET_MPDHOST &&
|
||||
// cmd_id != MPD_API_GET_MPDHOST && cmd_id != MPD_API_SET_MPDPASS)
|
||||
// return MG_TRUE;
|
||||
|
||||
switch(cmd_id)
|
||||
{
|
||||
@@ -263,52 +269,11 @@ out_search:
|
||||
out_send_message:
|
||||
free(p_charbuf);
|
||||
break;
|
||||
#ifdef WITH_MPD_HOST_CHANGE
|
||||
/* Commands allowed when disconnected from MPD server */
|
||||
case MPD_API_SET_MPDHOST:
|
||||
int_buf = 0;
|
||||
p_charbuf = strdup(c->content);
|
||||
if(strcmp(strtok(p_charbuf, ","), "MPD_API_SET_MPDHOST"))
|
||||
goto out_host_change;
|
||||
|
||||
if((int_buf = strtol(strtok(NULL, ","), NULL, 10)) <= 0)
|
||||
goto out_host_change;
|
||||
|
||||
if((token = strtok(NULL, ",")) == NULL)
|
||||
goto out_host_change;
|
||||
|
||||
strncpy(mpd.host, token, sizeof(mpd.host));
|
||||
mpd.port = int_buf;
|
||||
mpd.conn_state = MPD_RECONNECT;
|
||||
free(p_charbuf);
|
||||
return MG_TRUE;
|
||||
out_host_change:
|
||||
free(p_charbuf);
|
||||
case MPD_API_GET_OPTIONS:
|
||||
n = snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"mpdoptions\", \"data\": "
|
||||
"{\"mpdhost\" : \"%s\", \"mpdport\": \"%d\", \"passwort_set\": %s, \"streamport\": \"%d\"}"
|
||||
"}", mpd.host, mpd.port, mpd.password ? "true" : "false", streamport);
|
||||
break;
|
||||
case MPD_API_GET_MPDHOST:
|
||||
n = snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"mpdhost\", \"data\": "
|
||||
"{\"host\" : \"%s\", \"port\": \"%d\", \"passwort_set\": %s}"
|
||||
"}", mpd.host, mpd.port, mpd.password ? "true" : "false");
|
||||
break;
|
||||
case MPD_API_SET_MPDPASS:
|
||||
p_charbuf = strdup(c->content);
|
||||
if(strcmp(strtok(p_charbuf, ","), "MPD_API_SET_MPDPASS"))
|
||||
goto out_set_pass;
|
||||
|
||||
if((token = strtok(NULL, ",")) == NULL)
|
||||
goto out_set_pass;
|
||||
|
||||
if(mpd.password)
|
||||
free(mpd.password);
|
||||
|
||||
mpd.password = strdup(token);
|
||||
mpd.conn_state = MPD_RECONNECT;
|
||||
free(p_charbuf);
|
||||
return MG_TRUE;
|
||||
out_set_pass:
|
||||
free(p_charbuf);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
if(mpd.conn_state == MPD_CONNECTED && mpd_connection_get_error(mpd.conn) != MPD_ERROR_SUCCESS)
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* ympd
|
||||
/* myMPD
|
||||
(c) 2018 Juergen Mang <mail@jcgames.de>
|
||||
This project's homepage is: https://github.com/jcorporation/ympd
|
||||
|
||||
myMPD ist fork of:
|
||||
|
||||
ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
@@ -39,7 +45,6 @@
|
||||
#define MPD_CMDS(X) \
|
||||
X(MPD_API_GET_QUEUE) \
|
||||
X(MPD_API_GET_BROWSE) \
|
||||
X(MPD_API_GET_MPDHOST) \
|
||||
X(MPD_API_ADD_TRACK) \
|
||||
X(MPD_API_ADD_PLAY_TRACK) \
|
||||
X(MPD_API_ADD_PLAYLIST) \
|
||||
@@ -58,8 +63,6 @@
|
||||
X(MPD_API_SET_SEEK) \
|
||||
X(MPD_API_SET_NEXT) \
|
||||
X(MPD_API_SET_PREV) \
|
||||
X(MPD_API_SET_MPDHOST) \
|
||||
X(MPD_API_SET_MPDPASS) \
|
||||
X(MPD_API_UPDATE_DB) \
|
||||
X(MPD_API_GET_OUTPUTS) \
|
||||
X(MPD_API_TOGGLE_OUTPUT) \
|
||||
@@ -67,7 +70,8 @@
|
||||
X(MPD_API_TOGGLE_CONSUME) \
|
||||
X(MPD_API_TOGGLE_SINGLE) \
|
||||
X(MPD_API_TOGGLE_CROSSFADE) \
|
||||
X(MPD_API_TOGGLE_REPEAT)
|
||||
X(MPD_API_TOGGLE_REPEAT) \
|
||||
X(MPD_API_GET_OPTIONS)
|
||||
|
||||
enum mpd_cmd_ids {
|
||||
MPD_CMDS(GEN_ENUM)
|
||||
@@ -99,6 +103,8 @@ struct t_mpd {
|
||||
unsigned queue_version;
|
||||
} mpd;
|
||||
|
||||
int streamport;
|
||||
|
||||
struct t_mpd_client_session {
|
||||
int song_id;
|
||||
unsigned queue_version;
|
||||
|
||||
191
src/ympd.c
191
src/ympd.c
@@ -1,191 +0,0 @@
|
||||
/* ympd
|
||||
(c) 2013-2014 Andrew Karpow <andy@ndyk.de>
|
||||
This project's homepage is: http://www.ympd.org
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <sys/time.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "mongoose.h"
|
||||
#include "http_server.h"
|
||||
#include "mpd_client.h"
|
||||
#include "config.h"
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
int force_exit = 0;
|
||||
|
||||
void bye()
|
||||
{
|
||||
force_exit = 1;
|
||||
}
|
||||
|
||||
static int server_callback(struct mg_connection *c, enum mg_event ev) {
|
||||
int result = MG_FALSE;
|
||||
FILE *fp = NULL;
|
||||
|
||||
switch(ev) {
|
||||
case MG_CLOSE:
|
||||
mpd_close_handler(c);
|
||||
return MG_TRUE;
|
||||
case MG_REQUEST:
|
||||
if (c->is_websocket) {
|
||||
c->content[c->content_len] = '\0';
|
||||
if(c->content_len)
|
||||
return callback_mpd(c);
|
||||
else
|
||||
return MG_TRUE;
|
||||
} else
|
||||
return MG_FALSE;
|
||||
case MG_AUTH:
|
||||
// no auth for websockets since mobile safari does not support it
|
||||
if ( (mpd.gpass == NULL) || (c->is_websocket) || ((mpd.local_port > 0) && (c->local_port == mpd.local_port)) )
|
||||
return MG_TRUE;
|
||||
else {
|
||||
if ( (fp = fopen(mpd.gpass, "r")) != NULL ) {
|
||||
result = mg_authorize_digest(c, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
default:
|
||||
return MG_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int n, option_index = 0;
|
||||
struct mg_server *server = mg_create_server(NULL, server_callback);
|
||||
unsigned int current_timer = 0, last_timer = 0;
|
||||
char *run_as_user = NULL;
|
||||
char const *error_msg = NULL;
|
||||
char *webport = "8080";
|
||||
|
||||
atexit(bye);
|
||||
mg_set_option(server, "document_root", SRC_PATH);
|
||||
|
||||
mg_set_option(server, "auth_domain", "mympd");
|
||||
mpd.port = 6600;
|
||||
mpd.local_port = 0;
|
||||
mpd.gpass = NULL;
|
||||
strcpy(mpd.host, "127.0.0.1");
|
||||
|
||||
static struct option long_options[] = {
|
||||
{"digest", required_argument, 0, 'D'},
|
||||
{"host", required_argument, 0, 'h'},
|
||||
{"port", required_argument, 0, 'p'},
|
||||
{"localport", required_argument, 0, 'l'},
|
||||
{"webport", required_argument, 0, 'w'},
|
||||
{"user", required_argument, 0, 'u'},
|
||||
{"version", no_argument, 0, 'v'},
|
||||
{"help", no_argument, 0, 0 },
|
||||
{"mpdpass", required_argument, 0, 'm'},
|
||||
{0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
while((n = getopt_long(argc, argv, "D:h:p:l:w:u:d:v:m",
|
||||
long_options, &option_index)) != -1) {
|
||||
switch (n) {
|
||||
case 'D':
|
||||
mpd.gpass = strdup(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
strncpy(mpd.host, optarg, sizeof(mpd.host));
|
||||
break;
|
||||
case 'p':
|
||||
mpd.port = atoi(optarg);
|
||||
break;
|
||||
case 'l':
|
||||
mpd.local_port = atoi(optarg);
|
||||
break;
|
||||
case 'w':
|
||||
webport = strdup(optarg);
|
||||
break;
|
||||
case 'u':
|
||||
run_as_user = strdup(optarg);
|
||||
break;
|
||||
case 'm':
|
||||
if (strlen(optarg) > 0)
|
||||
mpd.password = strdup(optarg);
|
||||
break;
|
||||
case 'v':
|
||||
fprintf(stdout, "ympd %d.%d.%d\n"
|
||||
"Copyright (C) 2014 Andrew Karpow <andy@ndyk.de>\n"
|
||||
"built " __DATE__ " "__TIME__ " ("__VERSION__")\n",
|
||||
YMPD_VERSION_MAJOR, YMPD_VERSION_MINOR, YMPD_VERSION_PATCH);
|
||||
return EXIT_SUCCESS;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Usage: %s [OPTION]...\n\n"
|
||||
" -D, --digest <htdigest>\tpath to htdigest file for authorization\n"
|
||||
" \t(realm ympd) [no authorization]\n"
|
||||
" -h, --host <host>\t\tconnect to mpd at host [localhost]\n"
|
||||
" -p, --port <port>\t\tconnect to mpd at port [6600]\n"
|
||||
" -l, --localport <port>\t\tskip authorization for local port\n"
|
||||
" -w, --webport [ip:]<port>\tlisten interface/port for webserver [8080]\n"
|
||||
" -u, --user <username>\t\tdrop priviliges to user after socket bind\n"
|
||||
" -v, --version\t\t\tget version\n"
|
||||
" -m, --mpdpass <password>\tspecifies the password to use when connecting to mpd\n"
|
||||
" --help\t\t\t\tthis help\n"
|
||||
, argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if(error_msg)
|
||||
{
|
||||
fprintf(stderr, "Mongoose error: %s\n", error_msg);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
error_msg = mg_set_option(server, "listening_port", webport);
|
||||
if(error_msg) {
|
||||
fprintf(stderr, "Mongoose error: %s\n", error_msg);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* drop privilges at last to ensure proper port binding */
|
||||
if(run_as_user != NULL) {
|
||||
error_msg = mg_set_option(server, "run_as_user", run_as_user);
|
||||
free(run_as_user);
|
||||
if(error_msg)
|
||||
{
|
||||
fprintf(stderr, "Mongoose error: %s\n", error_msg);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
while (!force_exit) {
|
||||
mg_poll_server(server, 200);
|
||||
current_timer = time(NULL);
|
||||
if(current_timer - last_timer)
|
||||
{
|
||||
last_timer = current_timer;
|
||||
mpd_poll(server);
|
||||
}
|
||||
}
|
||||
|
||||
mpd_disconnect();
|
||||
mg_destroy_server(&server);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Reference in New Issue
Block a user