15 #include <unordered_map>
16 #include <unordered_set>
56 time_t when = time (
nullptr) +
import;
84 const std::string
_id;
91 typedef std::unordered_set<std::string>
SeedSet;
99 Playlist ():
Playlist (nullptr,
"",
"") { assert (!
"Default constructor called for MusicLibrary::Playlist"); };
107 virtual const std::string &
playlistId (
void)
const override {
return _id; };
109 virtual const std::string &
genre (
void)
const override;
115 bool value)
override;
118 virtual bool canQueue() const override final {
return true; };
120 virtual void rename (
const std::string &newname)
override;
121 virtual void erase ()
override;
155 virtual ~Artist (
void)
override;
160 virtual const std::string &
artistId (
void)
const override final {
return _id; };
161 virtual const std::string &
artist (
void)
const override final {
return _name; };
164 virtual bool canQueue()
const override {
return true; };
191 virtual ~Album (
void)
override;
197 virtual const std::string &
artist (
void)
const override final;
199 virtual const std::string &
albumId (
void)
const override final {
return _id; };
209 virtual bool canQueue()
const override {
return true; };
240 virtual ~Song (
void)
override;
244 virtual const std::string &
songId (
void)
const override {
return _id; };
246 virtual const std::string &
artistId (
void)
const override final {
249 virtual const std::string &
artist (
void)
const override final;
258 virtual const std::string &
title (
void)
const override final {
return _name; };
261 virtual const std::string &
genre (
void)
const override final {
return _genre; }
263 virtual int year (
void)
const override final {
return _year; };
276 virtual bool canQueue()
const override {
return true; };
288 template <
class TThing,
class TParent>
291 using Allocator = std::function <TThing * (TParent *
const,
const std::string &,
const std::string &)>;
302 void purge (
bool pred (
const TThing *));
304 TThing *
getById (
const std::string &key)
const;
308 TThing *
getByName (
const std::string &name, TParent *parent)
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) {
317 const std::string &namefield,
318 const std::string &idfield);
326 template <
typename AllocType,
typename ParentType>
329 AllocType *
operator () (ParentType *
const parent,
const std::string &
id,
const std::string &name) {
330 return new AllocType (parent,
id, name);
357 const bool persistence,
379 for (
auto item :
songs) {
Track data filter.
Definition: filter.h:38
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
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
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
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.