diff options
Diffstat (limited to 'src/database/include/track.hpp')
| -rw-r--r-- | src/database/include/track.hpp | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/database/include/track.hpp b/src/database/include/track.hpp index 5a0c0ca8..e3f94db4 100644 --- a/src/database/include/track.hpp +++ b/src/database/include/track.hpp @@ -8,11 +8,14 @@ #include <stdint.h> +#include <map> +#include <memory> #include <optional> #include <string> #include <utility> #include "leveldb/db.h" +#include "shared_string.h" #include "span.hpp" namespace database { @@ -41,25 +44,33 @@ enum class Encoding { kFlac = 4, }; +enum class Tag { + kTitle = 0, + kArtist = 1, + kAlbum = 2, + kAlbumTrack = 3, + kGenre = 4, +}; + /* * Owning container for tag-related track metadata that was extracted from a * file. */ -struct TrackTags { - Encoding encoding; - std::optional<std::string> title; - - // TODO(jacqueline): It would be nice to use shared_ptr's for the artist and - // album, since there's likely a fair number of duplicates for each - // (especially the former). +class TrackTags { + public: + auto encoding() const -> Encoding { return encoding_; }; + auto encoding(Encoding e) -> void { encoding_ = e; }; - std::optional<std::string> artist; - std::optional<std::string> album; + TrackTags() : encoding_(Encoding::kUnsupported) {} std::optional<int> channels; std::optional<int> sample_rate; std::optional<int> bits_per_sample; + auto set(const Tag& key, const std::string& val) -> void; + auto at(const Tag& key) const -> std::optional<shared_string>; + auto operator[](const Tag& key) const -> std::optional<shared_string>; + /* * Returns a hash of the 'identifying' tags of this track. That is, a hash * that can be used to determine if one track is likely the same as another, @@ -69,6 +80,12 @@ struct TrackTags { auto Hash() const -> uint64_t; bool operator==(const TrackTags&) const = default; + TrackTags& operator=(const TrackTags&) = default; + TrackTags(const TrackTags&) = default; + + private: + Encoding encoding_; + std::map<Tag, shared_string> tags_; }; /* @@ -156,6 +173,8 @@ class Track { auto data() const -> const TrackData& { return data_; } auto tags() const -> const TrackTags& { return tags_; } + auto TitleOrFilename() const -> shared_string; + bool operator==(const Track&) const = default; Track operator=(const Track& other) const { return Track(other); } |
