summaryrefslogtreecommitdiff
path: root/src/tangara/database/track.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-12-31 11:30:23 +1100
committerjacqueline <me@jacqueline.id.au>2024-12-31 11:30:23 +1100
commitb6b62cb8ea8121a3ae604b508c508a2a4994050a (patch)
tree7eb5f95f997f34bec841b27a00933c7ba803062f /src/tangara/database/track.cpp
parent407d2da049457e1e90fd136e36285061579015f5 (diff)
downloadtangara-fw-b6b62cb8ea8121a3ae604b508c508a2a4994050a.tar.gz
Handle synthesizing missing tag values in TrackTags instead of the indexer
Diffstat (limited to 'src/tangara/database/track.cpp')
-rw-r--r--src/tangara/database/track.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/tangara/database/track.cpp b/src/tangara/database/track.cpp
index 9f7da2d5..ad9db1ba 100644
--- a/src/tangara/database/track.cpp
+++ b/src/tangara/database/track.cpp
@@ -155,23 +155,23 @@ auto valueOrMonostate(std::optional<T> t) -> TagValue {
auto TrackTags::get(Tag t) const -> TagValue {
switch (t) {
case Tag::kTitle:
- return valueOrMonostate(title_);
+ return valueOrMonostate(title());
case Tag::kArtist:
- return valueOrMonostate(artist_);
+ return valueOrMonostate(artist());
case Tag::kAllArtists:
- return allArtists_;
+ return allArtists();
case Tag::kAlbum:
- return valueOrMonostate(album_);
+ return valueOrMonostate(album());
case Tag::kAlbumArtist:
- return valueOrMonostate(album_artist_);
+ return valueOrMonostate(albumArtist());
case Tag::kDisc:
- return valueOrMonostate(disc_);
+ return valueOrMonostate(disc());
case Tag::kTrack:
- return valueOrMonostate(track_);
+ return valueOrMonostate(track());
case Tag::kAlbumOrder:
return albumOrder();
case Tag::kGenres:
- return genres_;
+ return genres();
}
return std::monostate{};
}
@@ -240,6 +240,7 @@ auto TrackTags::artist() const -> const std::optional<std::pmr::string>& {
auto TrackTags::artist(std::string_view s) -> void {
artist_ = s;
+ maybeSynthesizeAllArtists();
}
auto TrackTags::allArtists() const -> std::span<const std::pmr::string> {
@@ -248,6 +249,7 @@ auto TrackTags::allArtists() const -> std::span<const std::pmr::string> {
auto TrackTags::allArtists(const std::string_view s) -> void {
parseDelimitedTags(s, kAllArtistDelimiters, allArtists_);
+ maybeSynthesizeAllArtists();
}
auto TrackTags::album() const -> const std::optional<std::pmr::string>& {
@@ -259,6 +261,9 @@ auto TrackTags::album(std::string_view s) -> void {
}
auto TrackTags::albumArtist() const -> const std::optional<std::pmr::string>& {
+ if (!album_artist_) {
+ return artist_;
+ }
return album_artist_;
}
@@ -320,6 +325,17 @@ auto TrackTags::Hash() const -> uint64_t {
return komihash_stream_final(&stream);
}
+/*
+ * Adds the current 'artist' tag to 'allArtists' if needed. Many tracks lack a
+ * fine-grained 'ARTISTS=' tag (or equivalent), but pushing down this nuance to
+ * consumers of TrackTags adds a lot of complexity.
+ */
+auto TrackTags::maybeSynthesizeAllArtists() -> void {
+ if (allArtists_.empty() && artist_) {
+ allArtists_.push_back(*artist_);
+ }
+}
+
auto database::TrackData::clone() const -> std::shared_ptr<TrackData> {
auto data = std::make_shared<TrackData>();
data->id = id;