/** * @file * Copyright 2014 (c) Anna Schumaker. */ #ifndef OCARINA_CORE_TAGS_TRACK_H #define OCARINA_CORE_TAGS_TRACK_H #include #include #include #include #include /** * Track fields that can be compared. */ enum sort_t { /** Artist name */ SORT_ARTIST, /** Album name */ SORT_ALBUM, /** Play count */ SORT_COUNT, /** Genre */ SORT_GENRE, /** Track length */ SORT_LENGTH, /** Date the track was last played */ SORT_PLAYED, /** Track title */ SORT_TITLE, /** Track number */ SORT_TRACK, /** Track year */ SORT_YEAR, }; class Track : public GenericTag { private: Artist *_artist; /**< Pointer to the Artist performing this track. */ Library *_library; /**< Pointer to the Library containing this track. */ void set_length_str(); public: /** Pointer to this track's album information */ Album *album; /** Pointer to this track's genre information */ Genre *genre; /** Track number of this track */ unsigned int track; /** Length of this track (in seconds) */ unsigned int length; /** The number of times this track has been played */ unsigned int play_count; /** The year this track was last played */ unsigned int last_year; /** The month this track was last played */ unsigned int last_month; /** The day this track was last played */ unsigned int last_day; /** The title of this track */ std :: string title; /** The title of this track (in lowercase) */ std :: string title_lower; /** The filepath of this track, relative to the library root */ std :: string filepath; /** The length of this track in a human readable string */ std :: string length_str; /** Track constructor */ Track(); /** * Track constructor * * @param artist The artist performing this track. * @param library The library containing this track. */ Track(Artist *, Library *); /** * Track constructor * @param filepath Filepath of the track * @param library Library containing the track */ Track(const std::string &, Library *); /** Track destructor */ ~Track(); Artist *artist(); /**< @return Track::_artist. */ Library *library(); /**< @return Track::_library. */ /** * Called to access a track's primary key * @return The full path of the track */ const std::string primary_key() const; /** * Read track data from file * @param file The file to read from */ void read(File &); /** * Write track data to file * @param file The file to write to */ void write(File &); /** * Read the tags associated with this track * @return True on success */ bool tag(); /** @return The full path of this track */ const std::string path() const; /** Increments play count and sets date-last-played information. */ void played(); /** * Compare two tracks based on a specific field. * @param rhs The other track to compare. * @param field The field to compare. * @return 0 if lhs == rhs * @return < 0 if lhs < rhs, or rhs is NULL * @return > 0 if lhs > rhs */ int less_than(Track *, sort_t); }; #endif /* OCARINA_CORE_TAGS_TRACK_H */