pianod2
multisource multiuser scriptable networked music player
pandoramessages.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <string>
14 #include <memory>
15 
16 #include <parsnip/parsnip.h>
17 
18 #include "musictypes.h"
19 #include "pandoratypes.h"
20 #include "pandorastation.h"
21 #include "pandoraparameters.h"
22 
23 namespace Pandora {
24  class Communication;
25  class Song;
26  class Artist;
27  class Station;
28 
29  enum class RequestOption { NONE = 0, DEBUG = 1, TLS = 2, UNENCRYPTED = 4 };
30  static inline constexpr RequestOption operator& (const RequestOption a, const RequestOption b) {
31  return RequestOption (int (a) & int (b));
32  }
33  static inline constexpr RequestOption operator| (const RequestOption a, const RequestOption b) {
34  return RequestOption (int (a) | int (b));
35  }
36 
39  class Request {
40  public:
42  protected:
43  Source * const source;
45 
46  private:
48  const std::string endpoint;
49 
50  protected:
51  Request (Source * const src, const char *ep, Option options = Option::NONE);
52 
53  public:
54  inline const std::string &url() const { return endpoint; };
55  inline bool debug () const { return (flags & Option::DEBUG) == Option::DEBUG; };
56  inline bool tlsEncrypt () const { return (flags & Option::TLS) == Option::TLS; };
57  inline bool blowfishEncrypt () const { return (flags & Option::UNENCRYPTED) != Option::UNENCRYPTED; };
58 
60 
64  virtual void extractResponse (const Parsnip::Data &message) = 0;
65 
66  };
67 
69  class RequestWithNoData : public Request {
70  protected:
71  RequestWithNoData (Source * const src, const char *ep, Option flags = Option::NONE);
72  };
73 
75  class Notification : public Request {
76  protected:
77  Notification (const char *ep, Option flags = Option::NONE);
78  virtual void extractResponse (const Parsnip::Data &message) override;
79  };
80 
83  using MixIdList = std::vector<std::string>;
85  std::string checksum;
89 
90  public:
91  RequestStationList (Source * const src);
92  virtual void extractResponse (const Parsnip::Data &message) override;
93  inline const StationList &getStations() const {
94  return stations;
95  }
97  return quickmix;
98  }
100  return everything;
101  }
102  inline MixIdList getMixStationList() const {
103  return mix_stations;
104  }
105  inline std::string getChecksum() const {
106  return checksum;
107  }
108  };
109 
112  std::string checksum;
113 
114  public:
115  static constexpr bool GenreStations = true;
116  RequestStationListChecksum(bool genre_stations = false);
117  virtual void extractResponse (const Parsnip::Data &message) override;
118  inline std::string getChecksum() const {
119  return checksum;
120  }
121  };
122 
125  std::unique_ptr<PlaylistList> stations;
126 
127  public:
128  RequestGenreStationList (Source * const src);
129  virtual void extractResponse (const Parsnip::Data &message) override;
130  inline const PlaylistList &getStations() const {
131  assert (stations);
132  return *stations;
133  }
134  };
135 
139 
140  public:
143  };
144 
146  class RequestCreateStation : public Request {
148 
149  public:
150  RequestCreateStation (Source * const src, MusicThingie::Type type, const std::string &music_id);
151  virtual void extractResponse (const Parsnip::Data &message) override;
152  inline Station *getStation () const {
153  assert (new_station);
154  return new_station.get();
155  }
156  };
157 
160  public:
161  RequestRemoveStation (Station *station);
162  };
163 
167  public:
169  virtual void extractResponse (const Parsnip::Data &message) override;
170  };
171 
173  class RequestRenameStation : public Request {
175  public:
176  RequestRenameStation (Station *sta, const std::string &name);
177  virtual void extractResponse (const Parsnip::Data &message) override;
178  };
179 
182  protected:
190 
191  public:
193  virtual void extractResponse (const Parsnip::Data &message) override;
194 
196  return std::move (song_seeds);
197  }
199  return std::move (artist_seeds);
200  }
202  return std::move (genre_seeds);
203  }
205  return std::move (negative_feedback);
206  }
208  return std::move (positive_feedback);
209  }
210  };
211 
215  std::string seed_id;
219  public:
220  RequestAddStationSeed (Station *sta, const std::string &music_id);
221  virtual void extractResponse (const Parsnip::Data &message) override;
222  inline const std::string &getSeedId () const {
223  assert (!seed_id.empty());
224  return seed_id;
225  }
226  inline GenreSeed *getGenreSeed () const {
227  assert (genre_seed);
228  return genre_seed.get();
229  }
230  inline ArtistSeed *getArtistSeed () const {
231  assert (artist_seed);
232  return artist_seed.get();
233  }
234  inline SongSeed *getSongSeed () const {
235  assert (song_seed);
236  return song_seed.get();
237  }
238  };
239 
242  public:
243  RequestRemoveStationSeed (Station *station, const std::string &seed_id);
244  };
245 
246 
249  public:
250  RequestAddTiredSong (Source * const , const std::string &track_token);
251  };
252 
254  class RequestAddFeedback : public Request {
257 
258  public:
259  RequestAddFeedback (Station *sta, const std::string &track_token, bool positive);
260  virtual void extractResponse (const Parsnip::Data &message) override;
261  inline SongRating *const getFeedback() const {
262  assert (feedback);
263  return feedback.get();
264  }
265  };
266 
269  public:
270  RequestDeleteFeedback (Station *station, const std::string &feedback_id);
271  };
272 
274  class RequestQueueTracks : public Request {
276  std::unique_ptr<SongList> results;
277  public:
279  virtual void extractResponse (const Parsnip::Data &message) override;
280  inline const SongList &getResponse() {
281  assert (results);
282  return *results;
283  }
284  };
285 
286  // Pandora message: Search request.
287  class SearchRequest : public Request {
289 
290  public:
291  SearchRequest (Source * const src, const std::string &query, const bool exact);
292  virtual void extractResponse (const Parsnip::Data &message) override;
293  inline const ThingieList &getResponse() {
294  return results;
295  }
296  };
297 
298 
299  // Pandora message: retrieve advertisements.
300  class RetrieveAdvert : public Request {
303  public:
304  RetrieveAdvert (Station *sta, const std::string &ad_token);
305  virtual void extractResponse (const Parsnip::Data &message) override;
306  inline Advert *getAdvert() {
307  return advert.get();
308  }
309  };
310 
311  // Pandora message: Advert playing
313  public:
314  AdvertPlayedNotification (PianodPlaylist *station, const std::vector<std::string> &ad_tokens);
315  };
316 } // namespace Pandora
Type
Definition: musictypes.h:86
Definition: pandoratypes.h:112
Definition: pandoramessages.h:312
AdvertPlayedNotification(PianodPlaylist *station, const std::vector< std::string > &ad_tokens)
Definition: pandoramessages.cpp:422
A artist contructed from station seed information.
Definition: pandoratypes.h:150
A class for Pandora genre seeds.
Definition: pandoratypes.h:164
Pandora request class. A request whose response is empty/unimportant.
Definition: pandoramessages.h:75
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:47
Notification(const char *ep, Option flags=Option::NONE)
Definition: pandoramessages.cpp:45
Pandora message: Provide feedback for a song that has played on a station.
Definition: pandoramessages.h:254
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:306
Retainer< SongRating * > feedback
Definition: pandoramessages.h:256
RequestAddFeedback(Station *sta, const std::string &track_token, bool positive)
Definition: pandoramessages.cpp:295
Retainer< Station * > station
Definition: pandoramessages.h:255
SongRating *const getFeedback() const
Definition: pandoramessages.h:261
Pandora message: Add or remove station seeds.
Definition: pandoramessages.h:213
RequestAddStationSeed(Station *sta, const std::string &music_id)
Definition: pandoramessages.cpp:251
Retainer< SongSeed * > song_seed
Definition: pandoramessages.h:218
std::string seed_id
Definition: pandoramessages.h:215
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:262
Retainer< Station * > station
Definition: pandoramessages.h:214
const std::string & getSeedId() const
Definition: pandoramessages.h:222
Retainer< GenreSeed * > genre_seed
Definition: pandoramessages.h:216
GenreSeed * getGenreSeed() const
Definition: pandoramessages.h:226
SongSeed * getSongSeed() const
Definition: pandoramessages.h:234
Retainer< ArtistSeed * > artist_seed
Definition: pandoramessages.h:217
ArtistSeed * getArtistSeed() const
Definition: pandoramessages.h:230
Pandora message: Provide feedback for a song on a station.
Definition: pandoramessages.h:248
RequestAddTiredSong(Source *const, const std::string &track_token)
Definition: pandoramessages.cpp:286
Pandora message: create a station.
Definition: pandoramessages.h:146
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:139
Station * getStation() const
Definition: pandoramessages.h:152
Retainer< Station * > new_station
Definition: pandoramessages.h:147
RequestCreateStation(Source *const src, MusicThingie::Type type, const std::string &music_id)
Definition: pandoramessages.cpp:129
Pandora message: Remove feedback for a song on a station.
Definition: pandoramessages.h:268
RequestDeleteFeedback(Station *station, const std::string &feedback_id)
Definition: pandoramessages.cpp:314
Pandora message: Retrieve station list.
Definition: pandoramessages.h:124
RequestGenreStationList(Source *const src)
Definition: pandoramessages.cpp:92
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:95
std::unique_ptr< PlaylistList > stations
Definition: pandoramessages.h:125
const PlaylistList & getStations() const
Definition: pandoramessages.h:130
Pandora request class.
Definition: pandoramessages.h:39
const std::string endpoint
Definition: pandoramessages.h:48
Parsnip::Data request_message
Definition: pandoramessages.h:44
bool debug() const
Definition: pandoramessages.h:55
virtual void extractResponse(const Parsnip::Data &message)=0
Decode a response message, already converted to Parsnip Data, into some internal representation.
Request(Source *const src, const char *ep, Option options=Option::NONE)
RPC method name or REST API endpoint.
Definition: pandoramessages.cpp:24
Parsnip::Data & retrieveRequestMessage()
Retrieve the Parsnip Data object with the request message.
Definition: pandoramessages.cpp:29
Option flags
Definition: pandoramessages.h:47
Source *const source
Definition: pandoramessages.h:43
bool tlsEncrypt() const
Definition: pandoramessages.h:56
const std::string & url() const
Definition: pandoramessages.h:54
bool blowfishEncrypt() const
Definition: pandoramessages.h:57
Pandora message: Retrieve list of music to play from a station.
Definition: pandoramessages.h:274
const SongList & getResponse()
Definition: pandoramessages.h:280
RequestQueueTracks(Station *sta)
Definition: pandoramessages.cpp:323
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:334
std::unique_ptr< SongList > results
Definition: pandoramessages.h:276
Retainer< Station * > station
Definition: pandoramessages.h:275
Pandora message: delete a station.
Definition: pandoramessages.h:159
RequestRemoveStation(Station *station)
Definition: pandoramessages.cpp:147
Pandora message: Add or remove station seeds.
Definition: pandoramessages.h:241
RequestRemoveStationSeed(Station *station, const std::string &seed_id)
Definition: pandoramessages.cpp:277
Pandora message: rename a station.
Definition: pandoramessages.h:173
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:183
RequestRenameStation(Station *sta, const std::string &name)
Definition: pandoramessages.cpp:173
Retainer< Station * > station
Definition: pandoramessages.h:174
Pandora message: Retrieve station seeds.
Definition: pandoramessages.h:181
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:215
RetainedList< SongRating * > positive_feedback
Definition: pandoramessages.h:187
RequestStationDetails(Station *sta)
Definition: pandoramessages.cpp:191
RetainedList< SongRating * > extractFeedback(const Parsnip::Data &list)
Definition: pandoramessages.cpp:202
RetainedList< SongSeed * > getSongSeeds()
Definition: pandoramessages.h:195
RetainedList< SongRating * > positiveFeedback()
Definition: pandoramessages.h:207
Retainer< Station * > station
Definition: pandoramessages.h:183
RetainedList< GenreSeed * > getGenreSeeds()
Definition: pandoramessages.h:201
RetainedList< SongRating * > negative_feedback
Definition: pandoramessages.h:188
RetainedList< ArtistSeed * > artist_seeds
Definition: pandoramessages.h:185
RetainedList< GenreSeed * > genre_seeds
Definition: pandoramessages.h:186
RetainedList< ArtistSeed * > getArtistSeeds()
Definition: pandoramessages.h:198
RetainedList< SongSeed * > song_seeds
Definition: pandoramessages.h:184
RetainedList< SongRating * > negativeFeedback()
Definition: pandoramessages.h:204
Pandora message: Retrieve station list.
Definition: pandoramessages.h:111
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:84
RequestStationListChecksum(bool genre_stations=false)
Definition: pandoramessages.cpp:80
std::string checksum
Definition: pandoramessages.h:112
static constexpr bool GenreStations
Definition: pandoramessages.h:115
std::string getChecksum() const
Definition: pandoramessages.h:118
Pandora message: Retrieve station list.
Definition: pandoramessages.h:82
std::string checksum
Definition: pandoramessages.h:85
std::vector< std::string > MixIdList
Definition: pandoramessages.h:83
MixIdList getMixStationList() const
Definition: pandoramessages.h:102
const StationList & getStations() const
Definition: pandoramessages.h:93
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:57
StationList stations
Definition: pandoramessages.h:84
std::string getChecksum() const
Definition: pandoramessages.h:105
Retainer< Station * > getEverythingStation() const
Definition: pandoramessages.h:99
Retainer< Station * > quickmix
Definition: pandoramessages.h:86
MixIdList mix_stations
Definition: pandoramessages.h:88
Retainer< Station * > getQuickMix() const
Definition: pandoramessages.h:96
Retainer< Station * > everything
Definition: pandoramessages.h:87
RequestStationList(Source *const src)
Definition: pandoramessages.cpp:55
Pandora message: transform a shared station into a personal station.
Definition: pandoramessages.h:165
Retainer< Station * > station
Definition: pandoramessages.h:166
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:165
RequestTransformStation(Station *sta)
Definition: pandoramessages.cpp:157
Pandora request class. A request whose response is empty/unimportant.
Definition: pandoramessages.h:69
RequestWithNoData(Source *const src, const char *ep, Option flags=Option::NONE)
Definition: pandoramessages.cpp:37
Definition: pandoramessages.h:300
Advert * getAdvert()
Definition: pandoramessages.h:306
Retainer< Station * > station
Definition: pandoramessages.h:301
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:415
Retainer< Advert * > advert
Definition: pandoramessages.h:302
RetrieveAdvert(Station *sta, const std::string &ad_token)
Definition: pandoramessages.cpp:403
Definition: pandoramessages.h:287
ThingieList results
Definition: pandoramessages.h:288
SearchRequest(Source *const src, const std::string &query, const bool exact)
Definition: pandoramessages.cpp:358
const ThingieList & getResponse()
Definition: pandoramessages.h:293
virtual void extractResponse(const Parsnip::Data &message) override
Decode a response message, already converted to Parsnip Data, into some internal representation.
Definition: pandoramessages.cpp:369
Pandora message: set quickmix stations.
Definition: pandoramessages.h:137
SetQuickMixStations(const StationList &mix_stations)
Request shuffle station list and shuffle station info.
Definition: pandoramessages.cpp:117
PlaylistList mix_stations
Definition: pandoramessages.h:138
A song that contains rating information.
Definition: pandoratypes.h:89
A song contructed from station seed information.
Definition: pandoratypes.h:100
Definition: pandora.h:44
Definition: pandorastation.h:77
Generic data type.
Definition: parsnip.h:81
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
A container for lists of playlists.
Definition: retainedlist.h:324
Smart containers to help manage reference counting the MusicThingies.
Definition: retainer.h:13
A container for holding songs.
Definition: retainedlist.h:328
Base class for storing lists of thingies, which need to be reference counted accurately.
Definition: retainedlist.h:20
Playlist / Artist / Album / Song data types.
const char * Song
Definition: musickeys.cpp:69
const char * Artist
Definition: musickeys.cpp:67
Pandora source, player and related datatype specializations.
Definition: pandora.h:32
RequestOption
Definition: pandoramessages.h:29
static constexpr RequestOption operator|(const RequestOption a, const RequestOption b)
Definition: pandoramessages.h:33
static constexpr RequestOption operator&(const RequestOption a, const RequestOption b)
Definition: pandoramessages.h:30
Pandora connection parameters.
Pandora Playlist (station) support.
Pandora communication library.
Parsnip serialization.