17 #include <unordered_map>
18 #include <type_traits>
204 flog (Log::ALLOCATIONS,
"Retained ", (*
this)(),
", useCount=",
useCount);
214 flog (Log::ALLOCATIONS,
"Releasing ", (*
this)(),
", useCount=",
useCount - 1);
217 flog (Log::ALLOCATIONS,
"Deleting ", (*
this)());
230 virtual const std::string
id (
void)
const = 0;
236 virtual const std::string &
name (
void)
const = 0;
253 virtual bool operator==(
const std::string &compare)
const = 0;
259 return !(*
this == compare);
262 return !(*
this == compare);
274 virtual const std::string &
artistId (
void)
const = 0;
275 virtual const std::string
id (
void)
const override;
278 virtual const std::string &
name (
void)
const override {
return artist(); };
289 virtual const std::string &
artist (
void)
const = 0;
294 virtual bool operator==(
const std::string &compare)
const override;
309 virtual const std::string &
albumId (
void)
const = 0;
310 virtual const std::string
id (
void)
const override;
329 virtual bool operator==(
const std::string &compare)
const override;
344 virtual const std::string &
songId (
void)
const = 0;
345 virtual const std::string
id (
void)
const override;
348 virtual const std::string &
name (
void)
const override final {
return title(); };
359 virtual
bool matches (const
Filter &filter) const override final;
370 virtual const std::string &
title (
void)
const = 0;
373 virtual const std::string &
genre (
void)
const = 0;
374 virtual const std::string &
infoUrl (
void)
const;
383 virtual int year (
void)
const = 0;
395 virtual bool operator==(
const std::string &compare)
const override;
400 virtual bool canSkip (time_t *whenAllowed);
426 virtual const std::string
id (
void)
const override;
438 virtual
bool matches (const
Filter &filter) const override final;
444 virtual const std::string &
genre (
void)
const = 0;
448 virtual bool operator==(
const std::string &compare)
const override;
464 virtual void rename (
const std::string &newname) = 0;
470 template<
class BasePlaylist>
480 assert (!
"Queried seed for transient playlist.");
484 assert (!
"Set seed for transient playlist");
Exception for command execution problems.
Definition: fundamentals.h:293
Track data filter.
Definition: filter.h:38
Class to map between enumerations and their text values.
Definition: lookup.h:30
Definition: musictypes.h:54
void add(MusicThingie *item)
Definition: musictypes.h:57
~MusicAutoReleasePool()
Definition: musictypes.cpp:44
MusicAutoReleasePool()
Definition: musictypes.cpp:40
MusicAutoReleasePool * previousPool
Definition: musictypes.h:56
void unadd(MusicThingie *item)
Remove an item from the release pool when it fails subsequent construction.
Definition: musictypes.cpp:53
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
virtual bool operator==(const std::string &compare) const =0
Check if the primary name of this thingie matches.
Definition: musictypes.cpp:82
std::string operator()(void) const
Definition: musictypes.cpp:144
int getUseCount(void) const
Definition: musictypes.h:222
virtual const std::string id(void) const =0
Get the primary id of this thingie.
bool isSeed(void) const
Definition: musictypes.h:134
virtual const PianodArtist * asArtist() const
Definition: musictypes.h:190
virtual const std::string & internalId(MusicThingie::Type type) const =0
Return the inner ID when used in a specific context.
virtual ~MusicThingie(void)
Definition: musictypes.cpp:74
bool isSong(void) const
Definition: musictypes.h:152
virtual const PianodPlaylist * asPlaylist() const
Definition: musictypes.h:193
static constexpr bool isAlbum(const Type t)
Definition: musictypes.h:155
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const =0
Transmit the thingie's user-specific data on a connection.
void serializeCommon(Parsnip::Data &) const
Insert common items into the serialization dictionary.
Definition: musictypes.cpp:87
bool isPlaylist(void) const
Definition: musictypes.h:143
virtual bool matches(const Filter &filter) const =0
Check if a filter matches this item.
bool isAlbum(void) const
Definition: musictypes.h:160
static MusicAutoReleasePool * releasePool
The current autorelease pool to put newly created music thingies into.
Definition: musictypes.h:81
bool isValidType(void) const
Definition: musictypes.h:174
static constexpr bool isArtist(const Type t)
Definition: musictypes.h:163
virtual PianodArtist * asArtist()
Definition: musictypes.h:186
virtual const PianodSong * asSong() const
Definition: musictypes.h:192
bool isSuggestion(void) const
Definition: musictypes.h:124
static constexpr bool isValidType(const Type t)
Definition: musictypes.h:171
virtual Football::Thingie & transmitCommon(Football::Thingie &recipient) const =0
Transmit the thingie's data to a connection or service.
static constexpr bool isSeed(const Type t)
Definition: musictypes.h:127
short useCount
Definition: musictypes.h:80
MusicThingie(void)
When allocated, use count starts at 1 and the object is put in the release pool, justifying its exist...
Definition: musictypes.cpp:69
Type primaryType(void) const
Definition: musictypes.h:178
virtual bool canQueue() const
Indicate if specific item can be queued/requested.
Definition: musictypes.h:183
virtual void serializePrivate(Parsnip::Data &, const User *user) const =0
Add the thingie's user-specific data for JSON transmission.
virtual bool operator==(const MusicThingie &compare) const =0
Compare a thingie's name to another of the equivalent or decendent type.
virtual const std::string id(MusicThingie::Type type) const =0
Return the complete ID when used in a specific context.
virtual SongList songs()
Retrieve a list of requestable songs applicable to this thingie.
Definition: musictypes.cpp:162
virtual Parsnip::Data serialize() const =0
Assemble the thingie's data for JSON tranmission.
virtual Type type(void) const =0
Return the type letter for a thingie.
bool isPrimary(void) const
Definition: musictypes.h:115
static constexpr bool isSuggestion(const Type t)
Definition: musictypes.h:118
virtual const PianodAlbum * asAlbum() const
Definition: musictypes.h:191
void release(void)
Abandon an instance.
Definition: musictypes.h:211
virtual PianodPlaylist * asPlaylist()
Definition: musictypes.h:189
virtual Media::Source *const source(void) const =0
MediaSource from which this thingie originates.
static std::string TypeName(Type type)
Get the type name of a music thingie.
Definition: musictypes.cpp:121
virtual Ownership * parentOwner(void) const
Defer the ownership to the source.
Definition: musictypes.cpp:166
bool operator!=(const std::string &compare)
Definition: musictypes.h:258
virtual const std::string & name(void) const =0
Return the most specific name of this, whatever type it is.
static Type TypeFromName(const std::string &name)
Definition: musictypes.cpp:135
Type
Definition: musictypes.h:86
static constexpr bool isPlaylist(const Type t)
Definition: musictypes.h:138
static constexpr bool isPrimary(Type t)
Definition: musictypes.h:109
void retain(void) const
Claim an instance.
Definition: musictypes.h:201
virtual PianodSong * asSong()
Definition: musictypes.h:188
bool isArtist(void) const
Definition: musictypes.h:168
virtual PianodAlbum * asAlbum()
Definition: musictypes.h:187
static constexpr bool isSong(const Type t)
Definition: musictypes.h:146
Privilege management for media sources.
Definition: fundamentals.h:351
Type
Access levels for an object.
Definition: fundamentals.h:355
Generic data type.
Definition: parsnip.h:81
Base class for albums, these are also MusicThingies and artists.
Definition: musictypes.h:307
virtual PianodArtist * asArtist() override
Definition: musictypes.h:321
virtual PianodAlbum * asAlbum() override final
Definition: musictypes.h:323
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override
Transmit the thingie's user-specific data on a connection.
Definition: musictypes.cpp:299
virtual const PianodAlbum * asAlbum() const override final
Definition: musictypes.h:324
virtual bool matches(const Filter &filter) const override
Check if a filter matches this item.
Definition: musictypes.cpp:334
virtual bool operator==(const std::string &compare) const override
Is album a compilation?
Definition: musictypes.cpp:338
virtual Football::Thingie & transmitCommon(Football::Thingie &recipient) const override
Typecode for album type.
Definition: musictypes.cpp:290
virtual const std::string & name(void) const override
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:313
virtual Parsnip::Data serialize() const override
Assemble the thingie's data for JSON tranmission.
Definition: musictypes.cpp:306
virtual const std::string & coverArtUrl(void) const =0
virtual void serializePrivate(Parsnip::Data &, const User *user) const override
Add the thingie's user-specific data for JSON transmission.
Definition: musictypes.cpp:326
static Type typetype(void)
Typecode for album objects.
Definition: musictypes.h:315
virtual Type type(void) const override
Return the type letter for a thingie.
Definition: musictypes.h:314
virtual const std::string & albumTitle(void) const =0
virtual const std::string id(void) const override
Primary ID is album ID.
Definition: musictypes.cpp:260
virtual bool compilation() const
Definition: musictypes.h:328
virtual const std::string & albumId(void) const =0
Item's album ID.
virtual const PianodArtist * asArtist() const override
Definition: musictypes.h:322
virtual const std::string & internalId(MusicThingie::Type type) const override
Return the inner ID when used in a specific context.
Definition: musictypes.cpp:277
Base class for artists, derived from MusicThingies.
Definition: musictypes.h:272
virtual const std::string & internalId(MusicThingie::Type type) const override
Return the inner ID when used in a specific context.
Definition: musictypes.cpp:194
virtual const std::string & name(void) const override
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:278
virtual PianodArtist * asArtist() override
Definition: musictypes.h:286
virtual void serializePrivate(Parsnip::Data &, const User *user) const override
Add the thingie's user-specific data for JSON transmission.
Definition: musictypes.cpp:229
virtual Football::Thingie & transmitCommon(Football::Thingie &recipient) const override
Typecode for artist type.
Definition: musictypes.cpp:206
virtual Parsnip::Data serialize() const override
Assemble the thingie's data for JSON tranmission.
Definition: musictypes.cpp:219
virtual const std::string & artistId(void) const =0
Item's artist ID.
virtual const PianodArtist * asArtist() const override
Definition: musictypes.h:287
static Type typetype(void)
Typecode for artist objects.
Definition: musictypes.h:280
virtual Type type(void) const override
Return the type letter for a thingie.
Definition: musictypes.h:279
virtual bool operator==(const std::string &compare) const override
See if the artist has a certain name.
Definition: musictypes.cpp:241
virtual bool matches(const Filter &filter) const override
Check if a filter matches this item.
Definition: musictypes.cpp:237
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override
Transmit the thingie's user-specific data on a connection.
Definition: musictypes.cpp:212
virtual const std::string id(void) const override
Get primary ID with media manager ID on it.
Definition: musictypes.cpp:179
virtual const std::string & artist(void) const =0
Get artist name.
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 PlaylistType playlistType(void) const =0
Mix, everything, transient or single list.
virtual const std::string & playlistName(void) const =0
Name of the playlist.
virtual bool includedInMix(void) const =0
virtual void rename(const std::string &newname)=0
virtual const std::string id(void) const override
Primary ID is playlist ID.
Definition: musictypes.cpp:702
RESPONSE_CODE rate(Rating value, User *user)
Set a user's playlist's rating.
Definition: musictypes.cpp:838
virtual const std::string & name(void) const override final
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:429
virtual bool matches(const Filter &filter) const override final
Check if a filter matches this item.
Definition: musictypes.cpp:815
virtual const std::string & genre(void) const =0
Get genre of this playlist.
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override
Transmit the thingie's user-specific data on a connection.
Definition: musictypes.cpp:739
virtual PianodPlaylist * asPlaylist() override final
Definition: musictypes.h:439
virtual const std::string & playlistId(void) const =0
Item's playlist ID.
virtual bool operator==(const std::string &compare) const override
Check if the primary name of this thingie matches.
Definition: musictypes.cpp:819
virtual SongList getRandomSongs(const UserList &users, Media::SelectionMethod selectionMethod)
Choose some random songs for queueing.
Definition: musictypes.cpp:694
virtual const PianodPlaylist * asPlaylist() const override final
Definition: musictypes.h:440
virtual bool seed(MusicThingie::Type seedType, const MusicThingie *music) const
Check if there is a seed of a particular type for this thingie.
Definition: musictypes.cpp:890
virtual ThingieList getSeeds(void) const
Get the seed list for a playlist.
Definition: musictypes.cpp:910
virtual const std::string & internalId(MusicThingie::Type type) const override final
Return the inner ID when used in a specific context.
Definition: musictypes.cpp:718
virtual Type type(void) const override
Return the type letter for a thingie.
Definition: musictypes.h:430
Parsnip::Data serializeRatings(const User *user) const
Definition: musictypes.cpp:800
virtual bool canSeed(MusicThingie::Type seedType) const
Determine if a particular type of seeding is possible.
Definition: musictypes.cpp:882
virtual SongList songs() override
Retrieve a list of requestable songs applicable to this thingie.
Definition: musictypes.cpp:677
virtual void serializePrivate(Parsnip::Data &, const User *user) const override
Add the thingie's user-specific data for JSON transmission.
Definition: musictypes.cpp:787
class Response assembleRatings(const User *user) const
Definition: musictypes.cpp:766
float averageRating() const
Return the average rating of a playlist, considering all ratings.
Definition: musictypes.cpp:869
virtual Football::Thingie & transmitCommon(Football::Thingie &recipient) const override final
Typecode for playlist type.
Definition: musictypes.cpp:730
PlaylistType
Definition: musictypes.h:418
@ MIX
Definition: musictypes.h:420
@ SINGLE
Definition: musictypes.h:419
@ EVERYTHING
Definition: musictypes.h:421
@ TRANSIENT
Definition: musictypes.h:422
virtual void includedInMix(bool include)=0
virtual Parsnip::Data serialize() const override final
Assemble the thingie's data for JSON tranmission.
Definition: musictypes.cpp:775
static Type typetype(void)
Typecode for playlist objects.
Definition: musictypes.h:431
virtual void updateSelector(const Filter &new_selector)
Update a playlist's selector algorithm.
Definition: musictypes.cpp:917
Rating rating(const User *user) const
Retrieve a user's playlist's rating.
Definition: musictypes.cpp:859
Base class for songs, these are also MusicThingies, artists and albums.
Definition: musictypes.h:339
virtual const std::string id(void) const override
Primary ID is album ID.
Definition: musictypes.cpp:357
virtual SongList songs() override
Retrieve a list of requestable songs applicable to this thingie.
Definition: musictypes.cpp:654
virtual Type type(void) const override
Return the type letter for a thingie.
Definition: musictypes.h:349
ResponseGroup assembleRatings(const User *user, const PianodPlaylist *playlist, bool include_json) const
Definition: musictypes.cpp:430
virtual RESPONSE_CODE rate(Rating value, User *user)=0
Rate a song.
time_t last_played
Time song was last played, 0 if never or unknown.
Definition: musictypes.h:342
ResponseGroup assembleCapabilities(const User *user, const PianodPlaylist *playlist) const
Definition: musictypes.cpp:465
virtual Rating rating(const User *user) const =0
Get a song's rating.
virtual RatingScheme ratingScheme(void) const
Definition: musictypes.h:385
virtual PianodSong * asSong() override final
Definition: musictypes.h:360
virtual const std::string & playlistName(void) const
Get name of a playlist to which this belongs.
Definition: musictypes.cpp:671
bool expired(void)
Definition: musictypes.h:364
virtual const std::string & name(void) const override final
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:348
time_t expiration
Time at which a queued item becomes invalid, or 0 if good forever.
Definition: musictypes.h:341
static Type typetype(void)
Definition: musictypes.h:350
virtual const std::string & internalId(MusicThingie::Type type) const override final
Return the inner ID when used in a specific context.
Definition: musictypes.cpp:378
virtual PianodPlaylist * playlist(void) const =0
Get a playlist instance.
virtual int duration(void) const =0
Duration of song in seconds.
virtual bool canSkip(time_t *whenAllowed)
Check for permission to skip a song.
Definition: musictypes.cpp:634
virtual void serializePrivate(Parsnip::Data &, const User *user) const override
Add the thingie's user-specific data for JSON transmission.
Definition: musictypes.cpp:531
virtual int year(void) const =0
Year of release of song.
Parsnip::Data serializeCapabilities(const User *user, const PianodPlaylist *playlist) const
Provide a list of actions a user can take on this song.
Definition: musictypes.cpp:574
virtual const std::string & songId(void) const =0
virtual int trackNumber(void) const =0
Get track number (sequence number within an album/original media).
virtual const std::string & title(void) const =0
Get the song's title.
virtual const std::string & infoUrl(void) const
Provide a URL with additional info.
Definition: musictypes.cpp:664
virtual bool matches(const Filter &filter) const override final
Check if a filter matches this item.
Definition: musictypes.cpp:595
virtual Football::Thingie & transmitCommon(Football::Thingie &recipient) const override final
Typecode for album type.
Definition: musictypes.cpp:396
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override
Transmit the thingie's user-specific data on a connection.
Definition: musictypes.cpp:420
Media::Player * play(const AudioSettings &audio)
Play the song.
Definition: musictypes.cpp:646
float averageRating() const
Return the average rating of a song, considering all ratings.
Definition: musictypes.cpp:616
void lastPlayed(time_t t)
Definition: musictypes.h:368
virtual const PianodSong * asSong() const override final
Definition: musictypes.h:361
virtual Parsnip::Data serialize() const override final
Assemble the thingie's data for JSON tranmission.
Definition: musictypes.cpp:493
time_t lastPlayed(void) const
Get time a song last played.
Definition: musictypes.h:367
virtual RESPONSE_CODE rateOverplayed(User *)
Definition: musictypes.h:392
bool expires(void)
Definition: musictypes.h:363
virtual const std::string & genre(void) const =0
Get genre of this song.
Parsnip::Data serializeRatings(const User *user, const PianodPlaylist *playlist) const
Definition: musictypes.cpp:536
virtual bool mustPlay() const
Mark songs (err, adverts) as must-play; they can't be skipped over even when playlist selections are ...
Definition: musictypes.cpp:641
virtual bool operator==(const std::string &compare) const override
Is album a compilation?
Definition: musictypes.cpp:599
Template to make a corresponding transient playlist.
Definition: musictypes.h:471
virtual bool canSeed(MusicThingie::Type) const override
Definition: musictypes.h:478
virtual void includedInMix(bool) override
Definition: musictypes.h:476
virtual void rename(const std::string &) override
Definition: musictypes.h:487
virtual bool seed(MusicThingie::Type, const MusicThingie *) const override
Definition: musictypes.h:479
virtual bool includedInMix(void) const override
Definition: musictypes.h:475
virtual PianodPlaylist::PlaylistType playlistType(void) const override
Definition: musictypes.h:473
virtual void erase() override
Definition: musictypes.h:488
virtual void seed(MusicThingie::Type, MusicThingie *, bool) override
Definition: musictypes.h:483
A container for lists of playlists.
Definition: retainedlist.h:324
Container for multiple Responses.
Definition: response.h:155
Type combining RESPONSE_CODE with a value or explanation:
Definition: response.h:49
const class User * user
User triggering the response.
Definition: response.h:73
A container for holding songs.
Definition: retainedlist.h:328
Ownership where privilege is regulated by some parent object.
Definition: ownership.h:37
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
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
@ E_NOT_IMPLEMENTED
Definition: fundamentals.h:221
@ E_MEDIA_TRANSIENT
Transient playlist.
Definition: fundamentals.h:219
Debug/event logging interface.
void flog(LogType level, MoreItems &&... more)
Log messages when their logging category is enabled.
Definition: logging.h:109
const LookupTable< MusicThingie::Type > ThingieTypesLookup
Look up table for thingie type names and type codes.
Definition: musictypes.h:498
ThingieTypesLookup THINGIETYPES
uint32_t value
Definition: audiooutput.cpp:68
static const char * Data
Definition: responsejson.cpp:42
const char * Song
Definition: musickeys.cpp:69
const char * Playlist
Definition: musickeys.cpp:66
const char * Album
Definition: musickeys.cpp:68
const char * Artist
Definition: musickeys.cpp:67
Serialization and parsing library.
Definition: mediaunit.h:26
Access control for objects.
Rating
Discrete ratings values.
Definition: ratings.h:24
RatingScheme
Rules of who may rate an object.
Definition: ratings.h:17
@ NOBODY
Ratings are unsupported.
Audio output device & driver parameters.
Definition: fundamentals.h:52