308 lines
10 KiB
C++
308 lines
10 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Copyright 2013 - 2020, nymea GmbH
|
|
* Contact: contact@nymea.io
|
|
*
|
|
* This file is part of nymea.
|
|
* This project including source code and documentation is protected by
|
|
* copyright law, and remains the property of nymea GmbH. All rights, including
|
|
* reproduction, publication, editing and translation, are reserved. The use of
|
|
* this project is subject to the terms of a license agreement to be concluded
|
|
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
|
|
* under https://nymea.io/license
|
|
*
|
|
* GNU Lesser General Public License Usage
|
|
* Alternatively, this project may be redistributed and/or modified under the
|
|
* terms of the GNU Lesser General Public License as published by the Free
|
|
* Software Foundation; version 3. This project is distributed in the hope that
|
|
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this project. If not, see <https://www.gnu.org/licenses/>.
|
|
*
|
|
* For any further details and any questions please contact us under
|
|
* contact@nymea.io or see our FAQ/Licensing Information on
|
|
* https://nymea.io/license/faq
|
|
*
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
#ifndef SONOS_H
|
|
#define SONOS_H
|
|
|
|
#include <QObject>
|
|
#include <QTimer>
|
|
|
|
#include "network/networkaccessmanager.h"
|
|
#include "integrations/thing.h"
|
|
|
|
class Sonos : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
enum RepeatMode {
|
|
RepeatModeOne,
|
|
RepeatModeAll,
|
|
RepeatModeNone
|
|
};
|
|
|
|
enum PlayBackState {
|
|
PlayBackStateBuffering,
|
|
PlayBackStateIdle,
|
|
PlayBackStatePause,
|
|
PlayBackStatePlaying
|
|
};
|
|
|
|
struct PlayMode {
|
|
bool repeat;
|
|
bool repeatOne;
|
|
bool shuffle;
|
|
bool crossfade;
|
|
};
|
|
|
|
/* Represents a Sonos household.*/
|
|
struct GroupObject {
|
|
QString CoordinatorId; //Player acting as the group coordinator for the group
|
|
QString groupId; //The ID of the group.
|
|
QString playbackState; //The playback state corresponding to the group.
|
|
QList<QByteArray> playerIds; //The IDs of the primary players in the group.
|
|
QString displayName; //The display name for the group, such as “Living Room” or “Kitchen + 2”.
|
|
};
|
|
|
|
struct VolumeObject {
|
|
int volume; //Group volume as an integer between 0 and 100, inclusive.
|
|
bool muted; //A value indicating whether or not the group is muted
|
|
bool fixed; //A value indicating whether or not the group volume is fixed or changeable.
|
|
};
|
|
|
|
/*
|
|
* The music service identifier or a pseudo-service identifier in the case of local library. */
|
|
struct ServiceObject
|
|
{
|
|
QString id;
|
|
QString name;
|
|
QString imageUrl;
|
|
};
|
|
|
|
/*
|
|
* 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 FavoriteObject {
|
|
QString id;
|
|
QString name;
|
|
QString description;
|
|
QString imageUrl;
|
|
ServiceObject service;
|
|
};
|
|
|
|
struct PlaylistObject
|
|
{
|
|
QString id;
|
|
QString name;
|
|
QString type;
|
|
QString trackCount;
|
|
};
|
|
|
|
struct PlayerSettingsObject
|
|
{
|
|
QString volumeMode;
|
|
double volumeScalingFactor;
|
|
bool monoMode;
|
|
bool wifiDisabled;
|
|
};
|
|
|
|
|
|
/* The music object identifier for the item in a music service.
|
|
* This identifies the content within a music service, the music service,
|
|
* and the account associated with the content. */
|
|
struct MusicObjectId {
|
|
QString serviceId;
|
|
QString objectId;
|
|
QString accountId;
|
|
};
|
|
|
|
struct TrackPoliciesObject {
|
|
bool canCrossfade;
|
|
bool canResume;
|
|
bool canSeek;
|
|
bool canSkip;
|
|
bool canSkipBack;
|
|
bool canSkipToItem;
|
|
bool isVisible;
|
|
};
|
|
|
|
/* The artist of the track. */
|
|
struct ArtistObject
|
|
{
|
|
QString name;
|
|
QString imageUrl;
|
|
MusicObjectId id;
|
|
// tags enum
|
|
};
|
|
|
|
struct AlbumObject
|
|
{
|
|
QString name;
|
|
ArtistObject artist;
|
|
};
|
|
|
|
struct ContainerObject
|
|
{
|
|
QString name;
|
|
QString type;
|
|
MusicObjectId id;
|
|
ServiceObject service;
|
|
QString imageUrl;
|
|
//tags enum
|
|
};
|
|
|
|
struct PlayBackObject {
|
|
QString itemId;
|
|
bool isDucking;
|
|
PlayBackState playbackState;
|
|
PlayMode playMode;
|
|
uint positionMillis;
|
|
QString previousItemId;
|
|
uint previousPositionMillis;
|
|
QString queueVersion;
|
|
};
|
|
|
|
/*
|
|
* A single music track or audio file. Tracks are identified by type,
|
|
* which determines the key values for the object types included.
|
|
* The following fields are shared by all types of tracks. */
|
|
struct TrackObject {
|
|
QString type;
|
|
QString name;
|
|
QString imageUrl;
|
|
int trackNumber;
|
|
bool canCrossfade;
|
|
bool canSkip;
|
|
int durationMillis;
|
|
ArtistObject artist;
|
|
AlbumObject album;
|
|
ServiceObject service;
|
|
};
|
|
|
|
/* An item in a queue. Used for cloud queue tracks and radio stations that have track-like data
|
|
* for the currently playing content. For example, the currentItem and nextItem parameters in the
|
|
* metadataStatus event are item object types.*/
|
|
struct ItemObject {
|
|
QString itemId;
|
|
TrackObject track;
|
|
bool deleted;
|
|
TrackPoliciesObject policies;
|
|
};
|
|
|
|
struct MetadataStatus {
|
|
ContainerObject container;
|
|
ItemObject currentItem;
|
|
ItemObject nextItem;
|
|
};
|
|
|
|
struct PlaylistTrackObject {
|
|
QString name;
|
|
QString artist;
|
|
QString album;
|
|
};
|
|
|
|
struct PlaylistSummaryObject {
|
|
QString id;
|
|
QString name;
|
|
QString type;
|
|
QList<PlaylistTrackObject> tracks;
|
|
};
|
|
|
|
explicit Sonos(NetworkAccessManager *networkManager, const QByteArray &clientId, const QByteArray &clientSecret, QObject *parent = nullptr);
|
|
|
|
QUrl getLoginUrl(const QUrl &redirectUrl);
|
|
QByteArray accessToken();
|
|
QByteArray refreshToken();
|
|
void getAccessTokenFromRefreshToken(const QByteArray &refreshToken);
|
|
void getAccessTokenFromAuthorizationCode(const QByteArray &authorizationCode);
|
|
|
|
void getHouseholds();
|
|
QUuid getFavorites(const QString &householdId);
|
|
void getGroups(const QString &householdId);
|
|
|
|
QUuid loadFavorite(const QString &groupId, const QString &faveriteId);
|
|
|
|
//Group volume
|
|
void getGroupVolume(const QString &groupId); //Get the volume and mute state of a group.
|
|
//Group volume actions
|
|
QUuid setGroupVolume(const QString &groupId, int volume); //Set group volume to a specific level and unmute the group if muted.
|
|
QUuid setGroupMute(const QString &groupId, bool mute); //Mute and unmute the group.
|
|
QUuid setGroupRelativeVolume(const QString &groupId, int volumeDelta); //Increase or decrease group volume.
|
|
|
|
//group playback
|
|
void getGroupPlaybackStatus(const QString &groupId);
|
|
|
|
//Group playback actions
|
|
QUuid groupLoadLineIn(const QString &groupId);
|
|
QUuid groupPlay(const QString &groupId);
|
|
QUuid groupPause(const QString &groupId);
|
|
QUuid groupSeek(const QString &groupId, int possitionMillis);
|
|
QUuid groupSeekRelative(const QString &groupId, int deltaMillis);
|
|
QUuid groupSetPlayModes(const QString &groupId, PlayMode playMode);
|
|
QUuid groupSetShuffle(const QString &groupId, bool shuffle);
|
|
QUuid groupSetRepeat(const QString &groupId, RepeatMode repeatMode);
|
|
QUuid groupSetCrossfade(const QString &groupId, bool crossfade);
|
|
QUuid groupSkipToNextTrack(const QString &groupId);
|
|
QUuid groupSkipToPreviousTrack(const QString &groupId);
|
|
QUuid groupTogglePlayPause(const QString &groupId);
|
|
|
|
//playbackMetadata
|
|
void getGroupMetadataStatus(const QString &groupId);
|
|
|
|
// playerVolume
|
|
void getPlayerVolume(const QByteArray &playerId);
|
|
QUuid setPlayerVolume(const QByteArray &playerId, int volume);
|
|
QUuid setPlayerRelativeVolume(const QByteArray &playerId, int volumeDelta);
|
|
QUuid setPlayerMute(const QByteArray &playerId, bool mute);
|
|
|
|
//Playlists API namespace
|
|
void getPlaylists(const QString &householdId);
|
|
void getPlaylist(const QString &householdId, const QString &playlistId);
|
|
QUuid loadPlaylist(const QString &groupId, const QString &playlistId);
|
|
|
|
//Settings
|
|
void getPlayerSettings(const QString &playerId);
|
|
QUuid setPlayerSettings(const QString &playerId, PlayerSettingsObject settings);
|
|
|
|
private:
|
|
QByteArray m_baseAuthorizationUrl = "https://api.sonos.com/login/v3/oauth/access";
|
|
QByteArray m_baseControlUrl = "https://api.ws.sonos.com/control/api/v1";
|
|
QByteArray m_clientKey;
|
|
QByteArray m_clientSecret;
|
|
|
|
QByteArray m_accessToken;
|
|
QByteArray m_refreshToken;
|
|
QByteArray m_redirectUri;
|
|
|
|
NetworkAccessManager *m_networkManager = nullptr;
|
|
QTimer *m_tokenRefreshTimer = nullptr;
|
|
private slots:
|
|
void onRefreshTimeout();
|
|
|
|
signals:
|
|
void connectionChanged(bool connected);
|
|
void authenticationStatusChanged(bool authenticated);
|
|
|
|
void householdIdsReceived(QList<QString> householdIds);
|
|
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);
|
|
|
|
void playBackStatusReceived(const QString &groupId, PlayBackObject playBack);
|
|
void metadataStatusReceived(const QString &groupId, MetadataStatus metaDataStatus);
|
|
void volumeReceived(const QString &groupId, VolumeObject groupVolume);
|
|
|
|
void playerVolumeReceived(const QString &playerId, VolumeObject playerVolume);
|
|
void playerSettingsRecieved(const QString &playerId, PlayerSettingsObject playerSettings);
|
|
void actionExecuted(QUuid actionId, bool success);
|
|
};
|
|
#endif // SONOS_H
|