pianod2
multisource multiuser scriptable networked music player
pandora.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <ctime>
14 
15 #include <string>
16 #include <unordered_map>
17 #include <functional>
18 
19 #include "fundamentals.h"
20 #include "musictypes.h"
21 #include "musiccache.h"
22 #include "mediaplayer.h"
23 #include "mediaunit.h"
24 #include "mediaparameters.h"
25 
26 #include "pandoratypes.h"
27 #include "pandoraparameters.h"
28 #include "pandorastation.h"
29 #include "pandoracomm.h"
30 
32 namespace Pandora {
33  class Source;
34 
35  class Library : public PersistentPool {
36  public:
38  inline Source *pandora() {
39  return reinterpret_cast <Source *> (source);
40  }
41  virtual MusicThingie *reconstruct (MusicThingie::Type type, const Parsnip::Data &data) override;
42  };
43 
44  class Source : public Media::Source {
45  using SearchResults = std::unordered_map<std::string, ThingieList>;
46  private:
47  // Member variables
50  std::string station_list_checksum;
57  std::unique_ptr<Parsnip::Data> recovery;
58 
59  public:
62  SkipTracker skips{60, 86400};
63 
64  inline const ConnectionParameters *connectionParams() const {
65  return static_cast<const ConnectionParameters *> (parameters);
66  }
67  Source (const ConnectionParameters &params);
68  ~Source();
70 
71  // Identity
72  virtual const char *kind (void) const override;
73 
74  // Capabilities
75  virtual bool requireNameForCreatePlaylist (void) const override;
76 
77  // General source stuff
78  virtual bool flush (void) override;
79  virtual float periodic (void) override;
80 
81  // Playlist methods
82  virtual PlaylistList getPlaylists (const Filter &filter = Filter::All) override;
83  virtual PianodPlaylist *getMixPlaylist (void) override;
84  virtual PianodPlaylist *getEverythingPlaylist (void) override;
85  virtual Media::Player *getPlayer (const AudioSettings &audio, PianodSong *song) override;
86 
87  virtual MusicThingie *getAnythingById (const Media::SplitId &id) override;
88  virtual ThingieList getSuggestions (const Filter &filter, SearchRange where) override;
89 
90  // Creating stations
91  virtual PianodPlaylist *createPlaylist (const char *name, MusicThingie::Type type, MusicThingie *from) override;
92 
93  // Miscellaneous
94  virtual SongList getRandomSongs (PianodPlaylist *playlist, const UserList &, Media::SelectionMethod) override;
95 
96  // Typecasts
97  virtual MusicThingie *getSuggestion (MusicThingie *thing, MusicThingie::Type type, SearchRange where) override;
98 
99  // Functions for use within Pandora library.
100  Station *getStationByStationId (const std::string &station_id);
101  void removeStationByStationId (const std::string &station_id);
102  inline Status executeRequest (Request &request) {
103  return comm.execute (request);
104  }
105  inline const UserFeatures &userFeatures() const {
106  return comm.getFeatures();
107  }
108 
109  private:
110  // Internal functions
112  void updateGenreStations ();
114  void pushMixToServers (bool mix_all = false);
115  inline void setMixAllOnServers() {
116  pushMixToServers (true);
117  }
118  bool restore ();
119  bool persist () const;
120  };
121 } // namespace Pandora
Track data filter.
Definition: filter.h:38
static const Filter All
Selects all tracks.
Definition: filter.h:220
Base class for playing audio from some source.
Definition: mediaplayer.h:46
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
const std::string & name(void) const
Get the name of this source.
Definition: mediasource.cpp:38
const SourceParameters * parameters
Configuration details for this source, provided on source creation.
Definition: mediaunit.h:83
void alert(RESPONSE_CODE message) const
Send an alert notification regarding this source.
Definition: mediasource.cpp:82
Mechanism to split MusicThingie IDs into source identifier, type and inner ID.
Definition: mediaunit.h:195
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
Pandora communication class.
Definition: pandoracomm.h:73
Status execute(Request &request, bool retry_if_auth_required=true)
Execute an HTTP request.
Definition: pandoracomm.cpp:309
const UserFeatures & getFeatures() const
Definition: pandoracomm.h:122
Definition: pandora.h:35
Source * pandora()
Definition: pandora.h:38
virtual MusicThingie * reconstruct(MusicThingie::Type type, const Parsnip::Data &data) override
Reconstructs a cached record.
Definition: pandoralibrary.cpp:19
Pandora request class.
Definition: pandoramessages.h:39
A class to manage Pandora skips.
Definition: pandorastation.h:33
Definition: pandora.h:44
SearchResults prior_searches
Search results saved for reuse;.
Definition: pandora.h:61
Retainer< Station * > everything_playlist
The everything meta-playlist.
Definition: pandora.h:55
std::string genre_stations_checksum
Checksum from last genre station list received.
Definition: pandora.h:52
bool persist() const
Definition: pandorasource.cpp:476
std::string station_list_checksum
Checksum from last station list received.
Definition: pandora.h:50
time_t station_list_expiration
When cached station list expires.
Definition: pandora.h:49
void updateGenreStations()
Get initial or refresh genre station list.
Definition: pandorasource.cpp:364
virtual PianodPlaylist * getMixPlaylist(void) override
Retrieve the mix playlist.
Definition: pandorastation.cpp:168
PlaylistList genre_stations
The genre stations.
Definition: pandora.h:53
Retainer< Station * > mix_playlist
The mix/shuffle meta-playlist.
Definition: pandora.h:54
virtual const char * kind(void) const override
A unique string identifying the type of source.
Definition: pandorasource.cpp:83
bool updateStationList(PianodPlaylist::PlaylistType mixSetting=PianodPlaylist::SINGLE)
Get initial or refresh station list.
Definition: pandorasource.cpp:277
Communication comm
Pandora server communicator.
Definition: pandora.h:56
virtual Media::Player * getPlayer(const AudioSettings &audio, PianodSong *song) override
Definition: pandoraplayer.cpp:25
Status executeRequest(Request &request)
Definition: pandora.h:102
virtual bool flush(void) override
Persist data for a source.
Definition: pandorasource.cpp:499
virtual MusicThingie * getSuggestion(MusicThingie *thing, MusicThingie::Type type, SearchRange where) override
Retrieve an equivalent or related album, artist, or song from a source.
Definition: pandorasource.cpp:190
virtual bool requireNameForCreatePlaylist(void) const override
Indicate if a name is required when creating a playlist.
Definition: pandorasource.cpp:91
void pushMixToServers(bool mix_all=false)
Update the quickmix/station shuffle by sending a list of desired stations to Pandora.
Definition: pandorastation.cpp:152
std::unordered_map< std::string, ThingieList > SearchResults
Definition: pandora.h:45
const ConnectionParameters * connectionParams() const
Definition: pandora.h:64
virtual PianodPlaylist * getEverythingPlaylist(void) override
Retrieve the everything playlist.
Definition: pandorastation.cpp:173
~Source()
Destroy a source.
Definition: pandorasource.cpp:56
std::unique_ptr< Parsnip::Data > recovery
Data from persistence file.
Definition: pandora.h:57
StationLookup stations
A collection of stations, indexed by station ID.
Definition: pandora.h:48
virtual MusicThingie * getAnythingById(const Media::SplitId &id) override
Definition: pandorasource.cpp:108
void removeStationByStationId(const std::string &station_id)
Definition: pandorasource.cpp:73
virtual ThingieList getSuggestions(const Filter &filter, SearchRange where) override
Definition: pandorasource.cpp:124
virtual float periodic(void) override
Do intermittent or background tasks.
Definition: pandorasource.cpp:406
virtual SongList getRandomSongs(PianodPlaylist *playlist, const UserList &, Media::SelectionMethod) override
Definition: pandorasource.cpp:232
SkipTracker skips
Skip counts for limiting.
Definition: pandora.h:62
const UserFeatures & userFeatures() const
Definition: pandora.h:105
Source(const ConnectionParameters &params)
Definition: pandorasource.cpp:36
bool restore()
Definition: pandorasource.cpp:448
Station * getStationByStationId(const std::string &station_id)
Definition: pandorasource.cpp:66
bool initializeMix()
time_t genre_stations_expiration
When genre stations list expires.
Definition: pandora.h:51
virtual PianodPlaylist * createPlaylist(const char *name, MusicThingie::Type type, MusicThingie *from) override
Create a playlist using a thingie as an initial seed.
Definition: pandorasource.cpp:203
Library library
Lookup table of things we gave out.
Definition: pandora.h:60
virtual PlaylistList getPlaylists(const Filter &filter=Filter::All) override
Retrieve the source's playlists.
Definition: pandorasource.cpp:98
void setMixAllOnServers()
Definition: pandora.h:115
Definition: pandorastation.h:77
Station lookup.
Definition: pandorastation.h:143
Definition: pandoracomm.h:57
Generic data type.
Definition: parsnip.h:81
A ThingiePool that can persist & restore its data.
Definition: musiccache.h:67
PersistentPool(Media::Source *const src)
Initialize the cache/pool.
Definition: musiccache.cpp:207
Media::Source *const source
The source to which records will belong.
Definition: musiccache.h:69
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
PlaylistType
Definition: musictypes.h:418
@ SINGLE
Definition: musictypes.h:419
Base class for songs, these are also MusicThingies, artists and albums.
Definition: musictypes.h:339
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
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
SearchRange
Definition: fundamentals.h:35
Class for source parameters and their parsing.
Public interface for media players.
Public interface for sources, which provide an interface interfaces to select available music,...
Caches for music thingie types.
Playlist / Artist / Album / Song data types.
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
Pandora source, player and related datatype specializations.
Definition: pandora.h:32
Status
Communication completion statuses.
Definition: pandoracomm.h:27
Pandora communication.
Pandora connection parameters.
Pandora Playlist (station) support.
Pandora communication library.
Audio output device & driver parameters.
Definition: fundamentals.h:52
Pandora connection and source settings.
Definition: pandoraparameters.h:33