1
0
mirror of https://github.com/SuperBFG7/ympd synced 2025-07-03 18:43:01 +00:00

Feat: add AutoPlay setting

Feat: configurable backgroundcolor
This commit is contained in:
jcorporation 2019-01-19 00:20:05 +00:00
parent 377be765c3
commit 535595c7f8
11 changed files with 61 additions and 9 deletions

View File

@ -64,6 +64,7 @@ post_upgrade() {
[ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode [ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode
[ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist [ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist
[ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength [ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength
[ -f /var/lib/mympd/state/autoPlay ] || echo -n "false" > /var/lib/mympd/state/autoPlay
[ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage [ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage
[ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb [ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb
[ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase [ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase

View File

@ -79,6 +79,7 @@ done
[ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode [ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode
[ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist [ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist
[ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength [ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength
[ -f /var/lib/mympd/state/autoPlay ] || echo -n "false" > /var/lib/mympd/state/autoPlay
[ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage [ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage
[ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb [ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb
[ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase [ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase

View File

@ -72,3 +72,7 @@ max_elements_per_page = 100
#Number of songs to keep in last played list #Number of songs to keep in last played list
last_played_count = 20 last_played_count = 20
[theme]
backgroundcolor: #888

1
debian/postinst vendored
View File

@ -59,6 +59,7 @@ fi
[ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode [ -f /var/lib/mympd/state/jukeboxMode ] || echo -n "0" > /var/lib/mympd/state/jukeboxMode
[ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist [ -f /var/lib/mympd/state/jukeboxPlaylist ] || echo -n "Database" > /var/lib/mympd/state/jukeboxPlaylist
[ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength [ -f /var/lib/mympd/state/jukeboxQueueLength ] || echo -n "1" > /var/lib/mympd/state/jukeboxQueueLength
[ -f /var/lib/mympd/state/autoPlay ] || echo -n "false" > /var/lib/mympd/state/autoPlay
[ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage [ -f /var/lib/mympd/state/notificationPage ] || echo -n "true" > /var/lib/mympd/state/notificationPage
[ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb [ -f /var/lib/mympd/state/notificationWeb ] || echo -n "false" > /var/lib/mympd/state/notificationWeb
[ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase [ -f /var/lib/mympd/state/colsBrowseDatabase ] || echo -n '["Track","Title","Duration"]' > /var/lib/mympd/state/colsBrowseDatabase

View File

@ -1,5 +1,6 @@
:root { :root {
--mympd-coverimagesize: 240px; --mympd-coverimagesize: 240px;
--mympd-bacgkroundcolor: #888;
} }
html { html {
@ -11,6 +12,7 @@ body {
padding-top: 4rem; padding-top: 4rem;
padding-bottom: 4rem; padding-bottom: 4rem;
background-color: #888; background-color: #888;
background-color: var(--mympd-backgroundcolor);
} }
main { main {

View File

@ -903,6 +903,13 @@
<div class="invalid-feedback">Must be a number.</div> <div class="invalid-feedback">Must be a number.</div>
</div> </div>
</div> </div>
<div class="row">
<div class="form-group col-md-6" data-toggle="buttons">
<button data-href='{"cmd": "toggleBtn", "options": ["btnAutoPlay"]}' id="btnAutoPlay" type="button" class="btn btn-secondary btn-block" title="Start playing after first song is added to the queue">
AutoPlay
</button>
</div>
</div>
<hr/> <hr/>
<h4>Jukebox</h4> <h4>Jukebox</h4>
<div class="row"> <div class="row">

View File

@ -281,7 +281,7 @@ function appRoute() {
var breadcrumbItemsLen = breadcrumbItems.length; var breadcrumbItemsLen = breadcrumbItems.length;
for (var i = 0; i < breadcrumbItemsLen; i++) { for (var i = 0; i < breadcrumbItemsLen; i++) {
breadcrumbItems[i].addEventListener('click', function() { breadcrumbItems[i].addEventListener('click', function() {
appGoto('Browse', 'Filesystem', undefined, '0/' + app.current.filter + '/' + this.getAttribute('data-uri')); appGoto('Browse', 'Filesystem', undefined, '0/' + app.current.filter + '/' + app.current.sort + '/' + this.getAttribute('data-uri'));
}, false); }, false);
} }
doSetFilterLetter('BrowseFilesystemFilter'); doSetFilterLetter('BrowseFilesystemFilter');
@ -576,7 +576,7 @@ function appInit() {
if (event.target.nodeName == 'TD') { if (event.target.nodeName == 'TD') {
switch(event.target.parentNode.getAttribute('data-type')) { switch(event.target.parentNode.getAttribute('data-type')) {
case 'dir': case 'dir':
appGoto('Browse', 'Filesystem', undefined, '0/' + app.current.filter +'/' + decodeURI(event.target.parentNode.getAttribute("data-uri"))); appGoto('Browse', 'Filesystem', undefined, '0/' + app.current.filter + app.current.sort + '/' +'/' + decodeURI(event.target.parentNode.getAttribute("data-uri")));
break; break;
case 'song': case 'song':
appendQueue('song', decodeURI(event.target.parentNode.getAttribute("data-uri")), event.target.parentNode.getAttribute("data-name")); appendQueue('song', decodeURI(event.target.parentNode.getAttribute("data-uri")), event.target.parentNode.getAttribute("data-name"));
@ -611,7 +611,7 @@ function appInit() {
document.getElementById('BrowseDatabaseTagList').addEventListener('click', function(event) { document.getElementById('BrowseDatabaseTagList').addEventListener('click', function(event) {
if (event.target.nodeName == 'TD') { if (event.target.nodeName == 'TD') {
appGoto('Browse', 'Database', app.current.view, '0/-/' + event.target.parentNode.getAttribute('data-uri')); appGoto('Browse', 'Database', app.current.view, '0/-/-/' + event.target.parentNode.getAttribute('data-uri'));
} }
}, false); }, false);
@ -671,12 +671,12 @@ function appInit() {
if (event.key == 'Escape') if (event.key == 'Escape')
this.blur(); this.blur();
else else
appGoto(app.current.app, app.current.tab, app.current.view, '0/' + app.current.filter + '/' + this.value); appGoto(app.current.app, app.current.tab, app.current.view, '0/' + app.current.filter + app.current.sort + '/' + '/' + this.value);
}, false); }, false);
document.getElementById('searchqueuetags').addEventListener('click', function(event) { document.getElementById('searchqueuetags').addEventListener('click', function(event) {
if (event.target.nodeName == 'BUTTON') if (event.target.nodeName == 'BUTTON')
appGoto(app.current.app, app.current.tab, app.current.view, app.current.page + '/' + event.target.getAttribute('data-tag') + '/' + app.current.search); appGoto(app.current.app, app.current.tab, app.current.view, app.current.page + '/' + event.target.getAttribute('data-tag') + app.current.sort + '/' + '/' + app.current.search);
}, false); }, false);
var dropdowns = ['QueueCurrentColsDropdown', 'BrowseFilesystemColsDropdown', 'SearchColsDropdown', 'BrowsePlaylistsDetailColsDropdown', var dropdowns = ['QueueCurrentColsDropdown', 'BrowseFilesystemColsDropdown', 'SearchColsDropdown', 'BrowsePlaylistsDetailColsDropdown',
@ -780,7 +780,7 @@ function appInit() {
document.getElementById('BrowseDatabaseByTagDropdown').addEventListener('click', function(event) { document.getElementById('BrowseDatabaseByTagDropdown').addEventListener('click', function(event) {
if (event.target.nodeName == 'BUTTON') if (event.target.nodeName == 'BUTTON')
appGoto(app.current.app, app.current.tab, event.target.getAttribute('data-tag') , '0/' + app.current.filter + '/' + app.current.search); appGoto(app.current.app, app.current.tab, event.target.getAttribute('data-tag') , '0/' + app.current.filter + app.current.sort + '/' + '/' + app.current.search);
}, false); }, false);
document.getElementsByTagName('body')[0].addEventListener('click', function(event) { document.getElementsByTagName('body')[0].addEventListener('click', function(event) {
@ -1211,6 +1211,7 @@ function parseSettings() {
toggleBtn('btnConsume', settings.consume); toggleBtn('btnConsume', settings.consume);
toggleBtn('btnSingle', settings.single); toggleBtn('btnSingle', settings.single);
toggleBtn('btnRepeat', settings.repeat); toggleBtn('btnRepeat', settings.repeat);
toggleBtn('btnAutoPlay', settings.autoPlay);
if (settings.crossfade != undefined) { if (settings.crossfade != undefined) {
document.getElementById('inputCrossfade').removeAttribute('disabled'); document.getElementById('inputCrossfade').removeAttribute('disabled');
@ -1261,6 +1262,7 @@ function parseSettings() {
var features = ["featStickers", "featSmartpls", "featPlaylists", "featTags", "featLocalplayer", "featSyscmds", "featCoverimage", "featAdvsearch"]; var features = ["featStickers", "featSmartpls", "featPlaylists", "featTags", "featLocalplayer", "featSyscmds", "featCoverimage", "featAdvsearch"];
document.documentElement.style.setProperty('--mympd-coverimagesize', settings.coverimagesize + "px"); document.documentElement.style.setProperty('--mympd-coverimagesize', settings.coverimagesize + "px");
document.documentElement.style.setProperty('--mympd-backgroundcolor', settings.backgroundcolor);
for (var j = 0; j < features.length; j++) { for (var j = 0; j < features.length; j++) {
var Els = document.getElementsByClassName(features[j]); var Els = document.getElementsByClassName(features[j]);
@ -2967,7 +2969,8 @@ function confirmSettings() {
"notificationPage": (document.getElementById('btnnotifyPage').classList.contains('active') ? true : false), "notificationPage": (document.getElementById('btnnotifyPage').classList.contains('active') ? true : false),
"jukeboxMode": selectJukeboxMode.options[selectJukeboxMode.selectedIndex].value, "jukeboxMode": selectJukeboxMode.options[selectJukeboxMode.selectedIndex].value,
"jukeboxPlaylist": selectJukeboxPlaylist.options[selectJukeboxPlaylist.selectedIndex].value, "jukeboxPlaylist": selectJukeboxPlaylist.options[selectJukeboxPlaylist.selectedIndex].value,
"jukeboxQueueLength": document.getElementById('inputJukeboxQueueLength').value "jukeboxQueueLength": document.getElementById('inputJukeboxQueueLength').value,
"autoPlay": (document.getElementById('btnAutoPlay').classList.contains('active') ? true : false)
}}, getSettings); }}, getSettings);
modalSettings.hide(); modalSettings.hide();
} else } else

View File

@ -184,6 +184,7 @@ typedef struct t_config {
const char *streamurl; const char *streamurl;
unsigned long last_played_count; unsigned long last_played_count;
long loglevel; long loglevel;
const char *backgroundcolor;
} t_config; } t_config;
//global functions //global functions

View File

@ -134,6 +134,8 @@ static int inihandler(void *user, const char *section, const char *name, const c
p_config->last_played_count = strtol(value, &crap, 10); p_config->last_played_count = strtol(value, &crap, 10);
else if (MATCH("mympd", "loglevel")) else if (MATCH("mympd", "loglevel"))
p_config->loglevel = strtol(value, &crap, 10); p_config->loglevel = strtol(value, &crap, 10);
else if (MATCH("theme", "backgroundcolor"))
p_config->backgroundcolor = strdup(value);
else { else {
printf("Unkown config option: %s - %s\n", section, name); printf("Unkown config option: %s - %s\n", section, name);
return 0; /* unknown section/name, error */ return 0; /* unknown section/name, error */
@ -182,6 +184,7 @@ int main(int argc, char **argv) {
config.syscmds = false; config.syscmds = false;
config.localplayer = true; config.localplayer = true;
config.loglevel = 1; config.loglevel = 1;
config.backgroundcolor = "#888";
if (argc == 2) { if (argc == 2) {
printf("Starting myMPD %s\n", MYMPD_VERSION); printf("Starting myMPD %s\n", MYMPD_VERSION);

View File

@ -107,6 +107,7 @@ typedef struct t_mpd_state {
enum jukebox_modes jukeboxMode; enum jukebox_modes jukeboxMode;
const char *jukeboxPlaylist; const char *jukeboxPlaylist;
int jukeboxQueueLength; int jukeboxQueueLength;
bool autoPlay;
//taglists //taglists
struct list mpd_tags; struct list mpd_tags;
@ -255,6 +256,7 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r
je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mpd_state->jukeboxMode); je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mpd_state->jukeboxMode);
je = json_scanf(request->data, request->length, "{data: {jukeboxPlaylist: %Q}}", &mpd_state->jukeboxPlaylist); je = json_scanf(request->data, request->length, "{data: {jukeboxPlaylist: %Q}}", &mpd_state->jukeboxPlaylist);
je = json_scanf(request->data, request->length, "{data: {jukeboxQueueLength: %d}}", &mpd_state->jukeboxQueueLength); je = json_scanf(request->data, request->length, "{data: {jukeboxQueueLength: %d}}", &mpd_state->jukeboxQueueLength);
je = json_scanf(request->data, request->length, "{data: {autoPlay: %B}}", &mpd_state->autoPlay);
//set mpd options //set mpd options
je = json_scanf(request->data, request->length, "{data: {random: %u}}", &uint_buf1); je = json_scanf(request->data, request->length, "{data: {random: %u}}", &uint_buf1);
if (je == 1) { if (je == 1) {
@ -929,8 +931,14 @@ static void mpd_client_parse_idle(t_config *config, t_mpd_state *mpd_state, int
break; break;
case MPD_IDLE_QUEUE: case MPD_IDLE_QUEUE:
len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_queue\"}"); len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_queue\"}");
//jukebox enabled
if (mpd_state->jukeboxMode != JUKEBOX_OFF) if (mpd_state->jukeboxMode != JUKEBOX_OFF)
mpd_client_jukebox(config, mpd_state); mpd_client_jukebox(config, mpd_state);
//autoPlay enabled
if (mpd_state->autoPlay == true) {
LOG_VERBOSE() printf("AutoPlay enabled, start playing");
mpd_run_play(mpd_state->conn);
}
break; break;
case MPD_IDLE_PLAYER: case MPD_IDLE_PLAYER:
len = mpd_client_put_state(mpd_state, buffer); len = mpd_client_put_state(mpd_state, buffer);

View File

@ -50,6 +50,8 @@ typedef struct t_mympd_state {
char *jukeboxPlaylist; char *jukeboxPlaylist;
int jukeboxQueueLength; int jukeboxQueueLength;
bool autoPlay;
//columns //columns
char *colsQueueCurrent; char *colsQueueCurrent;
char *colsSearch; char *colsSearch;
@ -187,6 +189,11 @@ static void mympd_api(t_config *config, t_mympd_state *mympd_state, t_work_reque
if (!state_file_write(config, "notificationPage", (mympd_state->notificationPage == true ? "true" : "false"))) if (!state_file_write(config, "notificationPage", (mympd_state->notificationPage == true ? "true" : "false")))
len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationPage.\"}"); len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationPage.\"}");
} }
je = json_scanf(request->data, request->length, "{data: {autoPlay: %B}}", &mympd_state->autoPlay);
if (je == 1) {
if (!state_file_write(config, "autoPlay", (mympd_state->autoPlay == true ? "true" : "false")))
len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state autoPlay.\"}");
}
je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mympd_state->jukeboxMode); je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mympd_state->jukeboxMode);
if (je == 1) { if (je == 1) {
snprintf(p_char, 4, "%d", mympd_state->jukeboxMode); snprintf(p_char, 4, "%d", mympd_state->jukeboxMode);
@ -335,6 +342,17 @@ static void mympd_api_read_statefiles(t_config *config, t_mympd_state *mympd_sta
state_file_write(config, "notificationPage", "true"); state_file_write(config, "notificationPage", "true");
} }
if (state_file_read(config, "autoPlay", value)) {
if (strcmp(value, "true") == 0)
mympd_state->autoPlay = true;
else
mympd_state->autoPlay = false;
}
else {
mympd_state->autoPlay = false;
state_file_write(config, "autoPlay", "false");
}
if (state_file_read(config, "jukeboxMode", value)) if (state_file_read(config, "jukeboxMode", value))
mympd_state->jukeboxMode = strtol(value, &crap, 10); mympd_state->jukeboxMode = strtol(value, &crap, 10);
else { else {
@ -413,7 +431,8 @@ static int mympd_api_put_settings(t_config *config, t_mympd_state *mympd_state,
len = json_printf(&out, "{type: mympdSettings, data: {mpdhost: %Q, mpdport: %d, passwort_set: %B, featSyscmds: %B, " len = json_printf(&out, "{type: mympdSettings, data: {mpdhost: %Q, mpdport: %d, passwort_set: %B, featSyscmds: %B, "
"featLocalplayer: %B, streamport: %d, streamurl: %Q, featCoverimage: %B, coverimagename: %Q, coverimagesize: %d, featMixramp: %B, " "featLocalplayer: %B, streamport: %d, streamurl: %Q, featCoverimage: %B, coverimagename: %Q, coverimagesize: %d, featMixramp: %B, "
"maxElementsPerPage: %d, notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d", "maxElementsPerPage: %d, notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d, "
"autoPlay: %B, backgroundcolor: %Q",
config->mpdhost, config->mpdhost,
config->mpdport, config->mpdport,
config->mpdpass ? "true" : "false", config->mpdpass ? "true" : "false",
@ -430,7 +449,9 @@ static int mympd_api_put_settings(t_config *config, t_mympd_state *mympd_state,
mympd_state->notificationPage, mympd_state->notificationPage,
mympd_state->jukeboxMode, mympd_state->jukeboxMode,
mympd_state->jukeboxPlaylist, mympd_state->jukeboxPlaylist,
mympd_state->jukeboxQueueLength mympd_state->jukeboxQueueLength,
mympd_state->autoPlay,
config->backgroundcolor
); );
if (config->syscmds == true) { if (config->syscmds == true) {