--- a/upmpd/ohplaylist.cxx
+++ b/upmpd/ohplaylist.cxx
@@ -119,15 +119,18 @@
// The data format for id lists is an array of msb 32 bits ints
// encoded in base64...
-static string translateIdArray(const vector<unsigned int>& in)
+static string translateIdArray(const vector<UpSong>& in)
{
string out1;
string sdeb;
- for (auto val : in) {
- out1 += (unsigned char) ((val & 0xff000000) >> 24);
- out1 += (unsigned char) ((val & 0x00ff0000) >> 16);
- out1 += (unsigned char) ((val & 0x0000ff00) >> 8);
- out1 += (unsigned char) ((val & 0x000000ff));
+ for (auto us : in) {
+ unsigned int val = us.mpdid;
+ if (val) {
+ out1 += (unsigned char) ((val & 0xff000000) >> 24);
+ out1 += (unsigned char) ((val & 0x00ff0000) >> 16);
+ out1 += (unsigned char) ((val & 0x0000ff00) >> 8);
+ out1 += (unsigned char) ((val & 0x000000ff));
+ }
//sdeb += SoapArgs::i2s(val) + " ";
}
//LOGDEB("OHPlaylist: current ids: " << sdeb << endl);
@@ -136,20 +139,27 @@
string OHPlaylist::makeIdArray()
{
string out;
- vector<unsigned int> vids;
- // Retrieve the ids for current queue songs from mpd, and translate format
- bool ok = m_dev->m_mpdcli->getQueueIds(vids);
- if (ok) {
- out = translateIdArray(vids);
- }
-
- // Clear metadata cache: entries not in vids are not valid any more
- // We just build a new cache for data about current entries
+
+ // Retrieve the data for current queue songs from mpd, and make an
+ // ohPlaylist id array.
+ vector<UpSong> vdata;
+ bool ok = m_dev->m_mpdcli->getQueueData(vdata);
+ if (ok) {
+ out = translateIdArray(vdata);
+ }
+
+ // Update metadata cache: entries not in the curren id list are
+ // not valid any more. Also there may be entries which were added
+ // through an MPD client and which don't know about, record the
+ // metadata for these. We don't update the current array, but
+ // just build a new cache for data about current entries
unordered_map<int, string> nmeta;
- for (auto& id : vids) {
- auto inold = m_metacache.find(id);
+ for (auto& usong : vdata) {
+ auto inold = m_metacache.find(usong.mpdid);
if (inold != m_metacache.end())
- nmeta[id].swap(inold->second);
+ nmeta[usong.mpdid].swap(inold->second);
+ else
+ nmeta[usong.mpdid] = didlmake(usong);
}
m_metacache = nmeta;