Always use the provided custom delimiters to split tags
This commit is contained in:
@@ -64,9 +64,9 @@
|
|||||||
<message id="Lms.Admin.MediaLibrary.root-path">Root directory</message>
|
<message id="Lms.Admin.MediaLibrary.root-path">Root directory</message>
|
||||||
|
|
||||||
<!--Scan settings-->
|
<!--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.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.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.hourly">Hourly</message>
|
||||||
<message id="Lms.Admin.Database.immediate-scan">Scan now!</message>
|
<message id="Lms.Admin.Database.immediate-scan">Scan now!</message>
|
||||||
|
|||||||
@@ -64,9 +64,9 @@
|
|||||||
<message id="Lms.Admin.MediaLibrary.root-path">Répertoire racine</message>
|
<message id="Lms.Admin.MediaLibrary.root-path">Répertoire racine</message>
|
||||||
|
|
||||||
<!--Scan settings-->
|
<!--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.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.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.hourly">Toutes les heures</message>
|
||||||
<message id="Lms.Admin.Database.immediate-scan">Scanner maintenant !</message>
|
<message id="Lms.Admin.Database.immediate-scan">Scanner maintenant !</message>
|
||||||
|
|||||||
@@ -64,9 +64,9 @@
|
|||||||
<message id="Lms.Admin.MediaLibrary.root-path">Cartella principale</message>
|
<message id="Lms.Admin.MediaLibrary.root-path">Cartella principale</message>
|
||||||
|
|
||||||
<!--Scan settings-->
|
<!--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.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.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.hourly">Ogni ora</message>
|
||||||
<message id="Lms.Admin.Database.immediate-scan">Scansiona ora!</message>
|
<message id="Lms.Admin.Database.immediate-scan">Scansiona ora!</message>
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ namespace MetaData
|
|||||||
AvFormatTagReader(const AvFormatTagReader&) = delete;
|
AvFormatTagReader(const AvFormatTagReader&) = delete;
|
||||||
AvFormatTagReader& operator=(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(TagType tag, TagValueVisitor visitor) const override;
|
||||||
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
||||||
void visitPerformerTags(PerformerVisitor visitor) const override;
|
void visitPerformerTags(PerformerVisitor visitor) const override;
|
||||||
|
|||||||
@@ -145,8 +145,6 @@ namespace MetaData
|
|||||||
public:
|
public:
|
||||||
virtual ~ITagReader() = default;
|
virtual ~ITagReader() = default;
|
||||||
|
|
||||||
virtual bool hasMultiValuedTags() const = 0;
|
|
||||||
|
|
||||||
using TagValueVisitor = std::function<void(std::string_view value)>;
|
using TagValueVisitor = std::function<void(std::string_view value)>;
|
||||||
virtual void visitTagValues(TagType tag, TagValueVisitor visitor) const = 0;
|
virtual void visitTagValues(TagType tag, TagValueVisitor visitor) const = 0;
|
||||||
virtual void visitTagValues(std::string_view tag, TagValueVisitor visitor) const = 0;
|
virtual void visitTagValues(std::string_view tag, TagValueVisitor visitor) const = 0;
|
||||||
|
|||||||
@@ -44,19 +44,18 @@ namespace MetaData
|
|||||||
visitor(tag);
|
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);
|
||||||
for (std::string_view splitTag : StringUtils::splitString(value, tagDelimiter))
|
|
||||||
visitTagIfNonEmpty(splitTag);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no delimiter found, or no delimiter to be used
|
||||||
visitTagIfNonEmpty(value);
|
visitTagIfNonEmpty(value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -81,17 +80,14 @@ namespace MetaData
|
|||||||
|
|
||||||
tagReader.visitTagValues(tagType, [&](std::string_view value)
|
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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -293,8 +293,6 @@ namespace MetaData
|
|||||||
for (const auto& value : _propertyMap.unsupportedData())
|
for (const auto& value : _propertyMap.unsupportedData())
|
||||||
LMS_LOG(METADATA, DEBUG, "Unknown value: '" << value.to8Bit(true) << "'");
|
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
|
void TagLibTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ namespace MetaData
|
|||||||
TagLibTagReader(const TagLibTagReader&) = delete;
|
TagLibTagReader(const TagLibTagReader&) = delete;
|
||||||
TagLibTagReader& operator=(const TagLibTagReader&) = delete;
|
TagLibTagReader& operator=(const TagLibTagReader&) = delete;
|
||||||
|
|
||||||
bool hasMultiValuedTags() const override { return _hasMultiValuedTags; }
|
|
||||||
void visitTagValues(TagType tag, TagValueVisitor visitor) const override;
|
void visitTagValues(TagType tag, TagValueVisitor visitor) const override;
|
||||||
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
void visitTagValues(std::string_view tag, TagValueVisitor visitor) const override;
|
||||||
void visitPerformerTags(PerformerVisitor visitor) const override;
|
void visitPerformerTags(PerformerVisitor visitor) const override;
|
||||||
@@ -52,6 +51,5 @@ namespace MetaData
|
|||||||
TagLib::FileRef _file;
|
TagLib::FileRef _file;
|
||||||
TagLib::PropertyMap _propertyMap; // case-insensitive keys
|
TagLib::PropertyMap _propertyMap; // case-insensitive keys
|
||||||
bool _hasEmbeddedCover{};
|
bool _hasEmbeddedCover{};
|
||||||
bool _hasMultiValuedTags{};
|
|
||||||
};
|
};
|
||||||
} // namespace MetaData
|
} // namespace MetaData
|
||||||
|
|||||||
@@ -246,24 +246,4 @@ namespace MetaData
|
|||||||
EXPECT_EQ(track->artists[1].name, "Other 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");
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,18 +25,6 @@
|
|||||||
|
|
||||||
namespace MetaData
|
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
|
class TestTagReader : public ITagReader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -53,14 +41,6 @@ namespace MetaData
|
|||||||
, _performers{ std::move(performers) }
|
, _performers{ std::move(performers) }
|
||||||
, _extraUserTags{ std::move(extraUserTags) }
|
, _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
|
void visitTagValues(TagType tag, TagValueVisitor visitor) const override
|
||||||
@@ -102,6 +82,5 @@ namespace MetaData
|
|||||||
const Tags _tags;
|
const Tags _tags;
|
||||||
const Performers _performers;
|
const Performers _performers;
|
||||||
const ExtraUserTags _extraUserTags;
|
const ExtraUserTags _extraUserTags;
|
||||||
bool _hasMultiValuedTags;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user