pianod2
multisource multiuser scriptable networked music player
musiclibrary.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <string>
15 #include <unordered_map>
16 #include <unordered_set>
17 #include <vector>
18 #include <functional>
19 
20 #include <parsnip/parsnip.h>
21 
22 #include "musictypes.h"
23 #include "retainedlist.h"
24 #include "musickeys.h"
25 #include "filter.h"
26 
28 namespace MusicLibrary {
29  class Playlist;
30  class Song;
31 
32  const static int BIAS_MINIMUM = 1;
33  const static int BIAS_MAXIMUM = 100;
34  const static int BIAS_NEUTRAL = 1;
35 
36  class Foundation {
37  private:
38  const bool persist_data {false};
39  mutable time_t write_time {0};
40 
41  protected:
42  virtual bool restoreIndexFromFile (const std::string &filename) = 0;
43 
44  virtual bool writeIndexToFile (const std::string &filename) const = 0;
45  virtual void persist (Parsnip::Data &into) const { };
46  virtual bool restore (const Parsnip::Data &data) { return true; };
47  public:
49  Foundation (Media::Source * const owner, const bool persistence);
50  typedef enum {
51  IMPORTANT = 300,
52  NOMINAL = 1800,
53  TRIVIAL = 60 * 60 * 6
55  inline void markDirty (IMPORTANCE import = TRIVIAL) const {
56  time_t when = time (nullptr) + import;
57  if (write_time == 0 || when < write_time) {
58  write_time = when;
59  }
60  }
61  bool load();
62  bool flush();
63  float periodic();
64 
65  virtual RetainedList <Song *> getAllSongs (void) = 0;
66  virtual RetainedList <Song *> getMatchingSongs (const Filter &criteria) = 0;
67  virtual bool removePlaylist (Playlist *play) = 0;
68  virtual ThingieList seedsForPlaylist (const Playlist *playlist) = 0;
69  virtual void populatePlaylist (Playlist *play, bool aggressive = false) = 0;
71  virtual RetainedList <Song *> getPlaylistSongs (const Playlist *play, bool reassess = false) = 0;
73  const UserList &users,
74  Media::SelectionMethod selectionMethod,
75  const class LibraryParameters &settings);
76  };
77 
78 
80  class Playlist : public PianodPlaylist {
81  friend class TransientPlaylist;
82  private:
84  const std::string _id;
85  std::string _name;
86  mutable bool genres_dirty {true};
87  mutable std::string _genres;
88 
89  void calculateGenres() const;
90  public:
91  typedef std::unordered_set<std::string> SeedSet;
93  bool enabled = true;
95  public:
96  Playlist (Foundation *const library, const std::string &id, const std::string &name)
97  : _library (library), _id (id), _name (name) { };
98  // Default constructor is not used, but necessary for TransientPlaylist to compile (note virtual base class).
99  Playlist (): Playlist (nullptr, "", "") { assert (!"Default constructor called for MusicLibrary::Playlist"); };
100  inline Foundation *const library (void) const { return _library; };
101  inline Foundation *const parent (void) const { return _library; };
102  virtual Media::Source * const source (void) const override final { return _library->source; };
103  virtual bool includedInMix (void) const override { return enabled; };
104  virtual void includedInMix (bool include) override { enabled = include; };
105 
106  virtual PlaylistType playlistType (void) const override { return SINGLE; };
107  virtual const std::string &playlistId (void) const override { return _id; };
108  virtual const std::string &playlistName (void) const override { return _name; };
109  virtual const std::string &genre (void) const override;
110 
111  virtual bool canSeed (MusicThingie::Type seedType) const override;
112  virtual bool seed (MusicThingie::Type seedType, const MusicThingie *music) const override;
113  virtual ThingieList getSeeds (void) const override;
114  virtual void seed (MusicThingie::Type seedType, MusicThingie *music,
115  bool value) override;
116  virtual SongList songs () override;
117  virtual SongList songs (const Filter &filter) override;
118  virtual bool canQueue() const override final { return true; };
119  virtual void updateSelector (const Filter &new_selector) override final;
120  virtual void rename (const std::string &newname) override;
121  virtual void erase () override;
122 
123  bool appliesTo (const PianodSong *song) const;
124  const std::string *getIdForSeed (MusicThingie::Type seedType,
125  const MusicThingie *music) const;
126  void invalidateSeeds (const MusicThingie *music);
127  virtual Parsnip::Data persist () const;
128  virtual void restore (const Parsnip::Data &data);
129 
130  virtual PianodConnection &transmitPrivate (PianodConnection &recipient) const override;
131  virtual void serializePrivate (Parsnip::Data &song, const User *user) const override;
132  };
133 
134  class TransientPlaylist : public PianodTransientPlaylist <Playlist> {
135  public:
136  TransientPlaylist (Foundation *const library, const Filter &criteria);
137  virtual SongList songs () override;
138  };
139 
140  class Album;
141  class Song;
142 
144  class Artist : public PianodArtist {
145  friend class Album;
146  friend class Song;
147  friend class Playlist;
148  private:
150  const std::string _id;
151  const std::string _name;
152  std::vector<Album *> albums;
153  public:
154  Artist (Foundation *const library, const std::string &id, const std::string &name);
155  virtual ~Artist (void) override;
156  inline Foundation *const parent (void) const { return _library; };
157  inline Foundation *const library (void) const { return _library; };
158  virtual Media::Source * const source (void) const override final { return _library->source; };
159 
160  virtual const std::string &artistId (void) const override final { return _id; };
161  virtual const std::string &artist (void) const override final { return _name; };
162 
163  virtual SongList songs () override;
164  virtual bool canQueue() const override { return true; };
165  virtual Parsnip::Data persist () const;
166  virtual void restore (const Parsnip::Data &data);
167  inline bool empty() const { return albums.empty(); };
168  const std::vector<Album *> &getAlbums() { return albums; };
169  };
170 
172  class Album : public PianodAlbum {
173  friend class Artist;
174  friend class Song;
175  friend class Playlist;
177  const UserList &users,
178  Media::SelectionMethod selectionMethod,
179  const class LibraryParameters &settings);
180  protected:
182  private:
183  const std::string _id;
184  const std::string _name;
185  std::vector<Song *> _songs;
186  std::string _coverArt;
187  mutable std::string _artists;
188  mutable bool artists_dirty = false;
189  public:
190  Album (Artist *const parent, const std::string &id, const std::string &name);
191  virtual ~Album (void) override;
192  inline Artist *const parent (void) const { return _artist; };
193  inline Foundation *const library (void) const { return _artist->_library; };
194  virtual Media::Source * const source (void) const override final { return _artist ->_library->source; };
195 
196  virtual const std::string &artistId (void) const override final { return _artist->_id; };
197  virtual const std::string &artist (void) const override final;
198 
199  virtual const std::string &albumId (void) const override final { return _id; };
200  virtual const std::string &albumTitle (void) const override final { return _name; };
201  virtual const std::string &coverArtUrl (void) const override final { return _coverArt; };
202  virtual bool compilation () const override;
203 
204  inline void coverArtUrl (const std::string &a) { _coverArt = a; };
205  void calculateArtists (void) const;
206  virtual void makeCompilation (Artist *compilation_artist);
207 
208  virtual SongList songs () override;
209  virtual bool canQueue() const override { return true; };
210  virtual Parsnip::Data persist () const;
211  virtual void restore (const Parsnip::Data &data);
212  inline bool empty() const { return _songs.empty(); };
213  const std::vector<Song *> &getSongs() { return _songs; };
214  };
215 
217  class Song : public PianodSong {
218  friend class Playlist;
219  friend class Album;
221  const UserList &users,
222  Media::SelectionMethod selectionMethod,
223  const class LibraryParameters &settings);
224  protected:
225  Album *const _album;
226  private:
227  const std::string _id;
228  const std::string _name;
229 
230  Artist *_artist = nullptr;
231  std::string _genre;
232  int _duration = 0;
233  int _year = 0;
234  int _trackNumber = 0;
235 public: // For now
236  Playlist *_playlist = nullptr;
237 
238  public:
239  Song (Album *const parent, const std::string &id, const std::string &name);
240  virtual ~Song (void) override;
241  inline Album *const parent (void) const { return _album; };
242  inline Foundation *const library (void) const { return _album->_artist->_library; };
243  virtual Media::Source * const source (void) const override final { return _album->_artist->_library->source; };
244  virtual const std::string &songId (void) const override { return _id; };
245 
246  virtual const std::string &artistId (void) const override final {
247  return _artist ? _artist->_id : _album->_artist->_id;
248  };
249  virtual const std::string &artist (void) const override final;
250  virtual PianodArtist *asArtist () override final { if (_artist) return _artist; else return this; };
251  virtual const PianodArtist *asArtist () const override final { if (_artist) return _artist; else return this; };
252 
253  virtual const std::string &albumId (void) const override final { return _album->_id; };
254  virtual const std::string &albumTitle (void) const override final { return _album->_name; };
255  virtual const std::string &coverArtUrl (void) const override final { return _album->_coverArt; };
256  virtual bool compilation () const override final { return _album->compilation(); };
257 
258  virtual const std::string &title (void) const override final { return _name; };
259 
260  virtual PianodPlaylist *playlist (void) const override final;
261  virtual const std::string &genre (void) const override final { return _genre; }
262  virtual int duration (void) const override final { return _duration; };
263  virtual int year (void) const override final { return _year; };
264  virtual int trackNumber (void) const override final { return _trackNumber; };
265  inline int albumTrackCount () const { return _album->_songs.size(); };
266 
267  void artist (Artist *artist);
268  inline void genre (const std::string &g) { _genre = g; };
269  inline void duration (int d) { _duration = d; };
270  inline void year (int y) { _year = y; };
271  inline void trackNumber (int n) { _trackNumber = n; };
272 
273  virtual Parsnip::Data persist () const;
274  virtual void restore (const Parsnip::Data &data);
275 
276  virtual bool canQueue() const override { return true; };
277 
278  // Content management
279  virtual RatingScheme ratingScheme (void) const override { return RatingScheme::INDIVIDUAL; };
280  virtual RESPONSE_CODE rate (Rating value, User *user) override;
281  virtual Rating rating (const User *user) const override;
282  virtual RESPONSE_CODE rateOverplayed (User *user) override;
283  };
284 
288  template <class TThing, class TParent>
289  class ThingieContainer : public std::unordered_map<std::string, TThing *> {
290  public:
291  using Allocator = std::function <TThing * (TParent *const, const std::string &, const std::string &)>;
292 
293  private:
296 
297  public:
298  ThingieContainer (const Allocator &alloc);
300 
301  void clear();
302  void purge (bool pred (const TThing *));
303 
304  TThing *getById (const std::string &key) const;
305  TThing *getById (const Parsnip::Data &data, const char *field);
306 
308  TThing *getByName (const std::string &name, TParent *parent) const;
309  std::string getNewId (MusicThingie::Type item_type) const;
310  TThing *addItem (const std::string &name, std::string id, TParent *parent);
311  TThing *addOrGetItem (const std::string &name, std::string id, TParent *parent);
312  inline TThing *addOrGetItem (const std::string &name, TParent *parent) {
313  return addOrGetItem (name, "", parent);
314  }
315  TThing *addOrGetItem (const Parsnip::Data &data,
316  TParent *parent,
317  const std::string &namefield,
318  const std::string &idfield);
319  };
320 
321  static inline bool isCompilationAlbum (const Parsnip::Data &album) {
324  }
325 
326  template <typename AllocType, typename ParentType>
327  class Allocator {
328  public:
329  AllocType *operator () (ParentType *const parent, const std::string &id, const std::string &name) {
330  return new AllocType (parent, id, name);
331  }
332  };
333 
334  extern Allocator <Artist, Foundation> artist_allocate;
335  extern Allocator <Album, Artist> album_allocate;
336  extern Allocator <Song, Album> song_allocate;
337  extern Allocator <Playlist, Foundation> playlist_allocate;
338 
339  class Library : public Foundation {
344  public:
349 
350  protected:
355 
356  Library (Media::Source * const owner,
357  const bool persistence,
358  const SongAllocator &song_allocator = SongAllocator {song_allocate},
359  const AlbumAllocator &album_allocator = AlbumAllocator {album_allocate},
360  const ArtistAllocator &artist_allocator = ArtistAllocator {artist_allocate},
361  const PlaylistAllocator &playlist_allocator = PlaylistAllocator {playlist_allocate});
362 
363  void purge (void);
364 
365  public:
366  virtual bool removePlaylist (Playlist *play) override;
367  virtual ThingieList seedsForPlaylist (const Playlist *playlist) override;
368  virtual RetainedList <Song *> getAllSongs (void) override;
369  virtual RetainedList <Song *> getMatchingSongs (const Filter &criteria) override;
370  ThingieList getSuggestions (const Filter &criteria, SearchRange what);
372  virtual RetainedList <Song *> getPlaylistSongs (const Playlist *play, bool reassess = false) override;
373  Playlist *findPlaylistForSong (Song *song, bool enabled = true);
374  virtual void populatePlaylist (Playlist *play, bool aggressive = false) override;
375  void unpopulatePlaylist (Playlist *play);
378  void mixRecalculate (void) {
379  for (auto item : songs) {
380  item.second->_playlist = findPlaylistForSong (item.second);
381  }
382  }
383  MusicThingie *getById (MusicThingie::Type type, const std::string &id);
384  virtual RetainedList <Song *> getSongsForPlaylist (PianodPlaylist *playlist) override;
385  PianodPlaylist *createPlaylist (const std::string &name,
386  MusicThingie::Type type,
387  MusicThingie *from);
388  PianodPlaylist *createPlaylist (const std::string &name, const Filter &filter);
389  PianodPlaylist *formTransientPlaylist (const Filter &criteria);
390 
391  virtual bool writeIndexToFile (const std::string &filename) const override;
392  virtual bool restoreIndexFromFile (const std::string &filename) override;
393  };
394 }; // namespace MusicLibrary
Track data filter.
Definition: filter.h:38
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
A PianodAlbum that contains a vector of songs.
Definition: musiclibrary.h:172
const std::string _id
Definition: musiclibrary.h:183
virtual Parsnip::Data persist() const
Definition: musiclibrarytypes.cpp:452
virtual void makeCompilation(Artist *compilation_artist)
Mark an album as a compilation.
Definition: musiclibrarytypes.cpp:401
std::string _artists
Definition: musiclibrary.h:187
const std::string _name
Definition: musiclibrary.h:184
void calculateArtists(void) const
(Re)calculate the current artists list for a compilation.
Definition: musiclibrarytypes.cpp:380
Artist *const parent(void) const
Definition: musiclibrary.h:192
void coverArtUrl(const std::string &a)
Definition: musiclibrary.h:204
const std::vector< Song * > & getSongs()
Definition: musiclibrary.h:213
virtual const std::string & coverArtUrl(void) const override final
Definition: musiclibrary.h:201
virtual const std::string & albumId(void) const override final
Item's album ID.
Definition: musiclibrary.h:199
std::vector< Song * > _songs
Definition: musiclibrary.h:185
virtual const std::string & artist(void) const override final
Get the current artist, or list of artists if a compilation.
Definition: musiclibrarytypes.cpp:373
Artist * _artist
Definition: musiclibrary.h:181
virtual const std::string & albumTitle(void) const override final
Definition: musiclibrary.h:200
virtual ~Album(void) override
Destroy an album by unregistering from its parent artist.
Definition: musiclibrarytypes.cpp:362
virtual void restore(const Parsnip::Data &data)
Definition: musiclibrarytypes.cpp:469
bool empty() const
Definition: musiclibrary.h:212
virtual bool compilation() const override
Definition: musiclibrarytypes.cpp:390
virtual SongList songs() override
Get all songs belonging to the album.
Definition: musiclibrarytypes.cpp:435
virtual bool canQueue() const override
Indicate if specific item can be queued/requested.
Definition: musiclibrary.h:209
virtual const std::string & artistId(void) const override final
Item's artist ID.
Definition: musiclibrary.h:196
std::string _coverArt
Definition: musiclibrary.h:186
virtual Media::Source *const source(void) const override final
MediaSource from which this thingie originates.
Definition: musiclibrary.h:194
Album(Artist *const parent, const std::string &id, const std::string &name)
Create a new album, and register itself with its parent.
Definition: musiclibrarytypes.cpp:355
Foundation *const library(void) const
Definition: musiclibrary.h:193
bool artists_dirty
Definition: musiclibrary.h:188
Definition: musiclibrary.h:327
AllocType * operator()(ParentType *const parent, const std::string &id, const std::string &name)
Definition: musiclibrary.h:329
A PianodArtist that contains a vector of albums.
Definition: musiclibrary.h:144
std::vector< Album * > albums
Definition: musiclibrary.h:152
Artist(Foundation *const library, const std::string &id, const std::string &name)
Create a new artist.
Definition: musiclibrarytypes.cpp:303
bool empty() const
Definition: musiclibrary.h:167
virtual bool canQueue() const override
Indicate if specific item can be queued/requested.
Definition: musiclibrary.h:164
virtual void restore(const Parsnip::Data &data)
Definition: musiclibrarytypes.cpp:340
Foundation *const parent(void) const
Definition: musiclibrary.h:156
virtual SongList songs() override
Get all songs belonging to all albums by this artist.
Definition: musiclibrarytypes.cpp:315
Foundation *const library(void) const
Definition: musiclibrary.h:157
virtual ~Artist(void) override
Definition: musiclibrarytypes.cpp:307
const std::vector< Album * > & getAlbums()
Definition: musiclibrary.h:168
const std::string _id
Definition: musiclibrary.h:150
virtual const std::string & artist(void) const override final
Get artist name.
Definition: musiclibrary.h:161
Foundation *const _library
Definition: musiclibrary.h:149
virtual Media::Source *const source(void) const override final
MediaSource from which this thingie originates.
Definition: musiclibrary.h:158
const std::string _name
Definition: musiclibrary.h:151
virtual Parsnip::Data persist() const
Definition: musiclibrarytypes.cpp:328
virtual const std::string & artistId(void) const override final
Item's artist ID.
Definition: musiclibrary.h:160
Definition: musiclibrary.h:36
Media::Source *const source
Definition: musiclibrary.h:46
bool flush()
If memory is dirty, write library data to a file.
Definition: musiclibrary.cpp:74
virtual bool restore(const Parsnip::Data &data)
Definition: musiclibrary.h:46
virtual void populatePlaylist(Playlist *play, bool aggressive=false)=0
virtual bool writeIndexToFile(const std::string &filename) const =0
Foundation(Media::Source *const owner, const bool persistence)
Construct a new media library.
Definition: musiclibrary.cpp:56
void markDirty(IMPORTANCE import=TRIVIAL) const
Definition: musiclibrary.h:55
RetainedList< Song * > getRandomSongs(PianodPlaylist *playlist, const UserList &users, Media::SelectionMethod selectionMethod, const class LibraryParameters &settings)
Retrieve some random selections from the library for queue/playback.
Definition: musiclibrary.cpp:256
virtual ThingieList seedsForPlaylist(const Playlist *playlist)=0
virtual RetainedList< Song * > getAllSongs(void)=0
IMPORTANCE
Definition: musiclibrary.h:50
@ TRIVIAL
Definition: musiclibrary.h:53
@ IMPORTANT
Definition: musiclibrary.h:51
@ NOMINAL
Definition: musiclibrary.h:52
time_t write_time
Definition: musiclibrary.h:39
float periodic()
Do intermittent tasks, such as occasionally persisting the catalog to a file.
Definition: musiclibrary.cpp:88
virtual RetainedList< Song * > getMatchingSongs(const Filter &criteria)=0
virtual bool removePlaylist(Playlist *play)=0
virtual RetainedList< Song * > getSongsForPlaylist(PianodPlaylist *)=0
virtual bool restoreIndexFromFile(const std::string &filename)=0
virtual void persist(Parsnip::Data &into) const
Definition: musiclibrary.h:45
const bool persist_data
Definition: musiclibrary.h:38
bool load()
Restore persisted library data from a file.
Definition: musiclibrary.cpp:61
virtual RetainedList< Song * > getPlaylistSongs(const Playlist *play, bool reassess=false)=0
Definition: musiclibrary.h:339
MusicThingie * getById(MusicThingie::Type type, const std::string &id)
Retrieve anything stored in the library by its ID.
Definition: musiclibrary.cpp:528
AlbumContainer::Allocator AlbumAllocator
Definition: musiclibrary.h:346
virtual RetainedList< Song * > getAllSongs(void) override
Get a list of all songs in the library.
Definition: musiclibrary.cpp:393
virtual bool removePlaylist(Playlist *play) override
Remove a playlist from the library.
Definition: musiclibrary.cpp:352
Library(Media::Source *const owner, const bool persistence, const SongAllocator &song_allocator=SongAllocator {song_allocate}, const AlbumAllocator &album_allocator=AlbumAllocator {album_allocate}, const ArtistAllocator &artist_allocator=ArtistAllocator {artist_allocate}, const PlaylistAllocator &playlist_allocator=PlaylistAllocator {playlist_allocate})
Construct a library.
Definition: musiclibrary.cpp:328
Playlist * findPlaylistForSong(Song *song, bool enabled=true)
Find a playlist for a song, preferring enabled playlists.
Definition: musiclibrary.cpp:479
virtual RetainedList< Song * > getMatchingSongs(const Filter &criteria) override
Get a list of all songs matching a filter.
Definition: musiclibrary.cpp:403
PlaylistContainer::Allocator PlaylistAllocator
Definition: musiclibrary.h:348
void unpopulatePlaylist(Playlist *play)
Reassign all a playlists' songs to some other playlist.
Definition: musiclibrary.cpp:516
virtual RetainedList< Song * > getSongsForPlaylist(PianodPlaylist *playlist) override
Retrieve all songs for a playlist, which may be a meta playlist.
Definition: musiclibrary.cpp:557
void mixRecalculate(void)
Iterate over every song and replace its playlist assignment.
Definition: musiclibrary.h:378
PianodPlaylist * formTransientPlaylist(const Filter &criteria)
Construct a temporary playlist.
Definition: musiclibrary.cpp:612
ThingieList getSuggestions(const Filter &criteria, SearchRange what)
Retrieve suggestions from the library.
Definition: musiclibrary.cpp:422
RetainedList< Song * > getMixSongs(void)
Get a list of all songs belonging to enabled playlists.
Definition: musiclibrary.cpp:448
PlaylistContainer playlists
Definition: musiclibrary.h:354
PianodPlaylist * createPlaylist(const std::string &name, MusicThingie::Type type, MusicThingie *from)
Construct a playlist with an initial seed.
Definition: musiclibrary.cpp:576
virtual RetainedList< Song * > getPlaylistSongs(const Playlist *play, bool reassess=false) override
Get a list of all songs assigned to a playlist.
Definition: musiclibrary.cpp:464
virtual void populatePlaylist(Playlist *play, bool aggressive=false) override
Review songs and assign them to a new candidate if they match.
Definition: musiclibrary.cpp:497
SongContainer songs
Definition: musiclibrary.h:353
virtual bool writeIndexToFile(const std::string &filename) const override
Persist the library's index into a file.
Definition: musiclibrary.cpp:619
ArtistContainer::Allocator ArtistAllocator
Definition: musiclibrary.h:345
ArtistContainer artists
Definition: musiclibrary.h:351
void purge(void)
Remove albums & artists from the library that don't have any songs & albums respectively.
Definition: musiclibrary.cpp:345
virtual bool restoreIndexFromFile(const std::string &filename) override
Restore the library's index, playlists, seeds and match criteria from a file.
Definition: musiclibrary.cpp:652
AlbumContainer albums
Definition: musiclibrary.h:352
virtual ThingieList seedsForPlaylist(const Playlist *playlist) override
Retrieve a list of seeds for a playlist.
Definition: musiclibrary.cpp:364
SongContainer::Allocator SongAllocator
Definition: musiclibrary.h:347
Definition: musiclibraryparameters.h:30
A PianodPlaylist for music libraries.
Definition: musiclibrary.h:80
Foundation *const library(void) const
Definition: musiclibrary.h:100
std::string _genres
Definition: musiclibrary.h:87
Filter selector
First selection of music from the library.
Definition: musiclibrary.h:94
bool enabled
Definition: musiclibrary.h:93
virtual ThingieList getSeeds(void) const override
Get the seed list for a playlist.
Definition: musiclibrarytypes.cpp:132
bool appliesTo(const PianodSong *song) const
Definition: musiclibrarytypes.cpp:68
virtual bool canQueue() const override final
Indicate if specific item can be queued/requested.
Definition: musiclibrary.h:118
virtual const std::string & playlistId(void) const override
Item's playlist ID.
Definition: musiclibrary.h:107
virtual bool includedInMix(void) const override
Definition: musiclibrary.h:103
virtual void restore(const Parsnip::Data &data)
Definition: musiclibrarytypes.cpp:210
bool genres_dirty
Definition: musiclibrary.h:86
SeedSet seeds
Definition: musiclibrary.h:92
virtual Media::Source *const source(void) const override final
MediaSource from which this thingie originates.
Definition: musiclibrary.h:102
void calculateGenres() const
Definition: musiclibrarytypes.cpp:229
const std::string * getIdForSeed(MusicThingie::Type seedType, const MusicThingie *music) const
Playlist()
Definition: musiclibrary.h:99
virtual void includedInMix(bool include) override
Definition: musiclibrary.h:104
virtual PlaylistType playlistType(void) const override
Mix, everything, transient or single list.
Definition: musiclibrary.h:106
std::string _name
Definition: musiclibrary.h:85
virtual Parsnip::Data persist() const
Definition: musiclibrarytypes.cpp:195
virtual const std::string & playlistName(void) const override
Name of the playlist.
Definition: musiclibrary.h:108
virtual bool seed(MusicThingie::Type seedType, const MusicThingie *music) const override
Check if there is a seed of a particular type for this thingie.
Definition: musiclibrarytypes.cpp:80
Foundation *const _library
Definition: musiclibrary.h:83
virtual void updateSelector(const Filter &new_selector) override final
Update a playlist's selector algorithm.
Definition: musiclibrarytypes.cpp:175
virtual void erase() override
Definition: musiclibrarytypes.cpp:184
virtual bool canSeed(MusicThingie::Type seedType) const override
Determine if a particular type of seeding is possible.
Definition: musiclibrarytypes.cpp:76
const std::string _id
Definition: musiclibrary.h:84
Playlist(Foundation *const library, const std::string &id, const std::string &name)
Definition: musiclibrary.h:96
virtual const std::string & genre(void) const override
(Re)calculate the current genres list for a playlist.
Definition: musiclibrarytypes.cpp:253
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override
Transmit the thingie's user-specific data on a connection.
Definition: musiclibrarytypes.cpp:260
virtual SongList songs() override
Retrieve a list of requestable songs applicable to this thingie.
Definition: musiclibrarytypes.cpp:136
void invalidateSeeds(const MusicThingie *music)
Definition: musiclibrarytypes.cpp:153
virtual void serializePrivate(Parsnip::Data &song, const User *user) const override
Add the thingie's user-specific data for JSON transmission.
Definition: musiclibrarytypes.cpp:268
virtual void rename(const std::string &newname) override
Definition: musiclibrarytypes.cpp:179
std::unordered_set< std::string > SeedSet
Definition: musiclibrary.h:91
Foundation *const parent(void) const
Definition: musiclibrary.h:101
A PianodSong made of inbred data structures.
Definition: musiclibrary.h:217
virtual const std::string & albumId(void) const override final
Item's album ID.
Definition: musiclibrary.h:253
void year(int y)
Definition: musiclibrary.h:270
int _year
Definition: musiclibrary.h:233
virtual RESPONSE_CODE rateOverplayed(User *user) override
Definition: musiclibrarytypes.cpp:535
virtual const std::string & artist(void) const override final
Get artist name.
Definition: musiclibrarytypes.cpp:488
virtual Parsnip::Data persist() const
Definition: musiclibrarytypes.cpp:551
virtual PianodArtist * asArtist() override final
Definition: musiclibrary.h:250
Foundation *const library(void) const
Definition: musiclibrary.h:242
virtual const std::string & albumTitle(void) const override final
Definition: musiclibrary.h:254
virtual bool compilation() const override final
Definition: musiclibrary.h:256
virtual int trackNumber(void) const override final
Get track number (sequence number within an album/original media).
Definition: musiclibrary.h:264
std::string _genre
Definition: musiclibrary.h:231
virtual Rating rating(const User *user) const override
Get a song's rating.
Definition: musiclibrarytypes.cpp:528
virtual const std::string & genre(void) const override final
Get genre of this song.
Definition: musiclibrary.h:261
int _duration
Definition: musiclibrary.h:232
virtual const std::string & coverArtUrl(void) const override final
Definition: musiclibrary.h:255
Playlist * _playlist
Definition: musiclibrary.h:236
virtual PianodPlaylist * playlist(void) const override final
Get a playlist instance.
Definition: musiclibrarytypes.cpp:191
int _trackNumber
Definition: musiclibrary.h:234
virtual int year(void) const override final
Year of release of song.
Definition: musiclibrary.h:263
virtual const std::string & artistId(void) const override final
Item's artist ID.
Definition: musiclibrary.h:246
void trackNumber(int n)
Definition: musiclibrary.h:271
virtual const std::string & title(void) const override final
Get the song's title.
Definition: musiclibrary.h:258
void duration(int d)
Definition: musiclibrary.h:269
virtual int duration(void) const override final
Duration of song in seconds.
Definition: musiclibrary.h:262
Artist * _artist
Definition: musiclibrary.h:230
virtual const std::string & songId(void) const override
Definition: musiclibrary.h:244
virtual const PianodArtist * asArtist() const override final
Definition: musiclibrary.h:251
const std::string _name
Definition: musiclibrary.h:228
const std::string _id
Definition: musiclibrary.h:227
int albumTrackCount() const
Definition: musiclibrary.h:265
virtual void restore(const Parsnip::Data &data)
Definition: musiclibrarytypes.cpp:573
virtual bool canQueue() const override
Indicate if specific item can be queued/requested.
Definition: musiclibrary.h:276
Album *const _album
Definition: musiclibrary.h:225
Album *const parent(void) const
Definition: musiclibrary.h:241
virtual RatingScheme ratingScheme(void) const override
Definition: musiclibrary.h:279
virtual Media::Source *const source(void) const override final
MediaSource from which this thingie originates.
Definition: musiclibrary.h:243
virtual ~Song(void) override
Definition: musiclibrarytypes.cpp:492
virtual RESPONSE_CODE rate(Rating value, User *user) override
Rate a song.
Definition: musiclibrarytypes.cpp:513
Song(Album *const parent, const std::string &id, const std::string &name)
Add a song, and register itself with its parent album.
Definition: musiclibrarytypes.cpp:482
void genre(const std::string &g)
Definition: musiclibrary.h:268
Customized hash tables for music library.
Definition: musiclibrary.h:289
const Allocator allocate
An allocator for making new items of derived types we could store.
Definition: musiclibrary.h:295
TThing * getById(const std::string &key) const
Get a thing by its id.
Definition: musiclibraryhash.h:75
std::string getNewId(MusicThingie::Type item_type) const
Construct unique, random ID for a new item.
Definition: musiclibraryhash.h:101
~ThingieContainer()
Destructor: Release all contents prior to destruction.
Definition: musiclibraryhash.h:41
TThing * addItem(const std::string &name, std::string id, TParent *parent)
Construct a new item instance and add it to the hash by its ID.
Definition: musiclibraryhash.h:116
TThing * getByName(const std::string &name, TParent *parent) const
Search the things looking for a name and parent match.
Definition: musiclibraryhash.h:88
TThing * addOrGetItem(const std::string &name, std::string id, TParent *parent)
Retrieve an item by ID or by name.
Definition: musiclibraryhash.h:135
ThingieContainer(const Allocator &alloc)
Constructor: Construct a new ThingieContainer and assign it an allocator.
Definition: musiclibraryhash.h:35
void purge(bool pred(const TThing *))
Remove items according to the predicate.
Definition: musiclibraryhash.h:53
TThing * addOrGetItem(const std::string &name, TParent *parent)
Definition: musiclibrary.h:312
void clear()
Remove all items from the hash table.
Definition: musiclibraryhash.h:66
std::function< TThing *(TParent *const, const std::string &, const std::string &)> Allocator
Definition: musiclibrary.h:291
Definition: musiclibrary.h:134
TransientPlaylist(Foundation *const library, const Filter &criteria)
Definition: musiclibrarytypes.cpp:282
virtual SongList songs() override
Definition: musiclibrarytypes.cpp:287
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
Generic data type.
Definition: parsnip.h:81
bool contains(const std::string &word) const
Check if a key exists in a dictionary.
Definition: parsnip_types.cpp:328
bool asBoolean() const
Return value of data as a boolean. If the data is a string, translate "true" and "false".
Definition: parsnip_types.cpp:217
Base class for albums, these are also MusicThingies and artists.
Definition: musictypes.h:307
virtual const std::string & name(void) const override
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:313
Base class for artists, derived from MusicThingies.
Definition: musictypes.h:272
virtual const std::string & name(void) const override
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:278
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
virtual const std::string id(void) const override
Primary ID is playlist ID.
Definition: musictypes.cpp:702
virtual const std::string & name(void) const override final
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:429
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
virtual const std::string & name(void) const override final
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:348
Template to make a corresponding transient playlist.
Definition: musictypes.h:471
Container class for storing reference-counted music thingies.
Definition: retainedlist.h:80
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
Data about each user.
Definition: user.h:53
Track filter.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
SearchRange
Definition: fundamentals.h:35
Keys for music library or other persistence needs.
Playlist / Artist / Album / Song data types.
uint32_t value
Definition: audiooutput.cpp:68
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
const char * Song
Definition: musickeys.cpp:69
const char * Playlist
Definition: musickeys.cpp:66
const char * AlbumIsCompilation
Definition: musickeys.cpp:50
Memory-based index/database of music library contents.
Definition: musiclibrary.cpp:37
static const int BIAS_NEUTRAL
Neutral biasing factor for choosing songs.
Definition: musiclibrary.h:34
Allocator< Playlist, Foundation > playlist_allocate
Definition: musiclibrary.cpp:41
static bool isCompilationAlbum(const Parsnip::Data &album)
Definition: musiclibrary.h:321
Allocator< Artist, Foundation > artist_allocate
Definition: musiclibrary.cpp:38
static const int BIAS_MAXIMUM
Definition: musiclibrary.h:33
Allocator< Song, Album > song_allocate
Definition: musiclibrary.cpp:40
static const int BIAS_MINIMUM
Definition: musiclibrary.h:32
Allocator< Album, Artist > album_allocate
Definition: musiclibrary.cpp:39
AVPlayer * play
Definition: osxplayer.mm:261
Parsnip serialization.
Rating
Discrete ratings values.
Definition: ratings.h:24
RatingScheme
Rules of who may rate an object.
Definition: ratings.h:17
@ INDIVIDUAL
Each user gets a private rating for this song.
Collections for music thingie types.