From 0a388cd0124654f25f3dc6384fd186676aaa4a75 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Mon, 21 Oct 2019 08:28:27 +0200 Subject: [PATCH] fixed browsing item to request ID association --- sonos/devicepluginsonos.cpp | 84 +++++++++++++++++++++---------------- sonos/devicepluginsonos.h | 7 ++-- sonos/sonos.cpp | 25 ++++++----- sonos/sonos.h | 10 ++--- 4 files changed, 72 insertions(+), 54 deletions(-) diff --git a/sonos/devicepluginsonos.cpp b/sonos/devicepluginsonos.cpp index 9c617e17..04b08355 100644 --- a/sonos/devicepluginsonos.cpp +++ b/sonos/devicepluginsonos.cpp @@ -1,4 +1,4 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2019 Bernhard Trinnes getAccessTokenFromRefreshToken(refreshToken); m_sonosConnections.insert(device, sonos); return info->finish(Device::DeviceErrorNoError); @@ -343,24 +343,26 @@ void DevicePluginSonos::browseDevice(BrowseResult *result) { Device *parentDevice = myDevices().findById(result->device()->parentId()); Sonos *sonosConnection = m_sonosConnections.value(parentDevice); - if (!sonosConnection) + if (!sonosConnection) { + result->finish(Device::DeviceErrorHardwareNotAvailable); return; + } qDebug(dcSonos()) << "Browse Device" << result->itemId(); QString householdId = result->device()->paramValue(sonosGroupDeviceHouseholdIdParamTypeId).toString(); if (result->itemId().isEmpty()){ BrowserItem item; - item.setId("/favorites"); + item.setId(m_browseFavoritesPrefix); 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") { - sonosConnection->getFavorites(householdId); - m_pendingBrowseResult.insert(householdId, result); - connect(result, &BrowseResult::aborted,[householdId, this](){m_pendingBrowseResult.remove(householdId);}); + } else if (result->itemId() == m_browseFavoritesPrefix) { + QUuid requestId = sonosConnection->getFavorites(householdId); + m_pendingBrowseResult.insert(requestId, result); + connect(result, &BrowseResult::aborted,[requestId, this](){m_pendingBrowseResult.remove(requestId);}); } else { //TODO add media browsing result->finish(Device::DeviceErrorItemNotFound); @@ -371,15 +373,20 @@ void DevicePluginSonos::browserItem(BrowserItemResult *result) { Device *parentDevice = myDevices().findById(result->device()->parentId()); Sonos *sonosConnection = m_sonosConnections.value(parentDevice); - if (!sonosConnection) + if (!sonosConnection) { + result->finish(Device::DeviceErrorHardwareNotAvailable); 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);}); + if (result->itemId().startsWith(m_browseFavoritesPrefix)) { + QUuid requestId = sonosConnection->getFavorites(householdId); + m_pendingBrowserItemResult.insert(requestId, result); + connect(result, &BrowserItemResult::aborted, [requestId, this](){m_pendingBrowserItemResult.remove(requestId);}); + } else { + //TODO add media browsing + result->finish(Device::DeviceErrorItemNotFound); } } @@ -391,11 +398,15 @@ void DevicePluginSonos::executeBrowserItem(BrowserActionInfo *info) return; QString groupId = info->device()->paramValue(sonosGroupDeviceGroupIdParamTypeId).toString(); - if (info->browserAction().itemId().startsWith("/favorites")) { - QString favoriteId = info->browserAction().itemId().remove("/favorite/"); + if (info->browserAction().itemId().startsWith(m_browseFavoritesPrefix)) { + QString favoriteId = info->browserAction().itemId().remove(m_browseFavoritesPrefix); + favoriteId.remove('/'); QUuid requestId = sonosConnection->loadFavorite(groupId, favoriteId); m_pendingBrowserExecution.insert(requestId, info); connect(info, &BrowserActionInfo::aborted,[requestId, this](){m_pendingBrowserExecution.remove(requestId);}); + } else { + //TODO add media browsing + info->finish(Device::DeviceErrorItemNotFound); } } @@ -438,51 +449,54 @@ void DevicePluginSonos::onHouseholdIdsReceived(QList householdIds) } } -void DevicePluginSonos::onFavouritesReceived(const QString &householdId, QList favourites) +void DevicePluginSonos::onFavoritesReceived(QUuid requestId, const QString &householdId, QList favorites) { - if (m_pendingBrowseResult.contains(householdId)) { - BrowseResult *result = m_pendingBrowseResult.take(householdId); + Q_UNUSED(householdId) + + if (m_pendingBrowseResult.contains(requestId)) { + BrowseResult *result = m_pendingBrowseResult.take(requestId); if (!result) return; - foreach(Sonos::FavouriteObject favourite, favourites) { + foreach(Sonos::FavoriteObject favorite, favorites) { MediaBrowserItem item; - item.setId(result->itemId() + "/" + favourite.id); + item.setId(result->itemId() + "/" + favorite.id); item.setExecutable(true); item.setBrowsable(false); - if (!favourite.imageUrl.isEmpty()) { - item.setThumbnail(favourite.imageUrl); + if (!favorite.imageUrl.isEmpty()) { + item.setThumbnail(favorite.imageUrl); } else { item.setIcon(BrowserItem::BrowserIconFavorites); } - item.setDisplayName(favourite.name); - item.setDescription(favourite.description); + item.setDisplayName(favorite.name); + item.setDescription(favorite.description); result->addItem(item); - qDebug(dcSonos()) << "Favourite: " << favourite.name << favourite.description; + qDebug(dcSonos()) << "Favorite: " << favorite.name << favorite.description; } result->finish(Device::DeviceErrorNoError); - } - if (m_pendingBrowserItemResult.contains(householdId)) { - BrowserItemResult *result = m_pendingBrowserItemResult.take(householdId); + } else if (m_pendingBrowserItemResult.contains(requestId)) { + BrowserItemResult *result = m_pendingBrowserItemResult.take(requestId); if (!result) return; - QString favoriteId = result->itemId().remove("/favorites/"); + QString favoriteId = result->itemId().remove(m_browseFavoritesPrefix); + favoriteId.remove('/'); - foreach(Sonos::FavouriteObject favourite, favourites) { - if (favourite.id == favoriteId) { + foreach(Sonos::FavoriteObject favorite, favorites) { + if (favorite.id == favoriteId) { MediaBrowserItem item; item.setId(result->itemId()); item.setExecutable(true); item.setBrowsable(false); - if (!favourite.imageUrl.isEmpty()) { - item.setThumbnail(favourite.imageUrl); + if (!favorite.imageUrl.isEmpty()) { + item.setThumbnail(favorite.imageUrl); } else { item.setIcon(BrowserItem::BrowserIconFavorites); } - item.setDisplayName(favourite.name); - item.setDescription(favourite.description); + item.setDisplayName(favorite.name); + item.setDescription(favorite.description); result->finish(item); + return; } } } diff --git a/sonos/devicepluginsonos.h b/sonos/devicepluginsonos.h index b8923478..a23cf3f7 100644 --- a/sonos/devicepluginsonos.h +++ b/sonos/devicepluginsonos.h @@ -65,17 +65,18 @@ private: QByteArray m_sonosConnectionRefreshToken; QHash > m_pendingActions; - QHash m_pendingBrowseResult; - QHash m_pendingBrowserItemResult; + QHash m_pendingBrowseResult; + QHash m_pendingBrowserItemResult; QHash m_pendingBrowserExecution; + const QString m_browseFavoritesPrefix = "/favorites"; private slots: void onConnectionChanged(bool connected); void onAuthenticationStatusChanged(bool authenticated); void onHouseholdIdsReceived(QList householdIds); - void onFavouritesReceived(const QString &householdId, QList favourites); + void onFavoritesReceived(QUuid requestId, const QString &householdId, QList favorites); void onPlaylistsReceived(const QString &householdId, QList playlists); void onPlaylistSummaryReceived(const QString &householdId, Sonos::PlaylistSummaryObject playlistSummary); diff --git a/sonos/sonos.cpp b/sonos/sonos.cpp index e533fe41..30f9a857 100644 --- a/sonos/sonos.cpp +++ b/sonos/sonos.cpp @@ -158,15 +158,17 @@ QUuid Sonos::loadFavorite(const QString &groupId, const QString &favouriteId) return actionId; } -void Sonos::getFavorites(const QString &householdId) +QUuid Sonos::getFavorites(const QString &householdId) { QNetworkRequest request; request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json"); request.setRawHeader("Authorization", "Bearer " + m_accessToken); request.setRawHeader("X-Sonos-Api-Key", m_clientKey); request.setUrl(QUrl(m_baseControlUrl + "/households/" + householdId + "/favorites")); + QUuid requestId = QUuid::createUuid(); + QNetworkReply *reply = m_networkManager->get(request); - connect(reply, &QNetworkReply::finished, this, [reply, householdId, this] { + connect(reply, &QNetworkReply::finished, this, [reply, requestId, householdId, this] { reply->deleteLater(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); @@ -195,20 +197,21 @@ void Sonos::getFavorites(const QString &householdId) return; QVariantList array = data.toVariant().toMap().value("items").toList(); - //qDebug(dcSonos()) << "Favourites received:" << data.toJson(); + //qDebug(dcSonos()) << "Favorites received:" << data.toJson(); - QList favourites; + QList favorites; foreach (const QVariant &variant, array) { QVariantMap itemObject = variant.toMap(); - FavouriteObject favourite; - favourite.id = itemObject["id"].toString(); - favourite.name = itemObject["name"].toString(); - favourite.description = itemObject["description"].toString(); - favourite.imageUrl = itemObject["imageUrl"].toString(); - favourites.append(favourite); + FavoriteObject favorite; + favorite.id = itemObject["id"].toString(); + favorite.name = itemObject["name"].toString(); + favorite.description = itemObject["description"].toString(); + favorite.imageUrl = itemObject["imageUrl"].toString(); + favorites.append(favorite); } - emit favouritesReceived(householdId, favourites); + emit favoritesReceived(requestId, householdId, favorites); }); + return requestId; } diff --git a/sonos/sonos.h b/sonos/sonos.h index 8d6d7cc7..cb21b678 100644 --- a/sonos/sonos.h +++ b/sonos/sonos.h @@ -81,7 +81,7 @@ public: /* * Describes a Sonos favorite in the household. * You can see favorites in the My Sonos tab in the app. The following are not considered */ - struct FavouriteObject { + struct FavoriteObject { QString id; QString name; QString description; @@ -216,10 +216,10 @@ public: void getAccessTokenFromAuthorizationCode(const QByteArray &authorizationCode); void getHouseholds(); - void getFavorites(const QString &householdId); + QUuid getFavorites(const QString &householdId); void getGroups(const QString &householdId); - QUuid loadFavorite(const QString &groupId, const QString &favouriteId); + QUuid loadFavorite(const QString &groupId, const QString &faveriteId); //Group volume void getGroupVolume(const QString &groupId); //Get the volume and mute state of a group. @@ -283,7 +283,7 @@ signals: void authenticationStatusChanged(bool authenticated); void householdIdsReceived(QList householdIds); - void favouritesReceived(const QString &householdId, QList favourites); + void favoritesReceived(QUuid requestId, const QString &householdId, QList favorites); void playlistsReceived(const QString &householdId, QList playlists); void groupsReceived(const QString &householdId, QList groups); void playlistSummaryReceived(const QString &householdId, PlaylistSummaryObject playlistSummary); @@ -294,6 +294,6 @@ signals: void playerVolumeReceived(const QString &playerId, VolumeObject playerVolume); void playerSettingsRecieved(const QString &playerId, PlayerSettingsObject playerSettings); - void actionExecuted(QUuid actionId,bool success); + void actionExecuted(QUuid actionId, bool success); }; #endif // SONOS_H