pianod2
multisource multiuser scriptable networked music player
mediaunit.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <cstdio>
15 
16 #include <string>
17 #include <unordered_map>
18 #include <functional>
19 #include <memory>
20 
21 #include "fundamentals.h"
22 #include "musictypes.h"
23 #include "filter.h"
24 #include "ownership.h"
25 
26 namespace Parsnip {
27  class Data;
28 }
29 
31 namespace Media {
32  class SourceParameters;
33  class Player;
34  class Manager;
35  class SplitId;
36 
37  namespace Key {
38  extern const char *Source;
39  extern const char *SourceId;
40  extern const char *SourceKind;
41  extern const char *SourceName;
42  }
43 
45  struct Statistics {
46  int songs_attempted = 0;
47  int tracks_played = 0;
50  int songs_replaced = 0;
51  int songs_donated = 0;
52  };
53 
55  enum class SelectionMethod {
56  Song,
57  Album,
58  Artist,
59  Playlist,
60  Random
61  };
62 
68  class Source : public PrimaryOwnership {
69  friend class Manager;
70  public:
71  typedef unsigned long SerialNumber;
72 
73  protected:
74  enum class State {
75  INITIALIZING,
76  VALID,
77  READY,
78  DEAD
79  };
81 
83  const SourceParameters *parameters = nullptr;
84 
85  private:
86  // Some state manipulated by the media manager
90  time_t lockout_until = 0;
91 
92  static void defaultStatusHandler (RESPONSE_CODE status, const char *detail);
94  std::function <void (RESPONSE_CODE status, const char *detail)> statusHandler = defaultStatusHandler;
95 
96  public:
97  Source (SourceParameters *params);
98  virtual ~Source (void);
99 
100  void persist (void) const;
101  virtual bool flush (void);
103  inline bool isReady (void) const { return state == State::READY; };
105  inline SerialNumber serialNumber (void) const { return (serialNum); };
107  inline const Statistics &getStatistics () const { return statistics; };
109  inline const bool isLockedOut () const { return lockout_until > time(nullptr); };
110 
112  std::string identify() const;
113  void alert (RESPONSE_CODE message) const;
114  void alert (RESPONSE_CODE message, const char *detail, const char *reason = nullptr) const;
115  void reportStatus (const char *detail) const;
116  inline void reportStatus (const std::string &detail) const {
117  reportStatus (detail.c_str());
118  };
119 
120  // Identity
122  virtual const char *kind (void) const = 0;
123  const std::string &name (void) const;
127  std::string key (void) const {
128  return std::string (kind()) + "#" + name();
129  }
131  std::string filename (void) const {
132  return std::string (kind()) + "-" + name() + ".json";
133  }
134 
135  // Capabilities
136  virtual bool canExpandToAllSongs (void) const;
137  virtual bool requireNameForCreatePlaylist (void) const;
138 
139  // Playlist methods
140  PianodPlaylist *getPlaylistByName (const char *name);
141 
145  virtual PlaylistList getPlaylists (const Filter &filter = Filter::All) = 0;
146  virtual PianodPlaylist *getMixPlaylist (void) = 0;
147  virtual PianodPlaylist *getEverythingPlaylist (void) = 0;
148  virtual PianodPlaylist *getTransientPlaylist (const Filter &criteria);
149  virtual PianodPlaylist *createPlaylist (const char *name,
150  MusicThingie::Type type,
151  MusicThingie *from);
152  virtual PianodPlaylist *createPlaylist (const char *name, const Filter &filter);
153  virtual MusicThingie *getAnythingById (const SplitId &id) = 0;
154 
155  // Miscellaneous
156  virtual Player *getPlayer (const AudioSettings &audio, PianodSong *song) = 0;
157  virtual SongList getRandomSongs (PianodPlaylist *playlist, const UserList &users,
158  SelectionMethod selectionMethod) = 0;
159  virtual ThingieList getSuggestions (const Filter &filter, SearchRange what = SearchRange::EXHAUSTIVE) = 0;
160  virtual float periodic (void);
161  void playbackComplete (bool played, bool successfully);
162  virtual void playbackProblem (void) { };
163 
164  // Sourcecasts
176  virtual MusicThingie *getSuggestion (MusicThingie *thing,
177  MusicThingie::Type type,
178  SearchRange where = SearchRange::SHALLOW) = 0;
179 
184  return getSuggestion (thing, thing->type(), where);
185  }
186  protected:
188  MusicThingie::Type type,
189  SearchRange where,
190  bool fully_confirm);
191  };
192  using SourcePtr = std::unique_ptr<Source>;
193 
195  class SplitId {
196  public:
197  const std::string wholeId;
201  std::string innerId;
202 
203  explicit SplitId (const std::string &id);
204  };
205 
206 }
207 
Track data filter.
Definition: filter.h:38
static const Filter All
Selects all tracks.
Definition: filter.h:220
The Media::Manager contains a collection of all sources.
Definition: mediamanager.h:42
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
virtual PlaylistList getPlaylists(const Filter &filter=Filter::All)=0
Retrieve the source's playlists.
Definition: tonegensource.cpp:76
virtual bool canExpandToAllSongs(void) const
Indicate if arbitrary tracks can be requested from this source.
Definition: mediasource.cpp:44
State state
Definition: mediaunit.h:80
const std::string & name(void) const
Get the name of this source.
Definition: mediasource.cpp:38
void persist(void) const
Persist source parameters, attaching them to the owner's user data.
Definition: mediasource.cpp:110
virtual ~Source(void)
Destroy a source.
Definition: mediasource.cpp:31
SerialNumber serialNumber(void) const
Get the source's unique number assigned by the media manager.
Definition: mediaunit.h:105
MusicThingie * getSuggestion(MusicThingie *thing, SearchRange where=SearchRange::SHALLOW)
Retrieve an equivalent album, artist, or song from a source.
Definition: mediaunit.h:182
State announced_state
Used by media manager for managing callbacks.
Definition: mediaunit.h:88
virtual const char * kind(void) const =0
A unique string identifying the type of source.
Definition: tonegensource.cpp:50
static void defaultStatusHandler(RESPONSE_CODE status, const char *detail)
Log status and alert messages by sending them to stdout.
Definition: mediasource.cpp:74
std::string key(void) const
Key is a combination of kind and name.
Definition: mediaunit.h:127
const SourceParameters * parameters
Configuration details for this source, provided on source creation.
Definition: mediaunit.h:83
time_t lockout_until
Definition: mediaunit.h:90
virtual bool flush(void)
Persist data for a source.
Definition: mediasource.cpp:130
virtual bool requireNameForCreatePlaylist(void) const
Indicate if a name is required when creating a playlist.
Definition: mediasource.cpp:50
bool isReady(void) const
Check if the source is online.
Definition: mediaunit.h:103
Statistics statistics
Source playback statistics.
Definition: mediaunit.h:89
std::string filename(void) const
Provide a filename for persisting the source's data.
Definition: mediaunit.h:131
void reportStatus(const char *detail) const
Send a status notification regarding this source.
Definition: mediasource.cpp:105
State
Definition: mediaunit.h:74
@ READY
Fully initialized and ready to play music.
@ INITIALIZING
Nothing known yet.
@ DEAD
Waiting for disposal.
@ VALID
Credentials valid/data exists, but still initializing or offline.
virtual MusicThingie * getAnythingById(const SplitId &id)=0
Definition: tonegensource.cpp:86
virtual PianodPlaylist * createPlaylist(const char *name, MusicThingie::Type type, MusicThingie *from)
Create a playlist using a thingie as an initial seed.
Definition: mediasource.cpp:141
virtual ThingieList getSuggestions(const Filter &filter, SearchRange what=SearchRange::EXHAUSTIVE)=0
Definition: tonegensource.cpp:144
virtual float periodic(void)
Do intermittent or background tasks.
Definition: mediasource.cpp:258
PianodPlaylist * getPlaylistByName(const char *name)
Retrieve a playlist by name.
Definition: mediasource.cpp:162
void reportStatus(const std::string &detail) const
Definition: mediaunit.h:116
virtual PianodPlaylist * getTransientPlaylist(const Filter &criteria)
Create a temporary playlist based on a filter.
Definition: mediasource.cpp:177
SerialNumber serialNum
Assigned by media manager when registered.
Definition: mediaunit.h:87
virtual void playbackProblem(void)
Definition: mediaunit.h:162
Parsnip::Data serializeIdentity() const
Definition: mediasource.cpp:54
Source(SourceParameters *params)
Initialize the source.
Definition: mediasource.cpp:24
std::function< void(RESPONSE_CODE status, const char *detail)> statusHandler
Hook for the status handler, allowing status messages to be rerouted.
Definition: mediaunit.h:94
virtual MusicThingie * getSuggestion(MusicThingie *thing, MusicThingie::Type type, SearchRange where=SearchRange::SHALLOW)=0
Retrieve an equivalent or related album, artist, or song from a source.
Definition: tonegensource.cpp:149
void playbackComplete(bool played, bool successfully)
Update playback statistics.
Definition: mediaunit.cpp:28
std::string identify() const
Identify the unique source.
Definition: mediasource.cpp:66
virtual PianodPlaylist * getMixPlaylist(void)=0
Definition: tonegensource.cpp:102
void alert(RESPONSE_CODE message) const
Send an alert notification regarding this source.
Definition: mediasource.cpp:82
virtual SongList getRandomSongs(PianodPlaylist *playlist, const UserList &users, SelectionMethod selectionMethod)=0
Definition: tonegensource.cpp:137
virtual PianodPlaylist * getEverythingPlaylist(void)=0
Definition: tonegensource.cpp:106
const Statistics & getStatistics() const
Retrieve playback statistics about the source.
Definition: mediaunit.h:107
unsigned long SerialNumber
Definition: mediaunit.h:71
virtual Player * getPlayer(const AudioSettings &audio, PianodSong *song)=0
Definition: tonegensource.cpp:127
const bool isLockedOut() const
Check if source is temporarily locked out due to repeated failures.
Definition: mediaunit.h:109
Source parameter manager.
Definition: mediaparameters.h:39
Mechanism to split MusicThingie IDs into source identifier, type and inner ID.
Definition: mediaunit.h:195
Source * source
The source associated with the serial number.
Definition: mediaunit.h:199
const std::string wholeId
Complete ID.
Definition: mediaunit.h:197
MusicThingie::Type type
The type of music thingie that was decoded.
Definition: mediaunit.h:200
SplitId(const std::string &id)
Split an ID to its component pieces (source, type, id).
Definition: mediaunit.cpp:49
std::string innerId
The item ID with the source serial number and type code removed.
Definition: mediaunit.h:201
Source::SerialNumber serialNumber
The source's ID number assigned by the media manager.
Definition: mediaunit.h:198
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
virtual Type type(void) const =0
Return the type letter for a thingie.
Type
Definition: musictypes.h:86
Generic data type.
Definition: parsnip.h:81
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
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
Ownership where privilege is defined within the object.
Definition: ownership.h:18
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
Track filter.
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
SearchRange
Definition: fundamentals.h:35
@ SHALLOW
Get matching things, but not their contents.
@ EXHAUSTIVE
Get everything matching, and all their contents.
Playlist / Artist / Album / Song data types.
Definition: musiccache.cpp:18
const char * SourceKind
Definition: mediaunit.cpp:23
const char * SourceName
Definition: mediaunit.cpp:24
const char * Source
Definition: pandoratypes.h:113
const char * SourceId
Definition: mediaunit.cpp:22
Media source, source parameters and player interfaces.
Definition: connection.h:22
std::unique_ptr< Source > SourcePtr
Definition: mediaunit.h:192
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
@ Artist
An artist is picked randomly, then a few of their songs are picked.
@ Random
One of the above methods is randomly chosen.
@ Song
Songs are picked randomly from the union of applicable playlists.
@ Playlist
A playlist is picked randomly, then a few of its songs randomly.
@ Album
An entire album is picked randomly from a playlist.
Serialization and parsing library.
Definition: mediaunit.h:26
const char * Manager
Definition: sources.cpp:37
Access control for objects.
Audio output device & driver parameters.
Definition: fundamentals.h:52
Statistics on media played from the sources.
Definition: mediaunit.h:45
int sequential_failures
Definition: mediaunit.h:49
int songs_replaced
Definition: mediaunit.h:50
int songs_donated
Definition: mediaunit.h:51
int songs_attempted
Definition: mediaunit.h:46
int playback_failures
Definition: mediaunit.h:48
int tracks_played
Definition: mediaunit.h:47