Fixed bad handling of utf8 bom for playslit files, fixes #694

This commit is contained in:
emeric
2025-06-25 13:55:45 +02:00
parent 6e4fbdc353
commit d1caed200b
4 changed files with 33 additions and 7 deletions
+10 -5
View File
@@ -155,15 +155,20 @@ namespace lms::metadata
accumulatedLyrics.clear();
};
bool firstLine{ true };
std::string line;
while (std::getline(is, line))
{
std::string_view trimmedLine{ core::stringUtils::stringTrimEnd(line) };
// Remove potential UTF8 BOM
constexpr std::string_view utf8BOM{ "\xEF\xBB\xBF" };
if (trimmedLine.starts_with(utf8BOM))
trimmedLine = trimmedLine.substr(utf8BOM.size());
if (firstLine)
{
firstLine = false;
constexpr std::string_view utf8BOM{ "\xEF\xBB\xBF" };
if (line.starts_with(utf8BOM))
line.erase(0, utf8BOM.size());
}
std::string_view trimmedLine{ core::stringUtils::stringTrimEnd(line) };
// Skip comments
if (!trimmedLine.empty() && trimmedLine.front() == '#')
+10
View File
@@ -63,11 +63,21 @@ namespace lms::metadata
PlayList parsePlayList(std::istream& is)
{
bool firstLine{ true };
PlayList playlist;
std::string line;
while (std::getline(is, line))
{
// Remove potential UTF8 BOM
if (firstLine)
{
firstLine = false;
constexpr std::string_view utf8BOM{ "\xEF\xBB\xBF" };
if (line.starts_with(utf8BOM))
line.erase(0, utf8BOM.size());
}
const std::string_view trimmedLine{ core::stringUtils::stringTrim(line) };
if (trimmedLine.empty())
continue;
+13
View File
@@ -19,6 +19,7 @@
*/
#include <gtest/gtest.h>
#include <sstream>
#include "metadata/PlayList.hpp"
@@ -51,4 +52,16 @@ one to be/../one to be/normalized/foo.mp3)" };
EXPECT_EQ(playlist.files[4], "and another one/with relative path/foo.mp3");
EXPECT_EQ(playlist.files[5], "one to be/normalized/foo.mp3");
}
TEST(PlayList, UTF8_bom)
{
const unsigned char content[] = { 0xEF, 0xBB, 0xBF, '#', 'E', 'X', 'T', 'M', '3', 'U', '\r', '\n', '\r', '\n', '.', '.', '/', 't', 'e', 's', 't', '.', 'm', 'p', '3', '\r', '\n' };
std::istringstream is{ std::string(reinterpret_cast<const char*>(content), sizeof(content)) };
const PlayList playlist{ parsePlayList(is) };
EXPECT_EQ(playlist.name, "");
ASSERT_EQ(playlist.files.size(), 1);
EXPECT_EQ(playlist.files[0], "../test.mp3");
}
} // namespace lms::metadata::tests
@@ -134,9 +134,7 @@ namespace lms::scanner
if (track)
playListAssociation.tracks.push_back(TrackInfo{ .trackId = track->getId(), .releaseId = track->getReleaseId() });
else
{
pendingErrors.emplace_back(std::make_shared<PlayListFilePathMissingError>(playListFile->getAbsoluteFilePath(), file));
}
}
if (pendingErrors.size() == files.size())