Always use the provided custom delimiters to split tags

This commit is contained in:
emeric
2024-03-06 18:50:25 +01:00
parent 8c3dfd7a2f
commit 2e4947dd42
10 changed files with 18 additions and 70 deletions
+2 -2
View File
@@ -64,9 +64,9 @@
<message id="Lms.Admin.MediaLibrary.root-path">Root directory</message>
<!--Scan settings-->
<message id="Lms.Admin.Database.artist-tag-delimiter">Delimiter to be used for splitting artist tags (only if the file does not contain any multi-valued tag)</message>
<message id="Lms.Admin.Database.artist-tag-delimiter">Delimiter to be used for splitting artist tags</message>
<message id="Lms.Admin.Database.daily">Daily</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Delimiter to be used for splitting other tags (only if the file does not contain any multi-valued tag)</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Delimiter to be used for splitting other tags</message>
<message id="Lms.Admin.Database.extra-tags-to-scan">Extra tags to scan (use <kbd>;</kbd> as separator)</message>
<message id="Lms.Admin.Database.hourly">Hourly</message>
<message id="Lms.Admin.Database.immediate-scan">Scan now!</message>
+2 -2
View File
@@ -64,9 +64,9 @@
<message id="Lms.Admin.MediaLibrary.root-path">Répertoire racine</message>
<!--Scan settings-->
<message id="Lms.Admin.Database.artist-tag-delimiter">Délimiteur à utiliser pour séparer les tags d'artistes (uniquement si le fichier ne contient pas de tag à valeurs multiples)</message>
<message id="Lms.Admin.Database.artist-tag-delimiter">Délimiteur à utiliser pour séparer les tags d'artistes</message>
<message id="Lms.Admin.Database.daily">Tous les jours</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Délimiteur à utiliser pour séparer les autres tags (uniquement si le fichier ne contient pas de tag à valeurs multiples)</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Délimiteur à utiliser pour séparer les autres tags</message>
<message id="Lms.Admin.Database.extra-tags-to-scan">Tags supplémentaires à scanner (utiliser <kbd>;</kbd> comme séparateur)</message>
<message id="Lms.Admin.Database.hourly">Toutes les heures</message>
<message id="Lms.Admin.Database.immediate-scan">Scanner maintenant !</message>
+2 -2
View File
@@ -64,9 +64,9 @@
<message id="Lms.Admin.MediaLibrary.root-path">Cartella principale</message>
<!--Scan settings-->
<message id="Lms.Admin.Database.artist-tag-delimiter">Delimitatore da utilizzare per separare i tag degli artisti (solo se il file non contiene alcun tag con valori multipli)</message>
<message id="Lms.Admin.Database.artist-tag-delimiter">Delimitatore da utilizzare per separare i tag degli artisti</message>
<message id="Lms.Admin.Database.daily">Giornaliera</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Delimitatore da utilizzare per separare gli altri tag (solo se il file non contiene alcun tag con valori multipli)</message>
<message id="Lms.Admin.Database.default-tag-delimiter">Delimitatore da utilizzare per separare gli altri tag</message>
<message id="Lms.Admin.Database.extra-tags-to-scan">Tag aggiuntivi da scansionare (usa <kbd>;</kbd> come separatore)</message>
<message id="Lms.Admin.Database.hourly">Ogni ora</message>
<message id="Lms.Admin.Database.immediate-scan">Scansiona ora!</message>
@@ -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;
-2
View File
@@ -145,8 +145,6 @@ namespace MetaData
public:
virtual ~ITagReader() = default;
virtual bool hasMultiValuedTags() const = 0;
using TagValueVisitor = std::function<void(std::string_view value)>;
virtual void visitTagValues(TagType tag, TagValueVisitor visitor) const = 0;
virtual void visitTagValues(std::string_view tag, TagValueVisitor visitor) const = 0;
+2 -6
View File
@@ -44,19 +44,18 @@ namespace MetaData
visitor(tag);
} };
if (!tagReader.hasMultiValuedTags())
{
for (std::string_view tagDelimiter : tagDelimiters)
{
if (value.find(tagDelimiter) != std::string_view::npos)
{
for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter))
visitTagIfNonEmpty(splitTag);
return;
}
}
}
// no delimiter found, or no delimiter to be used
visitTagIfNonEmpty(value);
});
}
@@ -80,8 +79,6 @@ namespace MetaData
} };
tagReader.visitTagValues(tagType, [&](std::string_view value)
{
if (!tagReader.hasMultiValuedTags())
{
for (std::string_view tagDelimiter : tagDelimiters)
{
@@ -93,7 +90,6 @@ namespace MetaData
return;
}
}
}
// no delimiter found, or no delimiter to be used
addTagIfNonEmpty(value);
@@ -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
@@ -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
-20
View File
@@ -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<IParser&>(parser).setDefaultTagDelimiters(std::vector<std::string>{ " ; " });
std::unique_ptr<Track> 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");
}
}
-21
View File
@@ -25,18 +25,6 @@
namespace MetaData
{
namespace
{
template <typename TagMapType>
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;
};
}