summaryrefslogtreecommitdiff
path: root/src/database/include
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-12-12 12:59:38 +1100
committerjacqueline <me@jacqueline.id.au>2023-12-12 12:59:38 +1100
commit01eb8683733f39a6de984111f035bb8f71dcf8b8 (patch)
treefb682164eb781a26d1798294180632e63a724f52 /src/database/include
parentbd730c82b0423af65f7148bb4abe01e1c3430691 (diff)
downloadtangara-fw-01eb8683733f39a6de984111f035bb8f71dcf8b8.tar.gz
Support more datatypes in track tags
Diffstat (limited to 'src/database/include')
-rw-r--r--src/database/include/database.hpp5
-rw-r--r--src/database/include/index.hpp2
-rw-r--r--src/database/include/track.hpp63
3 files changed, 49 insertions, 21 deletions
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<tasks::Worker> 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<tasks::Worker> 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::pair<IndexKey, std::pmr::string>>;
+ -> std::vector<std::pair<IndexKey, std::string>>;
auto ExpandHeader(const IndexKey::Header&,
const std::optional<std::pmr::string>&) -> 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 <string>
#include <unordered_map>
#include <utility>
+#include <variant>
#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<std::monostate,
+ std::pmr::string,
+ uint32_t,
+ cpp::span<const std::pmr::string>>;
+
+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<Tag>;
+
auto encoding() const -> Container { return encoding_; };
auto encoding(Container e) -> void { encoding_ = e; };
- std::optional<int> channels;
- std::optional<int> sample_rate;
- std::optional<int> bits_per_sample;
+ auto title() const -> const std::optional<std::pmr::string>&;
+ auto title(std::string_view) -> void;
+
+ auto artist() const -> const std::optional<std::pmr::string>&;
+ auto artist(std::string_view) -> void;
- std::optional<int> duration;
+ auto album() const -> const std::optional<std::pmr::string>&;
+ 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<std::pmr::string>;
- auto operator[](const Tag& key) const -> std::optional<std::pmr::string>;
+ auto albumArtist() const -> const std::optional<std::pmr::string>&;
+ auto albumArtist(std::string_view) -> void;
- auto tags() const -> const std::pmr::unordered_map<Tag, std::pmr::string>& {
- return tags_;
- }
+ auto disc() const -> const std::optional<uint8_t>&;
+ auto disc(const std::string_view) -> void;
+
+ auto track() const -> const std::optional<uint16_t>&;
+ auto track(const std::string_view) -> void;
+
+ auto albumOrder() const -> uint32_t;
+
+ auto genres() const -> cpp::span<const std::pmr::string>;
+ 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<Tag, std::pmr::string> tags_;
+
+ std::optional<std::pmr::string> title_;
+ std::optional<std::pmr::string> artist_;
+ std::optional<std::pmr::string> album_;
+ std::optional<std::pmr::string> album_artist_;
+ std::optional<uint8_t> disc_;
+ std::optional<uint16_t> track_;
+ std::pmr::vector<std::pmr::string> genres_;
};
/*