diff --git a/src/libs/metadata/impl/Lyrics.cpp b/src/libs/metadata/impl/Lyrics.cpp index f2dc67e6..10b0d86b 100644 --- a/src/libs/metadata/impl/Lyrics.cpp +++ b/src/libs/metadata/impl/Lyrics.cpp @@ -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; } diff --git a/src/libs/metadata/test/Lyrics.cpp b/src/libs/metadata/test/Lyrics.cpp index 7756fbd6..aef7835b 100644 --- a/src/libs/metadata/test/Lyrics.cpp +++ b/src/libs/metadata/test/Lyrics.cpp @@ -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