From 2e4947dd423b9eee459db8746ca8ff5caa3a6312 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 6 Mar 2024 18:50:25 +0100 Subject: [PATCH] Always use the provided custom delimiters to split tags --- approot/messages.xml | 4 +-- approot/messages_fr.xml | 4 +-- approot/messages_it.xml | 4 +-- src/libs/metadata/impl/AvFormatTagReader.hpp | 1 - src/libs/metadata/impl/ITagReader.hpp | 2 -- src/libs/metadata/impl/Parser.cpp | 28 +++++++++----------- src/libs/metadata/impl/TagLibTagReader.cpp | 2 -- src/libs/metadata/impl/TagLibTagReader.hpp | 2 -- src/libs/metadata/test/Parser.cpp | 20 -------------- src/libs/metadata/test/TestTagReader.hpp | 21 --------------- 10 files changed, 18 insertions(+), 70 deletions(-) diff --git a/approot/messages.xml b/approot/messages.xml index d774dec0..77d99d7f 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -64,9 +64,9 @@ Root directory -Delimiter to be used for splitting artist tags (only if the file does not contain any multi-valued tag) +Delimiter to be used for splitting artist tags Daily -Delimiter to be used for splitting other tags (only if the file does not contain any multi-valued tag) +Delimiter to be used for splitting other tags Extra tags to scan (use ; as separator) Hourly Scan now! diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index c4af2527..3629fc1a 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -64,9 +64,9 @@ Répertoire racine -Délimiteur à utiliser pour séparer les tags d'artistes (uniquement si le fichier ne contient pas de tag à valeurs multiples) +Délimiteur à utiliser pour séparer les tags d'artistes Tous les jours -Délimiteur à utiliser pour séparer les autres tags (uniquement si le fichier ne contient pas de tag à valeurs multiples) +Délimiteur à utiliser pour séparer les autres tags Tags supplémentaires à scanner (utiliser ; comme séparateur) Toutes les heures Scanner maintenant ! diff --git a/approot/messages_it.xml b/approot/messages_it.xml index f7136b27..b16fba7e 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -64,9 +64,9 @@ Cartella principale -Delimitatore da utilizzare per separare i tag degli artisti (solo se il file non contiene alcun tag con valori multipli) +Delimitatore da utilizzare per separare i tag degli artisti Giornaliera -Delimitatore da utilizzare per separare gli altri tag (solo se il file non contiene alcun tag con valori multipli) +Delimitatore da utilizzare per separare gli altri tag Tag aggiuntivi da scansionare (usa ; come separatore) Ogni ora Scansiona ora! diff --git a/src/libs/metadata/impl/AvFormatTagReader.hpp b/src/libs/metadata/impl/AvFormatTagReader.hpp index d2039eb4..7172a5a6 100644 --- a/src/libs/metadata/impl/AvFormatTagReader.hpp +++ b/src/libs/metadata/impl/AvFormatTagReader.hpp @@ -36,7 +36,6 @@ namespace MetaData AvFormatTagReader(const AvFormatTagReader&) = delete; AvFormatTagReader& operator=(const AvFormatTagReader&) = delete; - bool hasMultiValuedTags() const override { return false; /* not supported */} void visitTagValues(TagType tag, TagValueVisitor visitor) const override; void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override; void visitPerformerTags(PerformerVisitor visitor) const override; diff --git a/src/libs/metadata/impl/ITagReader.hpp b/src/libs/metadata/impl/ITagReader.hpp index ef0dbf14..91b8e7b6 100644 --- a/src/libs/metadata/impl/ITagReader.hpp +++ b/src/libs/metadata/impl/ITagReader.hpp @@ -145,8 +145,6 @@ namespace MetaData public: virtual ~ITagReader() = default; - virtual bool hasMultiValuedTags() const = 0; - using TagValueVisitor = std::function; virtual void visitTagValues(TagType tag, TagValueVisitor visitor) const = 0; virtual void visitTagValues(std::string_view tag, TagValueVisitor visitor) const = 0; diff --git a/src/libs/metadata/impl/Parser.cpp b/src/libs/metadata/impl/Parser.cpp index 80a10e66..f9744434 100644 --- a/src/libs/metadata/impl/Parser.cpp +++ b/src/libs/metadata/impl/Parser.cpp @@ -44,19 +44,18 @@ namespace MetaData visitor(tag); } }; - if (!tagReader.hasMultiValuedTags()) + for (std::string_view tagDelimiter : tagDelimiters) { - for (std::string_view tagDelimiter : tagDelimiters) + if (value.find(tagDelimiter) != std::string_view::npos) { - if (value.find(tagDelimiter) != std::string_view::npos) - { - for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter)) - visitTagIfNonEmpty(splitTag); - return; - } + for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter)) + visitTagIfNonEmpty(splitTag); + + return; } } + // no delimiter found, or no delimiter to be used visitTagIfNonEmpty(value); }); } @@ -81,17 +80,14 @@ namespace MetaData tagReader.visitTagValues(tagType, [&](std::string_view value) { - if (!tagReader.hasMultiValuedTags()) + for (std::string_view tagDelimiter : tagDelimiters) { - for (std::string_view tagDelimiter : tagDelimiters) + if (value.find(tagDelimiter) != std::string_view::npos) { - if (value.find(tagDelimiter) != std::string_view::npos) - { - for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter)) - addTagIfNonEmpty(splitTag); + for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter)) + addTagIfNonEmpty(splitTag); - return; - } + return; } } diff --git a/src/libs/metadata/impl/TagLibTagReader.cpp b/src/libs/metadata/impl/TagLibTagReader.cpp index a44743a4..97ebb9d2 100644 --- a/src/libs/metadata/impl/TagLibTagReader.cpp +++ b/src/libs/metadata/impl/TagLibTagReader.cpp @@ -293,8 +293,6 @@ namespace MetaData for (const auto& value : _propertyMap.unsupportedData()) LMS_LOG(METADATA, DEBUG, "Unknown value: '" << value.to8Bit(true) << "'"); } - - _hasMultiValuedTags = std::any_of(std::cbegin(_propertyMap), std::cend(_propertyMap), [](const auto& entry) { return entry.second.size() > 1; }); } void TagLibTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const diff --git a/src/libs/metadata/impl/TagLibTagReader.hpp b/src/libs/metadata/impl/TagLibTagReader.hpp index faf535a3..cc3dd304 100644 --- a/src/libs/metadata/impl/TagLibTagReader.hpp +++ b/src/libs/metadata/impl/TagLibTagReader.hpp @@ -38,7 +38,6 @@ namespace MetaData TagLibTagReader(const TagLibTagReader&) = delete; TagLibTagReader& operator=(const TagLibTagReader&) = delete; - bool hasMultiValuedTags() const override { return _hasMultiValuedTags; } void visitTagValues(TagType tag, TagValueVisitor visitor) const override; void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override; void visitPerformerTags(PerformerVisitor visitor) const override; @@ -52,6 +51,5 @@ namespace MetaData TagLib::FileRef _file; TagLib::PropertyMap _propertyMap; // case-insensitive keys bool _hasEmbeddedCover{}; - bool _hasMultiValuedTags{}; }; } // namespace MetaData diff --git a/src/libs/metadata/test/Parser.cpp b/src/libs/metadata/test/Parser.cpp index e1e67ff3..919d9d59 100644 --- a/src/libs/metadata/test/Parser.cpp +++ b/src/libs/metadata/test/Parser.cpp @@ -246,24 +246,4 @@ namespace MetaData EXPECT_EQ(track->artists[1].name, "Other Artist"); EXPECT_EQ(track->artistDisplayName, "This / is ; One Artist \\ Other Artist"); } - - TEST(Parser, customDelimiters_notWithMultiValuedTags) - { - const TestTagReader testTags{ - { - { TagType::Genre, { "Genre1 ; Genre2" } }, - { TagType::Language, { "Lang1", "Lang2" } }, - } - }; - - Parser parser; - static_cast(parser).setDefaultTagDelimiters(std::vector{ " ; " }); - std::unique_ptr track{ parser.parse(testTags) }; - - ASSERT_EQ(track->genres.size(), 1); - EXPECT_EQ(track->genres[0], "Genre1 ; Genre2"); - ASSERT_EQ(track->languages.size(), 2); - EXPECT_EQ(track->languages[0], "Lang1"); - EXPECT_EQ(track->languages[1], "Lang2"); - } } diff --git a/src/libs/metadata/test/TestTagReader.hpp b/src/libs/metadata/test/TestTagReader.hpp index 23d8b8ae..68686176 100644 --- a/src/libs/metadata/test/TestTagReader.hpp +++ b/src/libs/metadata/test/TestTagReader.hpp @@ -25,18 +25,6 @@ namespace MetaData { - namespace - { - template - bool tagMapHasMultiValuedTags(const TagMapType& m) - { - return std::any_of(std::cbegin(m), std::cend(m), [](const auto& tagPair) - { - return tagPair.second.size() > 1; - }); - } - } - class TestTagReader : public ITagReader { public: @@ -53,14 +41,6 @@ namespace MetaData , _performers{ std::move(performers) } , _extraUserTags{ std::move(extraUserTags) } { - _hasMultiValuedTags = tagMapHasMultiValuedTags(_tags) - || tagMapHasMultiValuedTags(_performers) - || tagMapHasMultiValuedTags(_extraUserTags); - } - - bool hasMultiValuedTags() const override - { - return _hasMultiValuedTags; } void visitTagValues(TagType tag, TagValueVisitor visitor) const override @@ -102,6 +82,5 @@ namespace MetaData const Tags _tags; const Performers _performers; const ExtraUserTags _extraUserTags; - bool _hasMultiValuedTags; }; } \ No newline at end of file