From 6dce9a2ad6560627f03b3f85e3c92d1bc28fab58 Mon Sep 17 00:00:00 2001 From: nymea Date: Tue, 8 Oct 2019 10:06:50 +0200 Subject: [PATCH] TuneIn browsing does now work --- denon/heos.cpp | 7 ++++++- denon/heostypes.h | 1 + denon/integrationplugindenon.cpp | 28 +++++++++++++++++----------- denon/integrationplugindenon.h | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/denon/heos.cpp b/denon/heos.cpp index 81ff604d..2d15c817 100644 --- a/denon/heos.cpp +++ b/denon/heos.cpp @@ -790,11 +790,16 @@ void Heos::readData() MediaObject media; qDebug(dcDenon()) << "Media Item" << payloadEntryVariant.toMap().value("mid").toString() << payloadEntryVariant.toMap().value("cid").toString(); media.name = payloadEntryVariant.toMap().value("name").toString(); - media.containerId = payloadEntryVariant.toMap().value("cid").toString(); + if (payloadEntryVariant.toMap().contains("cid")) { + media.containerId = payloadEntryVariant.toMap().value("cid").toString(); + } else { + media.containerId = message.queryItemValue("cid"); + } media.mediaId = payloadEntryVariant.toMap().value("mid").toString(); media.imageUrl = payloadEntryVariant.toMap().value("image_url").toString(); media.isPlayable = payloadEntryVariant.toMap().value("playable").toString().contains("yes"); media.isContainer = payloadEntryVariant.toMap().value("container").toString().contains("yes"); + media.sourceId = sourceId; if (type == "artist") { media.mediaType = MEDIA_TYPE_ARTIST; } else if (type == "song") { diff --git a/denon/heostypes.h b/denon/heostypes.h index 379b723b..c3ea663c 100644 --- a/denon/heostypes.h +++ b/denon/heostypes.h @@ -179,6 +179,7 @@ struct MediaObject { QString name; QString imageUrl; QString containerId; + QString sourceId; QString mediaId; }; diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index ae021b70..28edb08e 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -829,6 +829,7 @@ void IntegrationPluginDenon::onHeosBrowseRequestReceived(QListaddItem(item); } foreach(MusicSourceObject source, musicSources) { @@ -904,23 +905,27 @@ void IntegrationPluginDenon::browseDevice(BrowseResult *result) qDebug(dcDenon()) << "Browse source"; heos->getMusicSources(); m_pendingGetSourcesRequest.insert(heos, result); - //connect(result, &QObject::destroyed, this, [this, result->itemId()](){ m_pendingBrowseResult.remove(result->itemId());}); + connect(result, &QObject::destroyed, this, [this, heos](){m_pendingGetSourcesRequest.remove(heos);}); + } else if (result->itemId().startsWith("source=")){ qDebug(dcDenon()) << "Browse source" << result->itemId(); QString id = result->itemId().remove("source="); heos->browseSource(id); m_pendingBrowseResult.insert(id, result); //connect(result, &QObject::destroyed, this, [this, result->itemId()](){ m_pendingBrowseResult.remove(result->itemId());}); + } else if (result->itemId().startsWith("container=")){ qDebug(dcDenon()) << "Browse container" << result->itemId(); QStringList values = result->itemId().split("&"); if (values.length() == 2) { QString id = values[0].remove("container="); heos->browseSourceContainers(values[1], id); + // URL encoding is needed because some container ids are a URL and their encoding varies. if (QUrl(id).isValid()) { id = QUrl::fromPercentEncoding(id.toUtf8()); } m_pendingBrowseResult.insert(id, result); + connect(result, &QObject::destroyed, this, [this, id](){ m_pendingBrowseResult.remove(id);}); } } } @@ -943,20 +948,21 @@ void IntegrationPluginDenon::executeBrowserItem(BrowserActionInfo *info) info->finish(Device::DeviceErrorHardwareNotAvailable); return; } - /* BrowserAction action = info->browserAction(); + BrowserAction action = info->browserAction(); int playerId = info->device()->paramValue(heosPlayerDevicePlayerIdParamTypeId).toInt(); - if (action.itemId()) { - heos->playUrl(playerId, action.itemId()); + qDebug(dcDenon()) << "Execute browse item called. Player Id:" << playerId << "Item ID" << action.itemId(); + + if (m_mediaObjects.contains(action.itemId())) { + MediaObject media = m_mediaObjects.value(action.itemId()); + if (media.mediaType == MEDIA_TYPE_CONTAINER) { + heos->addContainerToQueue(playerId, media.sourceId, media.containerId, ADD_CRITERIA_PLAY_NOW); + } else if (media.mediaType == MEDIA_TYPE_STATION) { + heos->playStation(playerId, media.sourceId, media.containerId, media.mediaId, media.name); + } } else { - heos->playPresetStation(playerId, presetNumber); + qWarning(dcDenon()) << "Media item not found" << action.itemId(); } - heos->playInputSource(playerId, inputName); -*/ - - - - qDebug(dcDenon()) << "Execute browse item called"; info->finish(Device::DeviceErrorNoError); return; } diff --git a/denon/integrationplugindenon.h b/denon/integrationplugindenon.h index 05572aaf..628d1cf1 100644 --- a/denon/integrationplugindenon.h +++ b/denon/integrationplugindenon.h @@ -89,6 +89,7 @@ private: QHash m_pendingBrowseResult; // QString = containerId or sourceId QHash m_pendingBrowserActions; QHash m_pendingBrowserItemActions; + QHash m_mediaObjects; private slots: void onPluginTimer();