Lyrics: fixed empty line parsing with timestamps

This commit is contained in:
emeric
2024-11-14 13:35:05 +01:00
parent 5504ee707c
commit ffc780d350
2 changed files with 33 additions and 2 deletions
+11 -2
View File
@@ -176,7 +176,7 @@ namespace lms::metadata
if (parseTag(trimmedLine, lyrics))
continue;
const std::string_view lyricText{ extractTimestamps(trimmedLine, timestamps) };
const std::string_view lyricsText{ extractTimestamps(trimmedLine, timestamps) };
// If there are timestamps, add as synchronized lyrics
if (!timestamps.empty())
@@ -188,7 +188,16 @@ namespace lms::metadata
applyAccumulatedLyrics();
for (std::chrono::milliseconds timestamp : timestamps)
lyrics.synchronizedLines.emplace(timestamp, lyricText);
{
auto itLine{ lyrics.synchronizedLines.find(timestamp) };
if (itLine != std::cend(lyrics.synchronizedLines))
{
itLine->second.push_back('\n');
itLine->second.append(lyricsText);
}
else
lyrics.synchronizedLines.emplace(timestamp, lyricsText);
}
lastTimestamps = timestamps;
}
+22
View File
@@ -271,6 +271,28 @@ SecondLine
EXPECT_EQ(lyrics.synchronizedLines.find(6s + 750ms)->second, "Foo");
}
TEST(Lyrics, synchronized_emptyLines)
{
std::istringstream is{ R"([00:03.30]Ooh, ooh
[00:03.30]
[00:06.75]
[00:06.75]Foo
)" };
const Lyrics lyrics{ parseLyrics(is) };
EXPECT_TRUE(lyrics.displayArtist.empty());
EXPECT_TRUE(lyrics.displayAlbum.empty());
EXPECT_TRUE(lyrics.displayTitle.empty());
EXPECT_EQ(lyrics.offset, std::chrono::milliseconds{ 0 });
EXPECT_EQ(lyrics.unsynchronizedLines.size(), 0);
ASSERT_EQ(lyrics.synchronizedLines.size(), 2);
ASSERT_TRUE(lyrics.synchronizedLines.contains(3s + 300ms));
EXPECT_EQ(lyrics.synchronizedLines.find(3s + 300ms)->second, "Ooh, ooh\n");
ASSERT_TRUE(lyrics.synchronizedLines.contains(6s + 750ms));
EXPECT_EQ(lyrics.synchronizedLines.find(6s + 750ms)->second, "\nFoo");
}
TEST(Lyrics, synchronized_multitimestamps)
{
std::istringstream is{ R"([00:03.30][00:09.16] [00:15.16]Ooh, ooh