fixed browsing item to request ID association
parent
ac3ce25b6b
commit
0a388cd012
|
|
@ -1,4 +1,4 @@
|
|||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2019 Bernhard Trinnes <bernhard.trinnes@nymea.io *
|
||||
* *
|
||||
|
|
@ -95,7 +95,7 @@ void DevicePluginSonos::setupDevice(DeviceSetupInfo *info)
|
|||
connect(sonos, &Sonos::volumeReceived, this, &DevicePluginSonos::onVolumeReceived);
|
||||
connect(sonos, &Sonos::actionExecuted, this, &DevicePluginSonos::onActionExecuted);
|
||||
connect(sonos, &Sonos::authenticationStatusChanged, this, &DevicePluginSonos::onAuthenticationStatusChanged);
|
||||
connect(sonos, &Sonos::favouritesReceived, this, &DevicePluginSonos::onFavouritesReceived);
|
||||
connect(sonos, &Sonos::favoritesReceived, this, &DevicePluginSonos::onFavoritesReceived);
|
||||
sonos->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<QString> householdIds)
|
|||
}
|
||||
}
|
||||
|
||||
void DevicePluginSonos::onFavouritesReceived(const QString &householdId, QList<Sonos::FavouriteObject> favourites)
|
||||
void DevicePluginSonos::onFavoritesReceived(QUuid requestId, const QString &householdId, QList<Sonos::FavoriteObject> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,17 +65,18 @@ private:
|
|||
QByteArray m_sonosConnectionRefreshToken;
|
||||
|
||||
QHash<QUuid, QPointer<DeviceActionInfo> > m_pendingActions;
|
||||
QHash<QString, BrowseResult *> m_pendingBrowseResult;
|
||||
QHash<QString, BrowserItemResult *> m_pendingBrowserItemResult;
|
||||
QHash<QUuid, BrowseResult *> m_pendingBrowseResult;
|
||||
QHash<QUuid, BrowserItemResult *> m_pendingBrowserItemResult;
|
||||
QHash<QUuid, BrowserActionInfo *> m_pendingBrowserExecution;
|
||||
|
||||
const QString m_browseFavoritesPrefix = "/favorites";
|
||||
|
||||
private slots:
|
||||
void onConnectionChanged(bool connected);
|
||||
void onAuthenticationStatusChanged(bool authenticated);
|
||||
|
||||
void onHouseholdIdsReceived(QList<QString> householdIds);
|
||||
void onFavouritesReceived(const QString &householdId, QList<Sonos::FavouriteObject> favourites);
|
||||
void onFavoritesReceived(QUuid requestId, const QString &householdId, QList<Sonos::FavoriteObject> favorites);
|
||||
void onPlaylistsReceived(const QString &householdId, QList<Sonos::PlaylistObject> playlists);
|
||||
void onPlaylistSummaryReceived(const QString &householdId, Sonos::PlaylistSummaryObject playlistSummary);
|
||||
|
||||
|
|
|
|||
|
|
@ -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<FavouriteObject> favourites;
|
||||
QList<FavoriteObject> 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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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<QString> householdIds);
|
||||
void favouritesReceived(const QString &householdId, QList<FavouriteObject> favourites);
|
||||
void favoritesReceived(QUuid requestId, const QString &householdId, QList<FavoriteObject> favorites);
|
||||
void playlistsReceived(const QString &householdId, QList<PlaylistObject> playlists);
|
||||
void groupsReceived(const QString &householdId, QList<GroupObject> 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
|
||||
|
|
|
|||
Loading…
Reference in New Issue