mirror of
https://github.com/SuperBFG7/ympd
synced 2024-06-22 04:43:15 +00:00
Feat: jukebox mode - add whole album #57
Feat: jukebox mode - configurable number of tracks in queue #57
This commit is contained in:
parent
0ae38ae2ba
commit
fc115a9d1b
|
@ -743,16 +743,30 @@
|
||||||
<hr/>
|
<hr/>
|
||||||
<h4>Jukebox</h4>
|
<h4>Jukebox</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6" data-toggle="buttons">
|
<div class="form-group input-group col-md-6 border-secondary">
|
||||||
<button data-href='{"cmd": "toggleBtn", "options": ["btnJukebox"]}' id="btnJukebox" type="button" class="btn btn-secondary btn-block" title="Jukebox">
|
<div class="input-group-prepend">
|
||||||
Jukebox
|
<div class="input-group-text bg-secondary text-light border-secondary">Mode</div>
|
||||||
</button>
|
</div>
|
||||||
|
<select id="selectJukeboxMode" class="form-control custom-select border-secondary">
|
||||||
|
<option value="0">Off</option>
|
||||||
|
<option value="1">Track</option>
|
||||||
|
<option value="2">Album</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group input-group col-md-6 border-secondary">
|
<div class="form-group input-group col-md-6 border-secondary">
|
||||||
<select id="jukeboxPlaylist" class="form-control custom-select border-secondary">
|
<select id="selectJukeboxPlaylist" class="form-control custom-select border-secondary">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group input-group col-md-6 border-secondary">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<div class="input-group-text bg-secondary text-light border-secondary">Min. queue length</div>
|
||||||
|
</div>
|
||||||
|
<input id="inputJukeboxQueueLength" type="text" class="form-control border-secondary" value="1">
|
||||||
|
<div class="invalid-feedback">Must be a number and > 0</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<hr/>
|
<hr/>
|
||||||
<h4>Notifications</h4>
|
<h4>Notifications</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -808,7 +808,6 @@ function parseSettings(obj) {
|
||||||
toggleBtn('btnConsume', obj.data.consume);
|
toggleBtn('btnConsume', obj.data.consume);
|
||||||
toggleBtn('btnSingle', obj.data.single);
|
toggleBtn('btnSingle', obj.data.single);
|
||||||
toggleBtn('btnRepeat', obj.data.repeat);
|
toggleBtn('btnRepeat', obj.data.repeat);
|
||||||
toggleBtn('btnJukebox', obj.data.jukeboxMode);
|
|
||||||
|
|
||||||
if (obj.data.crossfade != undefined) {
|
if (obj.data.crossfade != undefined) {
|
||||||
document.getElementById('inputCrossfade').removeAttribute('disabled');
|
document.getElementById('inputCrossfade').removeAttribute('disabled');
|
||||||
|
@ -859,26 +858,26 @@ function parseSettings(obj) {
|
||||||
var stickerEls = document.getElementsByClassName('stickers');
|
var stickerEls = document.getElementsByClassName('stickers');
|
||||||
var stickerElsLen = stickerEls.length;
|
var stickerElsLen = stickerEls.length;
|
||||||
var displayStickers = obj.data.stickers == true ? '' : 'none';
|
var displayStickers = obj.data.stickers == true ? '' : 'none';
|
||||||
for (var i = 0; i < stickerElsLen; i++) {
|
for (var i = 0; i < stickerElsLen; i++)
|
||||||
stickerEls[i].style.display = displayStickers;
|
stickerEls[i].style.display = displayStickers;
|
||||||
}
|
|
||||||
|
|
||||||
var smartplsEls = document.getElementsByClassName('smartpls');
|
var smartplsEls = document.getElementsByClassName('smartpls');
|
||||||
var smartplsElsLen = smartplsEls.length;
|
var smartplsElsLen = smartplsEls.length;
|
||||||
var displaySmartpls = obj.data.smartpls == true ? '' : 'none';
|
var displaySmartpls = obj.data.smartpls == true ? '' : 'none';
|
||||||
for (var i = 0; i < smartplsElsLen; i++) {
|
for (var i = 0; i < smartplsElsLen; i++)
|
||||||
smartplsEls[i].style.display = displaySmartpls;
|
smartplsEls[i].style.display = displaySmartpls;
|
||||||
}
|
|
||||||
|
|
||||||
if (obj.data.mixramp == true) {
|
if (obj.data.mixramp == true)
|
||||||
document.getElementsByClassName('mixramp')[0].style.display = '';
|
document.getElementsByClassName('mixramp')[0].style.display = '';
|
||||||
} else {
|
else
|
||||||
document.getElementsByClassName('mixramp')[0].style.display = 'none';
|
document.getElementsByClassName('mixramp')[0].style.display = 'none';
|
||||||
}
|
|
||||||
|
document.getElementById('selectJukeboxMode').value = obj.data.jukeboxMode;
|
||||||
|
document.getElementById('inputJukeboxQueueLength').value = obj.data.jukeboxQueueLength;
|
||||||
|
|
||||||
settings = obj.data;
|
settings = obj.data;
|
||||||
|
|
||||||
playlistEl = 'jukeboxPlaylist';
|
playlistEl = 'selectJukeboxPlaylist';
|
||||||
sendAPI({"cmd": "MPD_API_PLAYLIST_LIST", "data": {"offset": 0, "filter": "-"}}, getAllPlaylists);
|
sendAPI({"cmd": "MPD_API_PLAYLIST_LIST", "data": {"offset": 0, "filter": "-"}}, getAllPlaylists);
|
||||||
|
|
||||||
settings.mpdstream = 'http://';
|
settings.mpdstream = 'http://';
|
||||||
|
@ -1544,12 +1543,12 @@ function getAllPlaylists(obj) {
|
||||||
if (obj.offset == 0) {
|
if (obj.offset == 0) {
|
||||||
if (playlistEl == 'addToPlaylistPlaylist')
|
if (playlistEl == 'addToPlaylistPlaylist')
|
||||||
playlists = '<option></option><option>New Playlist</option>';
|
playlists = '<option></option><option>New Playlist</option>';
|
||||||
else if (playlistEl == 'jukeboxPlaylist')
|
else if (playlistEl == 'selectJukeboxPlaylist')
|
||||||
playlists = '<option>Database</option>';
|
playlists = '<option>Database</option>';
|
||||||
}
|
}
|
||||||
for (var i = 0; i < nrItems; i++) {
|
for (var i = 0; i < nrItems; i++) {
|
||||||
playlists += '<option';
|
playlists += '<option';
|
||||||
if (playlistEl == 'jukeboxPlaylist' && obj.data[i].uri == settings.jukeboxPlaylist)
|
if (playlistEl == 'selectJukeboxPlaylist' && obj.data[i].uri == settings.jukeboxPlaylist)
|
||||||
playlists += ' selected';
|
playlists += ' selected';
|
||||||
playlists += '>' + obj.data[i].uri + '</option>';
|
playlists += '>' + obj.data[i].uri + '</option>';
|
||||||
}
|
}
|
||||||
|
@ -1831,7 +1830,8 @@ function showMenu(el, event) {
|
||||||
addMenuItem({"cmd": "replaceQueue", "options": [type, uri, name]}, 'Replace queue') +
|
addMenuItem({"cmd": "replaceQueue", "options": [type, uri, name]}, 'Replace queue') +
|
||||||
(x.getAttribute('data-ro') == 'false' ? addMenuItem({"cmd": "removeFromPlaylist", "options": [x.getAttribute('data-uri'),
|
(x.getAttribute('data-ro') == 'false' ? addMenuItem({"cmd": "removeFromPlaylist", "options": [x.getAttribute('data-uri'),
|
||||||
el.parentNode.parentNode.getAttribute('data-songpos')]}, 'Remove') : '') +
|
el.parentNode.parentNode.getAttribute('data-songpos')]}, 'Remove') : '') +
|
||||||
addMenuItem({"cmd": "showAddToPlaylist", "options": [uri]}, 'Add to playlist');
|
addMenuItem({"cmd": "showAddToPlaylist", "options": [uri]}, 'Add to playlist') +
|
||||||
|
(uri.indexOf('http') == -1 ? addMenuItem({"cmd": "songDetails", "options": [uri]}, 'Songdetails') : '');
|
||||||
}
|
}
|
||||||
else if (app.current.app == 'Queue') {
|
else if (app.current.app == 'Queue') {
|
||||||
menu += addMenuItem({"cmd": "delQueueSong", "options": ["single", el.parentNode.parentNode.getAttribute('data-trackid')]}, 'Remove') +
|
menu += addMenuItem({"cmd": "delQueueSong", "options": ["single", el.parentNode.parentNode.getAttribute('data-trackid')]}, 'Remove') +
|
||||||
|
@ -1999,6 +1999,20 @@ function confirmSettings() {
|
||||||
formOK = false;
|
formOK = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var inputJukeboxQueueLength = document.getElementById('inputJukeboxQueueLength');
|
||||||
|
var value = parseInt(inputJukeboxQueueLength.value);
|
||||||
|
if (!isNaN(value)) {
|
||||||
|
if (value > 0) {
|
||||||
|
inputJukeboxQueueLength.value = value;
|
||||||
|
} else {
|
||||||
|
inputJukeboxQueueLength.classList.add('is-invalid');
|
||||||
|
formOK = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
inputJukeboxQueueLength.classList.add('is-invalid');
|
||||||
|
formOK = false;
|
||||||
|
}
|
||||||
if (settings.mixramp) {
|
if (settings.mixramp) {
|
||||||
var inputMixrampdb = document.getElementById('inputMixrampdb');
|
var inputMixrampdb = document.getElementById('inputMixrampdb');
|
||||||
if (!inputMixrampdb.getAttribute('disabled')) {
|
if (!inputMixrampdb.getAttribute('disabled')) {
|
||||||
|
@ -2026,7 +2040,8 @@ function confirmSettings() {
|
||||||
|
|
||||||
if (formOK == true) {
|
if (formOK == true) {
|
||||||
var selectReplaygain = document.getElementById('selectReplaygain');
|
var selectReplaygain = document.getElementById('selectReplaygain');
|
||||||
var selectJukeboxPlaylist = document.getElementById('jukeboxPlaylist');
|
var selectJukeboxPlaylist = document.getElementById('selectJukeboxPlaylist');
|
||||||
|
var selectJukeboxMode = document.getElementById('selectJukeboxMode');
|
||||||
sendAPI({"cmd": "MPD_API_SETTINGS_SET", "data": {
|
sendAPI({"cmd": "MPD_API_SETTINGS_SET", "data": {
|
||||||
"consume": (document.getElementById('btnConsume').classList.contains('active') ? 1 : 0),
|
"consume": (document.getElementById('btnConsume').classList.contains('active') ? 1 : 0),
|
||||||
"random": (document.getElementById('btnRandom').classList.contains('active') ? 1 : 0),
|
"random": (document.getElementById('btnRandom').classList.contains('active') ? 1 : 0),
|
||||||
|
@ -2038,8 +2053,9 @@ function confirmSettings() {
|
||||||
"mixrampdelay": (settings.mixramp == true ? document.getElementById('inputMixrampdelay').value : settings.mixrampdelay),
|
"mixrampdelay": (settings.mixramp == true ? document.getElementById('inputMixrampdelay').value : settings.mixrampdelay),
|
||||||
"notificationWeb": (document.getElementById('btnnotifyWeb').classList.contains('active') ? true : false),
|
"notificationWeb": (document.getElementById('btnnotifyWeb').classList.contains('active') ? true : false),
|
||||||
"notificationPage": (document.getElementById('btnnotifyPage').classList.contains('active') ? true : false),
|
"notificationPage": (document.getElementById('btnnotifyPage').classList.contains('active') ? true : false),
|
||||||
"jukeboxMode": (document.getElementById('btnJukebox').classList.contains('active') ? true : false),
|
"jukeboxMode": selectJukeboxMode.options[selectJukeboxMode.selectedIndex].value,
|
||||||
"jukeboxPlaylist": selectJukeboxPlaylist.options[selectJukeboxPlaylist.selectedIndex].value
|
"jukeboxPlaylist": selectJukeboxPlaylist.options[selectJukeboxPlaylist.selectedIndex].value,
|
||||||
|
"jukeboxQueueLength": document.getElementById('inputJukeboxQueueLength').value
|
||||||
}}, getSettings);
|
}}, getSettings);
|
||||||
modalSettings.hide();
|
modalSettings.hide();
|
||||||
} else
|
} else
|
||||||
|
|
139
src/mpd_client.c
139
src/mpd_client.c
|
@ -112,23 +112,25 @@ void callback_mympd(struct mg_connection *nc, const struct mg_str msg) {
|
||||||
n = mympd_put_state(mpd.buf, &mpd.song_id, &mpd.next_song_id, &mpd.last_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_SETTINGS_SET:
|
case MPD_API_SETTINGS_SET:
|
||||||
je = json_scanf(msg.p, msg.len, "{data: {notificationWeb: %B, notificationPage: %B, jukeboxMode: %B, jukeboxPlaylist: %Q}}",
|
je = json_scanf(msg.p, msg.len, "{data: {notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d}}",
|
||||||
&mympd_state.notificationWeb,
|
&mympd_state.notificationWeb,
|
||||||
&mympd_state.notificationPage,
|
&mympd_state.notificationPage,
|
||||||
&mympd_state.jukeboxMode,
|
&mympd_state.jukeboxMode,
|
||||||
&mympd_state.jukeboxPlaylist);
|
&mympd_state.jukeboxPlaylist,
|
||||||
if (je == 4) {
|
&mympd_state.jukeboxQueueLength);
|
||||||
|
if (je == 5) {
|
||||||
char tmpfile[400];
|
char tmpfile[400];
|
||||||
char statefile[400];
|
char statefile[400];
|
||||||
snprintf(tmpfile, 400, "%s/tmp/mympd.state", config.varlibdir );
|
snprintf(tmpfile, 400, "%s/tmp/mympd.state", config.varlibdir );
|
||||||
snprintf(statefile, 400, "%s/mympd.state", config.varlibdir );
|
snprintf(statefile, 400, "%s/mympd.state", config.varlibdir );
|
||||||
json_fprintf(tmpfile, "{notificationWeb: %B, notificationPage: %B, jukeboxMode: %B, jukeboxPlaylist: %Q}",
|
json_fprintf(tmpfile, "{notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d}",
|
||||||
mympd_state.notificationWeb,
|
mympd_state.notificationWeb,
|
||||||
mympd_state.notificationPage,
|
mympd_state.notificationPage,
|
||||||
mympd_state.jukeboxMode,
|
mympd_state.jukeboxMode,
|
||||||
mympd_state.jukeboxPlaylist);
|
mympd_state.jukeboxPlaylist,
|
||||||
|
mympd_state.jukeboxQueueLength);
|
||||||
rename(tmpfile, statefile);
|
rename(tmpfile, statefile);
|
||||||
if (mympd_state.jukeboxMode == true)
|
if (mympd_state.jukeboxMode > 0)
|
||||||
mympd_jukebox();
|
mympd_jukebox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,7 +599,7 @@ void mympd_parse_idle(struct mg_mgr *s, int idle_bitmask) {
|
||||||
break;
|
break;
|
||||||
case MPD_IDLE_QUEUE:
|
case MPD_IDLE_QUEUE:
|
||||||
len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_queue\"}");
|
len = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"update_queue\"}");
|
||||||
if (mympd_state.jukeboxMode == true)
|
if (mympd_state.jukeboxMode > 0)
|
||||||
mympd_jukebox();
|
mympd_jukebox();
|
||||||
break;
|
break;
|
||||||
case MPD_IDLE_PLAYER:
|
case MPD_IDLE_PLAYER:
|
||||||
|
@ -783,8 +785,8 @@ void mympd_idle(struct mg_mgr *s, int timeout) {
|
||||||
mpd.conn_state = MPD_CONNECTED;
|
mpd.conn_state = MPD_CONNECTED;
|
||||||
mympd_mpd_features();
|
mympd_mpd_features();
|
||||||
mympd_smartpls_update_all();
|
mympd_smartpls_update_all();
|
||||||
if (mympd_state.jukeboxMode == true)
|
if (mympd_state.jukeboxMode > 0)
|
||||||
mympd_jukebox();
|
mympd_jukebox();
|
||||||
mpd_send_idle(mpd.conn);
|
mpd_send_idle(mpd.conn);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -976,9 +978,11 @@ char* mympd_get_tag(struct mpd_song const *song, enum mpd_tag_type tag) {
|
||||||
void mympd_jukebox() {
|
void mympd_jukebox() {
|
||||||
struct mpd_status *status;
|
struct mpd_status *status;
|
||||||
status = mpd_run_status(mpd.conn);
|
status = mpd_run_status(mpd.conn);
|
||||||
int queue_length, num_songs, rand_song, i;
|
int queue_length, num_songs, rand_song, i, j, addSongs;
|
||||||
struct mpd_entity *entity;
|
struct mpd_entity *entity;
|
||||||
const struct mpd_song *song;
|
const struct mpd_song *song;
|
||||||
|
struct mpd_pair *pair;
|
||||||
|
char *album;
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("MPD mpd_run_status: %s\n", mpd_connection_get_error_message(mpd.conn));
|
printf("MPD mpd_run_status: %s\n", mpd_connection_get_error_message(mpd.conn));
|
||||||
|
@ -987,66 +991,86 @@ void mympd_jukebox() {
|
||||||
}
|
}
|
||||||
queue_length = mpd_status_get_queue_length(status);
|
queue_length = mpd_status_get_queue_length(status);
|
||||||
mpd_status_free(status);
|
mpd_status_free(status);
|
||||||
if (queue_length > 0)
|
if (queue_length > mympd_state.jukeboxQueueLength)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
srand((unsigned int)time(NULL));
|
srand((unsigned int)time(NULL));
|
||||||
|
|
||||||
if (strcmp(mympd_state.jukeboxPlaylist, "Database") == 0) {
|
if (mympd_state.jukeboxMode == 2) {
|
||||||
struct mpd_stats *stats = mpd_run_stats(mpd.conn);
|
//Add whole album
|
||||||
num_songs = mpd_stats_get_number_of_songs(stats);
|
mpd_search_db_tags(mpd.conn, MPD_TAG_ALBUM);
|
||||||
mpd_stats_free(stats);
|
mpd_search_commit(mpd.conn);
|
||||||
|
num_songs = 0;
|
||||||
|
while ((pair = mpd_recv_pair_tag(mpd.conn, MPD_TAG_ALBUM)) != NULL) {
|
||||||
|
num_songs++;
|
||||||
|
mpd_return_pair(mpd.conn, pair);
|
||||||
|
}
|
||||||
|
mpd_response_finish(mpd.conn);
|
||||||
num_songs--;
|
num_songs--;
|
||||||
if (num_songs > 0) {
|
if (num_songs > 0) {
|
||||||
rand_song = rand() % num_songs;
|
rand_song = rand() % num_songs;
|
||||||
mpd_send_list_all(mpd.conn, "/");
|
mpd_search_db_tags(mpd.conn, MPD_TAG_ALBUM);
|
||||||
|
mpd_search_commit(mpd.conn);
|
||||||
i = 0;
|
i = 0;
|
||||||
|
while ((pair = mpd_recv_pair_tag(mpd.conn, MPD_TAG_ALBUM )) != NULL) {
|
||||||
|
if (i == rand_song) {
|
||||||
|
album = strdup(pair->value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
mpd_return_pair(mpd.conn, pair);
|
||||||
|
}
|
||||||
|
mpd_return_pair(mpd.conn, pair);
|
||||||
|
mpd_response_finish(mpd.conn);
|
||||||
|
printf("Jukebox enabled, adding random album %s: %d/%d\n", album, rand_song, num_songs);
|
||||||
|
mpd_send_command(mpd.conn, "searchadd", "Album", album, NULL);
|
||||||
|
mpd_response_finish(mpd.conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (mympd_state.jukeboxMode == 1) {
|
||||||
|
//Add tracks
|
||||||
|
if (strcmp(mympd_state.jukeboxPlaylist, "Database") == 0) {
|
||||||
|
struct mpd_stats *stats = mpd_run_stats(mpd.conn);
|
||||||
|
num_songs = mpd_stats_get_number_of_songs(stats);
|
||||||
|
mpd_stats_free(stats);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mpd_send_list_playlist(mpd.conn, mympd_state.jukeboxPlaylist);
|
||||||
|
num_songs = 0;
|
||||||
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
||||||
if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) {
|
num_songs++;
|
||||||
if (i == rand_song)
|
mpd_entity_free(entity);
|
||||||
break;
|
}
|
||||||
i++;
|
}
|
||||||
|
num_songs--;
|
||||||
|
addSongs = mympd_state.jukeboxQueueLength - queue_length;
|
||||||
|
if (num_songs > 0) {
|
||||||
|
for (j = 0; j < addSongs; j++) {
|
||||||
|
rand_song = rand() % num_songs;
|
||||||
|
if (strcmp(mympd_state.jukeboxPlaylist, "Database") == 0)
|
||||||
|
mpd_send_list_all(mpd.conn, "/");
|
||||||
|
else
|
||||||
|
mpd_send_list_playlist(mpd.conn, mympd_state.jukeboxPlaylist);
|
||||||
|
i = 0;
|
||||||
|
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
||||||
|
if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) {
|
||||||
|
if (i == rand_song)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
mpd_entity_free(entity);
|
||||||
|
}
|
||||||
|
mpd_response_finish(mpd.conn);
|
||||||
|
song = mpd_entity_get_song(entity);
|
||||||
|
if (song != NULL) {
|
||||||
|
printf("Jukebox enabled, adding random song: %d/%d\n", rand_song, num_songs);
|
||||||
|
mpd_run_add(mpd.conn, mpd_song_get_uri(song));
|
||||||
}
|
}
|
||||||
mpd_entity_free(entity);
|
mpd_entity_free(entity);
|
||||||
}
|
}
|
||||||
mpd_response_finish(mpd.conn);
|
|
||||||
song = mpd_entity_get_song(entity);
|
|
||||||
if (song != NULL) {
|
|
||||||
printf("Jukebox enabled, playing random song from database: %d/%d\n", rand_song, num_songs);
|
|
||||||
mpd_run_add(mpd.conn, mpd_song_get_uri(song));
|
|
||||||
mpd_run_play(mpd.conn);
|
|
||||||
}
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mpd_send_list_playlist(mpd.conn, mympd_state.jukeboxPlaylist);
|
|
||||||
num_songs = 0;
|
|
||||||
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
|
||||||
num_songs++;
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
}
|
|
||||||
num_songs--;
|
|
||||||
if (num_songs > 0) {
|
|
||||||
rand_song = rand() % num_songs;
|
|
||||||
mpd_send_list_playlist(mpd.conn, mympd_state.jukeboxPlaylist);
|
|
||||||
i = 0;
|
|
||||||
while ((entity = mpd_recv_entity(mpd.conn)) != NULL) {
|
|
||||||
if (i == rand_song)
|
|
||||||
break;
|
|
||||||
i++;
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
}
|
|
||||||
mpd_response_finish(mpd.conn);
|
|
||||||
song = mpd_entity_get_song(entity);
|
|
||||||
if (song != NULL) {
|
|
||||||
printf("Jukebox enabled, playing random song from %s: %d/%d\n", mympd_state.jukeboxPlaylist, rand_song, num_songs);
|
|
||||||
mpd_run_add(mpd.conn, mpd_song_get_uri(song));
|
|
||||||
mpd_run_play(mpd.conn);
|
|
||||||
}
|
|
||||||
mpd_entity_free(entity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mpd_run_play(mpd.conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
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_state(char *buffer, int *current_song_id, int *next_song_id, int *last_song_id, unsigned *queue_version, unsigned *queue_length) {
|
||||||
|
@ -1138,7 +1162,7 @@ int mympd_put_settings(char *buffer) {
|
||||||
"repeat: %d, single: %d, crossfade: %d, consume: %d, random: %d, "
|
"repeat: %d, single: %d, crossfade: %d, consume: %d, random: %d, "
|
||||||
"mixrampdb: %f, mixrampdelay: %f, mpdhost: %Q, mpdport: %d, passwort_set: %B, "
|
"mixrampdb: %f, mixrampdelay: %f, mpdhost: %Q, mpdport: %d, passwort_set: %B, "
|
||||||
"streamport: %d, coverimage: %Q, stickers: %B, mixramp: %B, smartpls: %B, maxElementsPerPage: %d, "
|
"streamport: %d, coverimage: %Q, stickers: %B, mixramp: %B, smartpls: %B, maxElementsPerPage: %d, "
|
||||||
"replaygain: %Q, notificationWeb: %B, notificationPage: %B, jukeboxMode: %B, jukeboxPlaylist: %Q, "
|
"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,"
|
"tags: { Artist: %B, Album: %B, AlbumArtist: %B, Title: %B, Track: %B, Genre: %B, Date: %B,"
|
||||||
"Composer: %B, Performer: %B }"
|
"Composer: %B, Performer: %B }"
|
||||||
"}}",
|
"}}",
|
||||||
|
@ -1163,6 +1187,7 @@ int mympd_put_settings(char *buffer) {
|
||||||
mympd_state.notificationPage,
|
mympd_state.notificationPage,
|
||||||
mympd_state.jukeboxMode,
|
mympd_state.jukeboxMode,
|
||||||
mympd_state.jukeboxPlaylist,
|
mympd_state.jukeboxPlaylist,
|
||||||
|
mympd_state.jukeboxQueueLength,
|
||||||
mpd.tag_artist,
|
mpd.tag_artist,
|
||||||
mpd.tag_album,
|
mpd.tag_album,
|
||||||
mpd.tag_album_artist,
|
mpd.tag_album_artist,
|
||||||
|
|
|
@ -178,8 +178,9 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool notificationWeb;
|
bool notificationWeb;
|
||||||
bool notificationPage;
|
bool notificationPage;
|
||||||
bool jukeboxMode;
|
int jukeboxMode;
|
||||||
const char* jukeboxPlaylist;
|
const char* jukeboxPlaylist;
|
||||||
|
int jukeboxQueueLength;
|
||||||
} t_mympd_state;
|
} t_mympd_state;
|
||||||
|
|
||||||
t_mympd_state mympd_state;
|
t_mympd_state mympd_state;
|
||||||
|
|
13
src/mympd.c
13
src/mympd.c
|
@ -244,22 +244,25 @@ int main(int argc, char **argv) {
|
||||||
snprintf(statefile, 400, "%s/mympd.state", config.varlibdir);
|
snprintf(statefile, 400, "%s/mympd.state", config.varlibdir);
|
||||||
if (access(statefile, F_OK ) != -1 ) {
|
if (access(statefile, F_OK ) != -1 ) {
|
||||||
char *content = json_fread(statefile);
|
char *content = json_fread(statefile);
|
||||||
int je = json_scanf(content, strlen(content), "{notificationWeb: %B, notificationPage: %B, jukeboxMode: %B, jukeboxPlaylist: %Q}",
|
int je = json_scanf(content, strlen(content), "{notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d}",
|
||||||
&mympd_state.notificationWeb,
|
&mympd_state.notificationWeb,
|
||||||
&mympd_state.notificationPage,
|
&mympd_state.notificationPage,
|
||||||
&mympd_state.jukeboxMode,
|
&mympd_state.jukeboxMode,
|
||||||
&mympd_state.jukeboxPlaylist);
|
&mympd_state.jukeboxPlaylist,
|
||||||
if (je != 4) {
|
&mympd_state.jukeboxQueueLength);
|
||||||
|
if (je != 5) {
|
||||||
mympd_state.notificationWeb = false;
|
mympd_state.notificationWeb = false;
|
||||||
mympd_state.notificationPage = true;
|
mympd_state.notificationPage = true;
|
||||||
mympd_state.jukeboxMode = false;
|
mympd_state.jukeboxMode = 0;
|
||||||
mympd_state.jukeboxPlaylist = "Database";
|
mympd_state.jukeboxPlaylist = "Database";
|
||||||
|
mympd_state.jukeboxQueueLength = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mympd_state.notificationWeb = false;
|
mympd_state.notificationWeb = false;
|
||||||
mympd_state.notificationPage = true;
|
mympd_state.notificationPage = true;
|
||||||
mympd_state.jukeboxMode = false;
|
mympd_state.jukeboxMode = 0;
|
||||||
mympd_state.jukeboxPlaylist = "Database";
|
mympd_state.jukeboxPlaylist = "Database";
|
||||||
|
mympd_state.jukeboxQueueLength = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGTERM, signal_handler);
|
signal(SIGTERM, signal_handler);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user