1
0
mirror of https://github.com/SuperBFG7/ympd synced 2025-02-05 05:30:10 +00:00

Fix: central search backend - MPD_API_DATABASE_SEARCH

removed: MPD_API_DATABASE_SEARCH_ADD_PLAYLIST
removed: MPD_API_DATABASE_SEARCH_ADD_QUEUE
This commit is contained in:
jcorporation 2018-09-03 19:02:12 +01:00
parent 771d06b9af
commit 03dcfb1269
4 changed files with 60 additions and 130 deletions

View File

@ -135,10 +135,10 @@
</button> </button>
<div class="dropdown-menu bg-dark dropdown-menu-right px-2" id="searchqueuetag"> <div class="dropdown-menu bg-dark dropdown-menu-right px-2" id="searchqueuetag">
<h6 class="dropdown-header text-light">Search in Tag</h6> <h6 class="dropdown-header text-light">Search in Tag</h6>
<button type="button" class="btn btn-secondary btn-block active">Any Tag</button> <button type="button" class="btn btn-secondary btn-block active" data-tag="any">Any Tag</button>
<button type="button" class="btn btn-secondary btn-block">Title</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Title">Title</button>
<button type="button" class="btn btn-secondary btn-block">Artist</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Artist">Artist</button>
<button type="button" class="btn btn-secondary btn-block">Album</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Album">Album</button>
</div> </div>
</div> </div>
</div> </div>
@ -438,10 +438,10 @@
</button> </button>
<div class="dropdown-menu bg-dark dropdown-menu-right px-2" id="searchtags"> <div class="dropdown-menu bg-dark dropdown-menu-right px-2" id="searchtags">
<h6 class="dropdown-header text-light">Search in Tag</h6> <h6 class="dropdown-header text-light">Search in Tag</h6>
<button type="button" class="btn btn-secondary active btn-block">Any Tag</button> <button type="button" class="btn btn-secondary active btn-block" data-tag="any">Any Tag</button>
<button type="button" class="btn btn-secondary btn-block">Title</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Title">Title</button>
<button type="button" class="btn btn-secondary btn-block">Artist</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Artist">Artist</button>
<button type="button" class="btn btn-secondary btn-block">Album</button> <button type="button" class="btn btn-secondary btn-block" data-tag="Album">Album</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -36,7 +36,7 @@ var dragEl;
var app = {}; var app = {};
app.apps = { "Playback": { "state": "0/-/", "scrollPos": 0 }, app.apps = { "Playback": { "state": "0/-/", "scrollPos": 0 },
"Queue": { "state": "0/Any Tag/", "scrollPos": 0 }, "Queue": { "state": "0/any/", "scrollPos": 0 },
"Browse": { "Browse": {
"active": "Database", "active": "Database",
"tabs": { "Filesystem": { "state": "0/-/", "scrollPos": 0 }, "tabs": { "Filesystem": { "state": "0/-/", "scrollPos": 0 },
@ -54,7 +54,7 @@ app.apps = { "Playback": { "state": "0/-/", "scrollPos": 0 },
} }
} }
}, },
"Search": { "state": "0/Any Tag/", "scrollPos": 0 } "Search": { "state": "0/any/", "scrollPos": 0 }
}; };
app.current = { "app": "Playback", "tab": undefined, "view": undefined, "page": 0, "filter": "", "search": "", "scrollPos": 0 }; app.current = { "app": "Playback", "tab": undefined, "view": undefined, "page": 0, "filter": "", "search": "", "scrollPos": 0 };
@ -197,7 +197,7 @@ function appRoute() {
var btnsLen = btns.length; var btnsLen = btns.length;
for (var i = 0; i < btnsLen; i++) { for (var i = 0; i < btnsLen; i++) {
btns[i].classList.remove('active'); btns[i].classList.remove('active');
if (btns[i].innerText == app.current.filter) { if (btns[i].getAttribute('data-tag') == app.current.filter) {
btns[i].classList.add('active'); btns[i].classList.add('active');
document.getElementById('searchqueuetagdesc').innerText = btns[i].innerText; document.getElementById('searchqueuetagdesc').innerText = btns[i].innerText;
} }
@ -266,7 +266,7 @@ function appRoute() {
} }
if (app.current.search.length >= 2) { if (app.current.search.length >= 2) {
sendAPI({"cmd": "MPD_API_DATABASE_SEARCH", "data": { "mpdtag": app.current.filter, "offset": app.current.page, "searchstr": app.current.search}}, parseSearch); sendAPI({"cmd": "MPD_API_DATABASE_SEARCH", "data": { "plist": "", "offset": app.current.page, "filter": app.current.filter, "searchstr": app.current.search}}, parseSearch);
} else { } else {
document.getElementById('SearchList').getElementsByTagName('tbody')[0].innerHTML = ''; document.getElementById('SearchList').getElementsByTagName('tbody')[0].innerHTML = '';
document.getElementById('searchAddAllSongs').setAttribute('disabled', 'disabled'); document.getElementById('searchAddAllSongs').setAttribute('disabled', 'disabled');
@ -280,7 +280,7 @@ function appRoute() {
var btnsLen = btns.length; var btnsLen = btns.length;
for (var i = 0; i < btnsLen; i++) { for (var i = 0; i < btnsLen; i++) {
btns[i].classList.remove('active'); btns[i].classList.remove('active');
if (btns[i].innerText == app.current.filter) { if (btns[i].getAttribute('data-tag') == app.current.filter) {
btns[i].classList.add('active'); btns[i].classList.add('active');
document.getElementById('searchtagsdesc').innerText = btns[i].innerText; document.getElementById('searchtagsdesc').innerText = btns[i].innerText;
} }
@ -486,7 +486,7 @@ function appInit() {
document.getElementById('searchtags').addEventListener('click', function(event) { document.getElementById('searchtags').addEventListener('click', function(event) {
if (event.target.nodeName == 'BUTTON') if (event.target.nodeName == 'BUTTON')
appGoto(app.current.app, app.current.tab, app.current.view, '0/' + event.target.innerText + '/' + app.current.search); appGoto(app.current.app, app.current.tab, app.current.view, '0/' + event.target.getAttribute('data-tag') + '/' + app.current.search);
}, false); }, false);
document.getElementById('searchqueuestr').addEventListener('keyup', function(event) { document.getElementById('searchqueuestr').addEventListener('keyup', function(event) {
@ -495,7 +495,7 @@ function appInit() {
document.getElementById('searchqueuetag').addEventListener('click', function (event) { document.getElementById('searchqueuetag').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.innerText + '/' + app.current.search); appGoto(app.current.app, app.current.tab, app.current.view, app.current.page + '/' + event.target.getAttribute('data-tag') + '/' + app.current.search);
}, false); }, false);
document.getElementById('search').addEventListener('submit', function () { document.getElementById('search').addEventListener('submit', function () {
@ -980,7 +980,7 @@ function parseState(obj) {
function getQueue() { function getQueue() {
if (app.current.search.length >= 2) if (app.current.search.length >= 2)
sendAPI({"cmd": "MPD_API_QUEUE_SEARCH", "data": {"mpdtag": app.current.filter, "offset": app.current.page, "searchstr": app.current.search}}, parseQueue); sendAPI({"cmd": "MPD_API_QUEUE_SEARCH", "data": {"filter": app.current.filter, "offset": app.current.page, "searchstr": app.current.search}}, parseQueue);
else { else {
sendAPI({"cmd": "MPD_API_QUEUE_LIST", "data": {"offset": app.current.page}}, parseQueue); sendAPI({"cmd": "MPD_API_QUEUE_LIST", "data": {"offset": app.current.page}}, parseQueue);
} }
@ -1890,18 +1890,14 @@ function addAllFromBrowse() {
function addAllFromSearch() { function addAllFromSearch() {
if (app.current.search.length >= 2) { if (app.current.search.length >= 2) {
sendAPI({"cmd": "MPD_API_DATABASE_SEARCH_ADD_QUEUE", "data":{"filter": app.current.filter, "searchstr": app.current.search}}); sendAPI({"cmd": "MPD_API_DATABASE_SEARCH", "data": {"plist": "queue", "filter": app.current.filter, "searchstr": app.current.search, "offset": 0}});
showNotification('Added '+ parseInt(document.getElementById('panel-heading-search').innerText) +' songs from search', '', '', 'success'); showNotification('Added '+ parseInt(document.getElementById('panel-heading-search').innerText) +' songs from search', '', '', 'success');
} }
} }
function addAllFromSearchPlist(plist) { function addAllFromSearchPlist(plist) {
if (app.current.search.length >= 2) { if (app.current.search.length >= 2) {
var filter = app.current.filter; sendAPI({"cmd": "MPD_API_DATABASE_SEARCH", "data": {"plist": plist, "filter": app.current.filter, "searchstr": app.current.search, "offset": 0}});
if (filter == 'Any Tag')
filter = 'any';
sendAPI({"cmd": "MPD_API_DATABASE_SEARCH_ADD_PLAYLIST", "data":{"plist": plist, "filter": filter, "searchstr": app.current.search}});
showNotification('Added '+ parseInt(document.getElementById('panel-heading-search').innerText) +' songs from search to ' + plist, '', '', 'success'); showNotification('Added '+ parseInt(document.getElementById('panel-heading-search').innerText) +' songs from search to ' + plist, '', '', 'success');
} }
} }

View File

@ -431,38 +431,17 @@ void callback_mympd(struct mg_connection *nc, const struct mg_str msg) {
} }
break; break;
case MPD_API_QUEUE_SEARCH: case MPD_API_QUEUE_SEARCH:
je = json_scanf(msg.p, msg.len, "{data: {offset:%u, mpdtag:%Q, searchstr:%Q}}", &uint_buf1, &p_charbuf1, &p_charbuf2); je = json_scanf(msg.p, msg.len, "{data: {offset:%u, filter:%Q, searchstr:%Q}}", &uint_buf1, &p_charbuf1, &p_charbuf2);
if (je == 3) { if (je == 3) {
n = mympd_search_queue(mpd.buf, p_charbuf1, uint_buf1, p_charbuf2); n = mympd_search_queue(mpd.buf, p_charbuf1, uint_buf1, p_charbuf2);
free(p_charbuf1); free(p_charbuf1);
free(p_charbuf2); free(p_charbuf2);
} }
break; break;
case MPD_API_DATABASE_SEARCH_ADD_QUEUE:
je = json_scanf(msg.p, msg.len, "{data: {filter:%Q, searchstr:%Q}}", &p_charbuf1, &p_charbuf2);
if (je == 2) {
n = mympd_search_add(mpd.buf, p_charbuf1, p_charbuf2);
free(p_charbuf1);
free(p_charbuf2);
if (n == 0)
n = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}");
}
break;
case MPD_API_DATABASE_SEARCH_ADD_PLAYLIST:
je = json_scanf(msg.p, msg.len, "{data: {plist:%Q, filter:%Q, searchstr:%Q}}", &p_charbuf1, &p_charbuf2, &p_charbuf3);
if (je == 3) {
n = mympd_search_add_plist(p_charbuf1, p_charbuf2, p_charbuf3);
free(p_charbuf1);
free(p_charbuf2);
free(p_charbuf3);
if (n == 0)
n = snprintf(mpd.buf, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}");
}
break;
case MPD_API_DATABASE_SEARCH: case MPD_API_DATABASE_SEARCH:
je = json_scanf(msg.p, msg.len, "{data: {offset:%u, mpdtag:%Q, searchstr:%Q}}", &uint_buf1, &p_charbuf1, &p_charbuf2); je = json_scanf(msg.p, msg.len, "{data: {searchstr:%Q, filter:%Q, plist:%Q, offset:%u}}", &p_charbuf1, &p_charbuf2, &p_charbuf3, &uint_buf1);
if (je == 3) { if (je == 4) {
n = mympd_search(mpd.buf, p_charbuf1, uint_buf1, p_charbuf2); n = mympd_search(mpd.buf, p_charbuf1, p_charbuf2, p_charbuf3, uint_buf1);
free(p_charbuf1); free(p_charbuf1);
free(p_charbuf2); free(p_charbuf2);
} }
@ -1503,31 +1482,29 @@ int mympd_put_playlist_list(char *buffer, char *uri, unsigned int offset, char *
return len; return len;
} }
int mympd_search(char *buffer, char *mpdtagtype, unsigned int offset, char *searchstr) { int mympd_search(char *buffer, char *searchstr, char *filter, char *plist, unsigned int offset) {
struct mpd_song *song; struct mpd_song *song;
unsigned long entity_count = 0; unsigned long entity_count = 0;
unsigned long entities_returned = 0; unsigned long entities_returned = 0;
int len; int len;
struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE);
if (mpd_search_db_songs(mpd.conn, false) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_db_songs");
if (mpd_tag_name_parse(mpdtagtype) != MPD_TAG_UNKNOWN) { if (strcmp(plist, "") == 0) {
if (mpd_search_add_tag_constraint(mpd.conn, MPD_OPERATOR_DEFAULT, mpd_tag_name_parse(mpdtagtype), searchstr) == false) if (mpd_send_command(mpd.conn, "search", filter, searchstr, NULL) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_add_tag_constraint"); RETURN_ERROR_AND_RECOVER("mpd_search");
len = json_printf(&out, "{type: search, data: [");
}
else if (strcmp(plist, "queue") == 0) {
if (mpd_send_command(mpd.conn, "searchadd", filter, searchstr, NULL) == false)
RETURN_ERROR_AND_RECOVER("mpd_searchadd");
} }
else { else {
if (mpd_search_add_any_tag_constraint(mpd.conn, MPD_OPERATOR_DEFAULT, searchstr) == false) if (mpd_send_command(mpd.conn, "searchaddpl", plist, filter, searchstr, NULL) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_add_any_tag_constraint"); RETURN_ERROR_AND_RECOVER("mpd_searchaddpl");
} }
if (mpd_search_commit(mpd.conn) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_commit");
else {
len = json_printf(&out, "{type: search, data: [");
while((song = mpd_recv_song(mpd.conn)) != NULL) { if (strcmp(plist, "") == 0) {
while ((song = mpd_recv_song(mpd.conn)) != NULL) {
entity_count ++; entity_count ++;
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) { if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
if (entities_returned ++) if (entities_returned ++)
@ -1543,59 +1520,20 @@ int mympd_search(char *buffer, char *mpdtagtype, unsigned int offset, char *sear
} }
mpd_song_free(song); mpd_song_free(song);
} }
}
else
mpd_response_finish(mpd.conn);
len += json_printf(&out, "], totalEntities: %d, offset: %d, returnedEntities: %d, mpdtagtype: %Q}", if (strcmp(plist, "") == 0) {
len += json_printf(&out, "], totalEntities: %d, offset: %d, returnedEntities: %d, searchstr: %Q}",
entity_count, entity_count,
offset, offset,
entities_returned, entities_returned,
mpdtagtype searchstr
); );
} }
else
if (len > MAX_SIZE) len = json_printf(&out, "{type: result, data: ok}");
printf("Buffer truncated\n");
return len;
}
int mympd_search_add(char *buffer, char *mpdtagtype, char *searchstr) {
int len = 0;
struct mpd_song *song;
struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE);
if (mpd_search_add_db_songs(mpd.conn, false) == false) {
RETURN_ERROR_AND_RECOVER("mpd_search_add_db_songs");
}
if (mpd_tag_name_parse(mpdtagtype) != MPD_TAG_UNKNOWN) {
if (mpd_search_add_tag_constraint(mpd.conn, MPD_OPERATOR_DEFAULT, mpd_tag_name_parse(mpdtagtype), searchstr) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_add_tag_constraint");
}
else {
if (mpd_search_add_any_tag_constraint(mpd.conn, MPD_OPERATOR_DEFAULT, searchstr) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_add_any_tag_constraint");
}
if (mpd_search_commit(mpd.conn) == false)
RETURN_ERROR_AND_RECOVER("mpd_search_commit");
while((song = mpd_recv_song(mpd.conn)) != NULL) {
mpd_song_free(song);
}
if (len > MAX_SIZE)
printf("Buffer truncated\n");
return len;
}
int mympd_search_add_plist(char *plist, char *mpdtagtype, char *searchstr) {
int len = 0;
struct mpd_pair *pair;
mpd_send_command(mpd.conn, "searchaddpl", plist, mpdtagtype, searchstr, NULL);
while ((pair = mpd_recv_pair(mpd.conn)) != NULL) {
mpd_return_pair(mpd.conn, pair);
}
if (len > MAX_SIZE) if (len > MAX_SIZE)
printf("Buffer truncated\n"); printf("Buffer truncated\n");
@ -1657,20 +1595,20 @@ int mympd_search_queue(char *buffer, char *mpdtagtype, unsigned int offset, char
len = json_printf(&out, "{type: queuesearch, data: ["); len = json_printf(&out, "{type: queuesearch, data: [");
while((song = mpd_recv_song(mpd.conn)) != NULL) { while((song = mpd_recv_song(mpd.conn)) != NULL) {
entity_count ++; entity_count ++;
if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) { if (entity_count > offset && entity_count <= offset + MAX_ELEMENTS_PER_PAGE) {
if (entities_returned ++) if (entities_returned ++)
len += json_printf(&out, ", "); len += json_printf(&out, ", ");
len += json_printf(&out, "{type: song, id: %d, pos: %d, album: %Q, artist: %Q, duration: %d, title: %Q}", len += json_printf(&out, "{type: song, id: %d, pos: %d, album: %Q, artist: %Q, duration: %d, title: %Q}",
mpd_song_get_id(song), mpd_song_get_id(song),
mpd_song_get_pos(song), mpd_song_get_pos(song),
mympd_get_tag(song, MPD_TAG_ALBUM), mympd_get_tag(song, MPD_TAG_ALBUM),
mympd_get_tag(song, MPD_TAG_ARTIST), mympd_get_tag(song, MPD_TAG_ARTIST),
mpd_song_get_duration(song), mpd_song_get_duration(song),
mympd_get_tag(song, MPD_TAG_TITLE) mympd_get_tag(song, MPD_TAG_TITLE)
); );
mpd_song_free(song); mpd_song_free(song);
} }
} }
len += json_printf(&out, "], totalEntities: %d, offset: %d, returnedEntities: %d, mpdtagtype: %Q}", len += json_printf(&out, "], totalEntities: %d, offset: %d, returnedEntities: %d, mpdtagtype: %Q}",

View File

@ -72,8 +72,6 @@
X(MPD_API_PLAYLIST_RM_TRACK) \ X(MPD_API_PLAYLIST_RM_TRACK) \
X(MPD_API_PLAYLIST_LIST) \ X(MPD_API_PLAYLIST_LIST) \
X(MPD_API_PLAYLIST_CONTENT_LIST) \ X(MPD_API_PLAYLIST_CONTENT_LIST) \
X(MPD_API_DATABASE_SEARCH_ADD_PLAYLIST) \
X(MPD_API_DATABASE_SEARCH_ADD_QUEUE) \
X(MPD_API_DATABASE_SEARCH) \ X(MPD_API_DATABASE_SEARCH) \
X(MPD_API_DATABASE_UPDATE) \ X(MPD_API_DATABASE_UPDATE) \
X(MPD_API_DATABASE_FILESYSTEM_LIST) \ X(MPD_API_DATABASE_FILESYSTEM_LIST) \
@ -177,9 +175,7 @@ int mympd_put_outputs(char *buffer);
int mympd_put_current_song(char *buffer); int mympd_put_current_song(char *buffer);
int mympd_put_queue(char *buffer, unsigned int offset, unsigned *queue_version, unsigned *queue_length); int mympd_put_queue(char *buffer, unsigned int offset, unsigned *queue_version, unsigned *queue_length);
int mympd_put_browse(char *buffer, char *path, unsigned int offset, char *filter); int mympd_put_browse(char *buffer, char *path, unsigned int offset, char *filter);
int mympd_search(char *buffer, char *mpdtagtype, unsigned int offset, char *searchstr); int mympd_search(char *buffer, char *searchstr, char *filter, char *plist, unsigned int offset);
int mympd_search_add(char *buffer, char *mpdtagtype, char *searchstr);
int mympd_search_add_plist(char *plist, char *mpdtagtype, char *searchstr);
int mympd_search_queue(char *buffer, char *mpdtagtype, unsigned int offset, char *searchstr); int mympd_search_queue(char *buffer, char *mpdtagtype, unsigned int offset, char *searchstr);
int mympd_put_welcome(char *buffer); int mympd_put_welcome(char *buffer);
int mympd_put_stats(char *buffer); int mympd_put_stats(char *buffer);