From 01eb8683733f39a6de984111f035bb8f71dcf8b8 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 12 Dec 2023 12:59:38 +1100 Subject: Support more datatypes in track tags --- src/database/include/database.hpp | 5 +--- src/database/include/index.hpp | 2 +- src/database/include/track.hpp | 63 +++++++++++++++++++++++++++++---------- 3 files changed, 49 insertions(+), 21 deletions(-) (limited to 'src/database/include') diff --git a/src/database/include/database.hpp b/src/database/include/database.hpp index c75dbf96..88a18e17 100644 --- a/src/database/include/database.hpp +++ b/src/database/include/database.hpp @@ -87,8 +87,6 @@ class Database { leveldb::DB* db_; leveldb::Cache* cache_; - std::shared_ptr worker_task_; - // Not owned. IFileGatherer& file_gatherer_; ITagParser& tag_parser_; @@ -98,8 +96,7 @@ class Database { leveldb::Cache* cache, IFileGatherer& file_gatherer, ITagParser& tag_parser, - locale::ICollator& collator, - std::shared_ptr worker); + locale::ICollator& collator); auto dbMintNewTrackId() -> TrackId; diff --git a/src/database/include/index.hpp b/src/database/include/index.hpp index 15b21ee8..45dae464 100644 --- a/src/database/include/index.hpp +++ b/src/database/include/index.hpp @@ -62,7 +62,7 @@ struct IndexKey { }; auto Index(locale::ICollator&, const IndexInfo&, const Track&) - -> std::vector>; + -> std::vector>; auto ExpandHeader(const IndexKey::Header&, const std::optional&) -> IndexKey::Header; diff --git a/src/database/include/track.hpp b/src/database/include/track.hpp index 0497c94d..610ab487 100644 --- a/src/database/include/track.hpp +++ b/src/database/include/track.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include "leveldb/db.h" #include "memory_resource.hpp" @@ -51,12 +52,21 @@ enum class Tag { kTitle = 0, kArtist = 1, kAlbum = 2, - kAlbumTrack = 3, - kGenre = 4, - kDuration = 5, + kAlbumArtist = 3, + kDisc = 4, + kTrack = 5, + kAlbumOrder = 6, + kGenres = 7, }; -auto TagToString(Tag t) -> std::string; +using TagValue = std::variant>; + +auto tagName(Tag) -> std::string; +auto tagHash(const TagValue&) -> uint64_t; +auto tagToString(const TagValue&) -> std::string; /* * Owning container for tag-related track metadata that was extracted from a @@ -65,29 +75,43 @@ auto TagToString(Tag t) -> std::string; class TrackTags { public: TrackTags() - : encoding_(Container::kUnsupported), tags_(&memory::kSpiRamResource) {} + : encoding_(Container::kUnsupported), genres_(&memory::kSpiRamResource) {} TrackTags(const TrackTags& other) = delete; TrackTags& operator=(TrackTags& other) = delete; bool operator==(const TrackTags&) const = default; + auto get(Tag) const -> TagValue; + auto set(Tag, std::string_view) -> void; + + auto allPresent() const -> std::vector; + auto encoding() const -> Container { return encoding_; }; auto encoding(Container e) -> void { encoding_ = e; }; - std::optional channels; - std::optional sample_rate; - std::optional bits_per_sample; + auto title() const -> const std::optional&; + auto title(std::string_view) -> void; + + auto artist() const -> const std::optional&; + auto artist(std::string_view) -> void; - std::optional duration; + auto album() const -> const std::optional&; + auto album(std::string_view) -> void; - auto set(const Tag& key, const std::pmr::string& val) -> void; - auto at(const Tag& key) const -> std::optional; - auto operator[](const Tag& key) const -> std::optional; + auto albumArtist() const -> const std::optional&; + auto albumArtist(std::string_view) -> void; - auto tags() const -> const std::pmr::unordered_map& { - return tags_; - } + auto disc() const -> const std::optional&; + auto disc(const std::string_view) -> void; + + auto track() const -> const std::optional&; + auto track(const std::string_view) -> void; + + auto albumOrder() const -> uint32_t; + + auto genres() const -> cpp::span; + auto genres(const std::string_view) -> void; /* * Returns a hash of the 'identifying' tags of this track. That is, a hash @@ -99,7 +123,14 @@ class TrackTags { private: Container encoding_; - std::pmr::unordered_map tags_; + + std::optional title_; + std::optional artist_; + std::optional album_; + std::optional album_artist_; + std::optional disc_; + std::optional track_; + std::pmr::vector genres_; }; /* -- cgit v1.2.3