Reconstruct the artist display name using comma instead of custom separators (nicer display), fixes #445
This commit is contained in:
@@ -172,6 +172,15 @@ namespace lms::metadata
|
||||
}
|
||||
}
|
||||
|
||||
size_t AvFormatTagReader::countTagValues(TagType tag) const
|
||||
{
|
||||
size_t count{};
|
||||
visitTagValues(tag, [&](std::string_view) {
|
||||
count++;
|
||||
});
|
||||
return count;
|
||||
}
|
||||
|
||||
void AvFormatTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const
|
||||
{
|
||||
auto itTagNames{ tagMapping.find(tag) };
|
||||
|
||||
@@ -37,6 +37,7 @@ namespace lms::metadata
|
||||
AvFormatTagReader(const AvFormatTagReader&) = delete;
|
||||
AvFormatTagReader& operator=(const AvFormatTagReader&) = delete;
|
||||
|
||||
size_t countTagValues(TagType tag) const override;
|
||||
void visitTagValues(TagType tag, TagValueVisitor visitor) const override;
|
||||
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
||||
void visitPerformerTags(PerformerVisitor visitor) const override;
|
||||
|
||||
@@ -148,6 +148,7 @@ namespace lms::metadata
|
||||
virtual ~ITagReader() = default;
|
||||
|
||||
using TagValueVisitor = std::function<void(std::string_view value)>;
|
||||
virtual size_t countTagValues(TagType tag) const = 0;
|
||||
virtual void visitTagValues(TagType tag, TagValueVisitor visitor) const = 0;
|
||||
virtual void visitTagValues(std::string_view tag, TagValueVisitor visitor) const = 0;
|
||||
|
||||
|
||||
@@ -276,7 +276,6 @@ namespace lms::metadata
|
||||
track.copyright = getTagValueAs<std::string>(tagReader, TagType::Copyright).value_or("");
|
||||
track.copyrightURL = getTagValueAs<std::string>(tagReader, TagType::CopyrightURL).value_or("");
|
||||
track.replayGain = getTagValueAs<float>(tagReader, TagType::ReplayGainTrackGain);
|
||||
track.artistDisplayName = getTagValueAs<std::string>(tagReader, TagType::Artist).value_or(""); // TODO join on artists if present
|
||||
|
||||
for (const std::string& userExtraTag : _userExtraTags)
|
||||
{
|
||||
@@ -297,6 +296,19 @@ namespace lms::metadata
|
||||
|
||||
track.medium = getMedium(tagReader);
|
||||
track.artists = getArtists(tagReader, { TagType::Artists, TagType::Artist }, { TagType::ArtistSortOrder }, { TagType::MusicBrainzArtistID }, _artistTagDelimiters);
|
||||
if (!_artistTagDelimiters.empty()
|
||||
&& track.artists.size() > 1
|
||||
&& tagReader.countTagValues(TagType::Artist) <= 1
|
||||
&& tagReader.countTagValues(TagType::Artists) <= 1)
|
||||
{
|
||||
std::vector<std::string_view> artistNames;
|
||||
std::transform(std::cbegin(track.artists), std::cend(track.artists), std::back_inserter(artistNames), [](const Artist& artist) -> std::string_view { return artist.name; });
|
||||
track.artistDisplayName = core::stringUtils::joinStrings(artistNames, ", ");
|
||||
}
|
||||
else
|
||||
{
|
||||
track.artistDisplayName = getTagValueAs<std::string>(tagReader, TagType::Artist).value_or("");
|
||||
}
|
||||
track.conductorArtists = getArtists(tagReader, { TagType::Conductors, TagType::Conductor }, { TagType::ConductorsSortOrder, TagType::ConductorSortOrder }, {}, _artistTagDelimiters);
|
||||
track.composerArtists = getArtists(tagReader, { TagType::Composers, TagType::Composer }, { TagType::ComposersSortOrder, TagType::ComposerSortOrder }, {}, _artistTagDelimiters);
|
||||
track.lyricistArtists = getArtists(tagReader, { TagType::Lyricists, TagType::Lyricist }, { TagType::LyricistsSortOrder, TagType::LyricistSortOrder }, {}, _artistTagDelimiters);
|
||||
|
||||
@@ -340,6 +340,15 @@ namespace lms::metadata
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t TagLibTagReader::countTagValues(TagType tag) const
|
||||
{
|
||||
size_t count{};
|
||||
visitTagValues(tag, [&](std::string_view) {
|
||||
count++;
|
||||
});
|
||||
return count;
|
||||
}
|
||||
|
||||
void TagLibTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const
|
||||
{
|
||||
auto itTagNames{ tagMapping.find(tag) };
|
||||
|
||||
@@ -40,6 +40,7 @@ namespace lms::metadata
|
||||
TagLibTagReader& operator=(const TagLibTagReader&) = delete;
|
||||
|
||||
void computeAudioProperties();
|
||||
size_t countTagValues(TagType tag) const override;
|
||||
void visitTagValues(TagType tag, TagValueVisitor visitor) const override;
|
||||
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
||||
void visitPerformerTags(PerformerVisitor visitor) const override;
|
||||
|
||||
@@ -250,6 +250,6 @@ namespace lms::metadata
|
||||
ASSERT_EQ(track->artists.size(), 2);
|
||||
EXPECT_EQ(track->artists[0].name, "This / is ; One Artist");
|
||||
EXPECT_EQ(track->artists[1].name, "Other Artist");
|
||||
EXPECT_EQ(track->artistDisplayName, "This / is ; One Artist \\ Other Artist");
|
||||
EXPECT_EQ(track->artistDisplayName, "This / is ; One Artist, Other Artist"); // reconstruct artist display name since a custom delimiter is hit
|
||||
}
|
||||
} // namespace lms::metadata
|
||||
|
||||
@@ -47,6 +47,15 @@ namespace lms::metadata
|
||||
{
|
||||
}
|
||||
|
||||
size_t countTagValues(TagType tag) const
|
||||
{
|
||||
auto itValues{ _tags.find(tag) };
|
||||
if (itValues != std::cend(_tags))
|
||||
return itValues->second.size();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void visitTagValues(TagType tag, TagValueVisitor visitor) const override
|
||||
{
|
||||
auto itValues{ _tags.find(tag) };
|
||||
|
||||
Reference in New Issue
Block a user