diff --git a/sonos/devicepluginsonos.cpp b/sonos/devicepluginsonos.cpp index fb2bbd21..9c617e17 100644 --- a/sonos/devicepluginsonos.cpp +++ b/sonos/devicepluginsonos.cpp @@ -81,6 +81,11 @@ void DevicePluginSonos::setupDevice(DeviceSetupInfo *info) QByteArray refreshToken = pluginStorage()->value("refresh_token").toByteArray(); pluginStorage()->endGroup(); + if (refreshToken.isEmpty()) { + info->finish(Device::DeviceErrorAuthenticationFailure); + return; + } + sonos = new Sonos(hardwareManager()->networkManager(), "0a8f6d44-d9d1-4474-bcfa-cfb41f8b66e8", "3095ce48-0c5d-47ce-a1f4-6005c7b8fdb5", this); connect(sonos, &Sonos::connectionChanged, this, &DevicePluginSonos::onConnectionChanged); connect(sonos, &Sonos::householdIdsReceived, this, &DevicePluginSonos::onHouseholdIdsReceived); @@ -345,14 +350,14 @@ void DevicePluginSonos::browseDevice(BrowseResult *result) QString householdId = result->device()->paramValue(sonosGroupDeviceHouseholdIdParamTypeId).toString(); if (result->itemId().isEmpty()){ BrowserItem item; - item.setId("favorites"); + item.setId("/favorites"); item.setIcon(BrowserItem::BrowserIconFavorites); item.setExecutable(false); item.setBrowsable(true); item.setDisplayName("Favorites"); result->addItem(item); result->finish(Device::DeviceErrorNoError); - } else if (result->itemId() == "favorites") { + } else if (result->itemId() == "/favorites") { sonosConnection->getFavorites(householdId); m_pendingBrowseResult.insert(householdId, result); connect(result, &BrowseResult::aborted,[householdId, this](){m_pendingBrowseResult.remove(householdId);}); @@ -364,7 +369,18 @@ void DevicePluginSonos::browseDevice(BrowseResult *result) void DevicePluginSonos::browserItem(BrowserItemResult *result) { - Q_UNUSED(result) + Device *parentDevice = myDevices().findById(result->device()->parentId()); + Sonos *sonosConnection = m_sonosConnections.value(parentDevice); + if (!sonosConnection) + return; + + qCDebug(dcSonos()) << "Browser Item" << result->itemId(); + QString householdId = result->device()->paramValue(sonosGroupDeviceHouseholdIdParamTypeId).toString(); + if (result->itemId().startsWith("/favorites")) { + sonosConnection->getFavorites(householdId); + m_pendingBrowserItemResult.insert(householdId, result); + connect(result, &BrowserItemResult::aborted,[householdId, this](){m_pendingBrowserItemResult.remove(householdId);}); + } } void DevicePluginSonos::executeBrowserItem(BrowserActionInfo *info) @@ -375,9 +391,12 @@ void DevicePluginSonos::executeBrowserItem(BrowserActionInfo *info) return; QString groupId = info->device()->paramValue(sonosGroupDeviceGroupIdParamTypeId).toString(); - QUuid requestId = sonosConnection->loadFavorite(groupId, info->browserAction().itemId()); - m_pendingBrowserExecution.insert(requestId, info); - connect(info, &BrowserActionInfo::aborted,[requestId, this](){m_pendingBrowserExecution.remove(requestId);}); + if (info->browserAction().itemId().startsWith("/favorites")) { + QString favoriteId = info->browserAction().itemId().remove("/favorite/"); + QUuid requestId = sonosConnection->loadFavorite(groupId, favoriteId); + m_pendingBrowserExecution.insert(requestId, info); + connect(info, &BrowserActionInfo::aborted,[requestId, this](){m_pendingBrowserExecution.remove(requestId);}); + } } void DevicePluginSonos::onConnectionChanged(bool connected) @@ -428,11 +447,11 @@ void DevicePluginSonos::onFavouritesReceived(const QString &householdId, QListitemId() + "/" + favourite.id); item.setExecutable(true); item.setBrowsable(false); if (!favourite.imageUrl.isEmpty()) { - item.setThumbnail(favourite.imageUrl); + item.setThumbnail(favourite.imageUrl); } else { item.setIcon(BrowserItem::BrowserIconFavorites); } @@ -442,8 +461,30 @@ void DevicePluginSonos::onFavouritesReceived(const QString &householdId, QListfinish(Device::DeviceErrorNoError); - } else { - qDebug(dcSonos()) << "Received unhandled favourites list"; + } + + if (m_pendingBrowserItemResult.contains(householdId)) { + BrowserItemResult *result = m_pendingBrowserItemResult.take(householdId); + if (!result) + return; + QString favoriteId = result->itemId().remove("/favorites/"); + + foreach(Sonos::FavouriteObject favourite, favourites) { + if (favourite.id == favoriteId) { + MediaBrowserItem item; + item.setId(result->itemId()); + item.setExecutable(true); + item.setBrowsable(false); + if (!favourite.imageUrl.isEmpty()) { + item.setThumbnail(favourite.imageUrl); + } else { + item.setIcon(BrowserItem::BrowserIconFavorites); + } + item.setDisplayName(favourite.name); + item.setDescription(favourite.description); + result->finish(item); + } + } } } diff --git a/sonos/devicepluginsonos.h b/sonos/devicepluginsonos.h index 9e0c76fa..b8923478 100644 --- a/sonos/devicepluginsonos.h +++ b/sonos/devicepluginsonos.h @@ -66,6 +66,7 @@ private: QHash > m_pendingActions; QHash m_pendingBrowseResult; + QHash m_pendingBrowserItemResult; QHash m_pendingBrowserExecution; diff --git a/sonos/devicepluginsonos.json b/sonos/devicepluginsonos.json index ed5534e4..c357fd9c 100644 --- a/sonos/devicepluginsonos.json +++ b/sonos/devicepluginsonos.json @@ -24,8 +24,9 @@ "name": "connected", "displayName": "Connected", "displayNameEvent": "Connected changed", - "defaultValue": true, - "type": "bool" + "defaultValue": false, + "type": "bool", + "cached": false }, { "id": "48b5c1bf-7df0-45d0-9ba3-290fc3acddc3",