Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ private sealed class SyntacticLrc {

companion object {
// also eats space if present
val timeMarksRegex = "\\[(\\d{2}):(\\d{2})([.:]\\d+)?]".toRegex()
val timeMarksAfterWsRegex = "([ \t]+)\\[(\\d{2}):(\\d{2})([.:]\\d+)?]".toRegex()
val timeWordMarksRegex = "<(\\d{2}):(\\d{2})([.:]\\d+)?>".toRegex()
val timeMarksRegex = "\\[(\\d+):(\\d{2})([.:]\\d+)?]".toRegex()
val timeMarksAfterWsRegex = "([ \t]+)\\[(\\d+):(\\d{2})([.:]\\d+)?]".toRegex()
val timeWordMarksRegex = "<(\\d+):(\\d{2})([.:]\\d+)?>".toRegex()
val metadataRegex = "\\[([a-zA-Z#]+):([^]]*)]".toRegex()

private fun parseTime(match: MatchResult): ULong {
Expand Down
14 changes: 7 additions & 7 deletions app/src/test/java/org/akanework/gramophone/LrcTestData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -977,10 +977,10 @@ object LrcTestData {
<p begin="2:32.314" end="2:35.473" itunes:key="L40" ttm:agent="v2"><span begin="2:32.314" end="2:32.524">I'll</span> <span begin="2:32.524" end="2:32.756">make</span> <span begin="2:32.756" end="2:32.924">a</span> <span begin="2:32.924" end="2:33.175">cup</span> <span begin="2:33.175" end="2:33.340">of</span> <span begin="2:33.340" end="2:34.156">coffee</span> <span begin="2:34.156" end="2:34.473">for</span> <span begin="2:34.473" end="2:34.873">your</span> <span begin="2:34.873" end="2:35.473">head</span></p>
<p begin="2:35.684" end="2:38.807" itunes:key="L41" ttm:agent="v2"><span begin="2:35.684" end="2:35.865">It'll</span> <span begin="2:35.865" end="2:36.113">get</span> <span begin="2:36.113" end="2:36.281">you</span> <span begin="2:36.281" end="2:36.513">up</span> <span begin="2:36.513" end="2:36.697">and</span> <span begin="2:36.697" end="2:37.363">going</span> <span begin="2:37.363" end="2:37.747">out</span> <span begin="2:37.747" end="2:38.179">of</span> <span begin="2:38.179" end="2:38.807">bed</span></p>
</div>
<div begin="2:39.985" end="2:52.082" itunes:songPart="Chorus">
<p begin="2:39.985" end="2:45.385" itunes:key="L42" ttm:agent="v2"><span begin="2:39.985" end="2:40.859">Don't</span> <span begin="2:40.859" end="2:41.227">stay</span> <span begin="2:41.227" end="2:42.017">awake</span> <span begin="2:42.075" end="2:42.326">for</span> <span begin="2:42.326" end="2:42.760">too</span> <span begin="2:42.760" end="2:43.360">long,</span> <span begin="2:43.360" end="2:44.176">don't</span> <span begin="2:44.176" end="2:44.611">go</span> <span begin="2:44.611" end="2:44.862">to</span> <span begin="2:44.862" end="2:45.385">bed</span></p>
<p begin="2:45.636" end="2:48.795" itunes:key="L43" ttm:agent="v2"><span begin="2:45.636" end="2:45.870">I'll</span> <span begin="2:45.870" end="2:46.121">make</span> <span begin="2:46.121" end="2:46.270">a</span> <span begin="2:46.270" end="2:46.505">cup</span> <span begin="2:46.505" end="2:46.670">of</span> <span begin="2:46.670" end="2:47.505">coffee</span> <span begin="2:47.505" end="2:47.806">for</span> <span begin="2:47.806" end="2:48.206">your</span> <span begin="2:48.206" end="2:48.795">head</span></p>
<p begin="2:48.941" end="2:52.082" itunes:key="L44" ttm:agent="v2"><span begin="2:48.941" end="2:49.223">It'll</span> <span begin="2:49.223" end="2:49.474">get</span> <span begin="2:49.474" end="2:49.623">you</span> <span begin="2:49.623" end="2:49.858">up</span> <span begin="2:49.858" end="2:50.042">and</span> <span begin="2:50.042" end="2:50.724">going</span> <span begin="2:50.724" end="2:51.140">out</span> <span begin="2:51.140" end="2:51.575">of</span> <span begin="2:51.575" end="2:52.082">bed</span></p>
<div begin="102:39.985" end="102:52.082" itunes:songPart="Chorus">
<p begin="102:39.985" end="102:45.385" itunes:key="L42" ttm:agent="v2"><span begin="102:39.985" end="102:40.859">Don't</span> <span begin="102:40.859" end="102:41.227">stay</span> <span begin="102:41.227" end="102:42.017">awake</span> <span begin="102:42.075" end="102:42.326">for</span> <span begin="102:42.326" end="102:42.760">too</span> <span begin="102:42.760" end="102:43.360">long,</span> <span begin="102:43.360" end="102:44.176">don't</span> <span begin="102:44.176" end="102:44.611">go</span> <span begin="102:44.611" end="102:44.862">to</span> <span begin="102:44.862" end="102:45.385">bed</span></p>
<p begin="102:45.636" end="102:48.795" itunes:key="L43" ttm:agent="v2"><span begin="102:45.636" end="102:45.870">I'll</span> <span begin="102:45.870" end="102:46.121">make</span> <span begin="102:46.121" end="102:46.270">a</span> <span begin="102:46.270" end="102:46.505">cup</span> <span begin="102:46.505" end="102:46.670">of</span> <span begin="102:46.670" end="102:47.505">coffee</span> <span begin="102:47.505" end="102:47.806">for</span> <span begin="102:47.806" end="102:48.206">your</span> <span begin="102:48.206" end="102:48.795">head</span></p>
<p begin="102:48.941" end="102:52.082" itunes:key="L44" ttm:agent="v2"><span begin="102:48.941" end="102:49.223">It'll</span> <span begin="102:49.223" end="102:49.474">get</span> <span begin="102:49.474" end="102:49.623">you</span> <span begin="102:49.623" end="102:49.858">up</span> <span begin="102:49.858" end="102:50.042">and</span> <span begin="102:50.042" end="102:50.724">going</span> <span begin="102:50.724" end="102:51.140">out</span> <span begin="102:51.140" end="102:51.575">of</span> <span begin="102:51.575" end="102:52.082">bed</span></p>
</div>
</body></tt
>
Expand Down Expand Up @@ -1029,8 +1029,8 @@ object LrcTestData {
LyricLine(start = 146547uL, text = """Don't stay awake for too long, don't go to bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 146547uL..147445uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 147445uL..147912uL, charRange = 6..9, isRtl = false), SemanticLyrics.Word(timeRange = 147912uL..148762uL, charRange = 11..15, isRtl = false), SemanticLyrics.Word(timeRange = 148762uL..148994uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 148994uL..149429uL, charRange = 21..23, isRtl = false), SemanticLyrics.Word(timeRange = 149429uL..150013uL, charRange = 25..29, isRtl = false), SemanticLyrics.Word(timeRange = 150013uL..150829uL, charRange = 31..35, isRtl = false), SemanticLyrics.Word(timeRange = 150829uL..151280uL, charRange = 37..38, isRtl = false), SemanticLyrics.Word(timeRange = 151280uL..151530uL, charRange = 40..41, isRtl = false), SemanticLyrics.Word(timeRange = 151530uL..152087uL, charRange = 43..45, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 152087uL, isTranslated = false),
LyricLine(start = 152314uL, text = """I'll make a cup of coffee for your head""", words = mutableListOf(SemanticLyrics.Word(timeRange = 152314uL..152524uL, charRange = 0..3, isRtl = false), SemanticLyrics.Word(timeRange = 152524uL..152756uL, charRange = 5..8, isRtl = false), SemanticLyrics.Word(timeRange = 152756uL..152924uL, charRange = 10..10, isRtl = false), SemanticLyrics.Word(timeRange = 152924uL..153175uL, charRange = 12..14, isRtl = false), SemanticLyrics.Word(timeRange = 153175uL..153340uL, charRange = 16..17, isRtl = false), SemanticLyrics.Word(timeRange = 153340uL..154156uL, charRange = 19..24, isRtl = false), SemanticLyrics.Word(timeRange = 154156uL..154473uL, charRange = 26..28, isRtl = false), SemanticLyrics.Word(timeRange = 154473uL..154873uL, charRange = 30..33, isRtl = false), SemanticLyrics.Word(timeRange = 154873uL..155473uL, charRange = 35..38, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 155473uL, isTranslated = false),
LyricLine(start = 155684uL, text = """It'll get you up and going out of bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 155684uL..155865uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 155865uL..156113uL, charRange = 6..8, isRtl = false), SemanticLyrics.Word(timeRange = 156113uL..156281uL, charRange = 10..12, isRtl = false), SemanticLyrics.Word(timeRange = 156281uL..156513uL, charRange = 14..15, isRtl = false), SemanticLyrics.Word(timeRange = 156513uL..156697uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 156697uL..157363uL, charRange = 21..25, isRtl = false), SemanticLyrics.Word(timeRange = 157363uL..157747uL, charRange = 27..29, isRtl = false), SemanticLyrics.Word(timeRange = 157747uL..158179uL, charRange = 31..32, isRtl = false), SemanticLyrics.Word(timeRange = 158179uL..158807uL, charRange = 34..36, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 158807uL, isTranslated = false),
LyricLine(start = 159985uL, text = """Don't stay awake for too long, don't go to bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 159985uL..160859uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 160859uL..161227uL, charRange = 6..9, isRtl = false), SemanticLyrics.Word(timeRange = 161227uL..162017uL, charRange = 11..15, isRtl = false), SemanticLyrics.Word(timeRange = 162075uL..162326uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 162326uL..162760uL, charRange = 21..23, isRtl = false), SemanticLyrics.Word(timeRange = 162760uL..163360uL, charRange = 25..29, isRtl = false), SemanticLyrics.Word(timeRange = 163360uL..164176uL, charRange = 31..35, isRtl = false), SemanticLyrics.Word(timeRange = 164176uL..164611uL, charRange = 37..38, isRtl = false), SemanticLyrics.Word(timeRange = 164611uL..164862uL, charRange = 40..41, isRtl = false), SemanticLyrics.Word(timeRange = 164862uL..165385uL, charRange = 43..45, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 165385uL, isTranslated = false),
LyricLine(start = 165636uL, text = """I'll make a cup of coffee for your head""", words = mutableListOf(SemanticLyrics.Word(timeRange = 165636uL..165870uL, charRange = 0..3, isRtl = false), SemanticLyrics.Word(timeRange = 165870uL..166121uL, charRange = 5..8, isRtl = false), SemanticLyrics.Word(timeRange = 166121uL..166270uL, charRange = 10..10, isRtl = false), SemanticLyrics.Word(timeRange = 166270uL..166505uL, charRange = 12..14, isRtl = false), SemanticLyrics.Word(timeRange = 166505uL..166670uL, charRange = 16..17, isRtl = false), SemanticLyrics.Word(timeRange = 166670uL..167505uL, charRange = 19..24, isRtl = false), SemanticLyrics.Word(timeRange = 167505uL..167806uL, charRange = 26..28, isRtl = false), SemanticLyrics.Word(timeRange = 167806uL..168206uL, charRange = 30..33, isRtl = false), SemanticLyrics.Word(timeRange = 168206uL..168795uL, charRange = 35..38, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 168795uL, isTranslated = false),
LyricLine(start = 168941uL, text = """It'll get you up and going out of bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 168941uL..169223uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 169223uL..169474uL, charRange = 6..8, isRtl = false), SemanticLyrics.Word(timeRange = 169474uL..169623uL, charRange = 10..12, isRtl = false), SemanticLyrics.Word(timeRange = 169623uL..169858uL, charRange = 14..15, isRtl = false), SemanticLyrics.Word(timeRange = 169858uL..170042uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 170042uL..170724uL, charRange = 21..25, isRtl = false), SemanticLyrics.Word(timeRange = 170724uL..171140uL, charRange = 27..29, isRtl = false), SemanticLyrics.Word(timeRange = 171140uL..171575uL, charRange = 31..32, isRtl = false), SemanticLyrics.Word(timeRange = 171575uL..172082uL, charRange = 34..36, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 172082uL, isTranslated = false),
LyricLine(start = 6159985uL, text = """Don't stay awake for too long, don't go to bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 6159985uL..6160859uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 6160859uL..6161227uL, charRange = 6..9, isRtl = false), SemanticLyrics.Word(timeRange = 6161227uL..6162017uL, charRange = 11..15, isRtl = false), SemanticLyrics.Word(timeRange = 6162075uL..6162326uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 6162326uL..6162760uL, charRange = 21..23, isRtl = false), SemanticLyrics.Word(timeRange = 6162760uL..6163360uL, charRange = 25..29, isRtl = false), SemanticLyrics.Word(timeRange = 6163360uL..6164176uL, charRange = 31..35, isRtl = false), SemanticLyrics.Word(timeRange = 6164176uL..6164611uL, charRange = 37..38, isRtl = false), SemanticLyrics.Word(timeRange = 6164611uL..6164862uL, charRange = 40..41, isRtl = false), SemanticLyrics.Word(timeRange = 6164862uL..6165385uL, charRange = 43..45, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 6165385uL, isTranslated = false),
LyricLine(start = 6165636uL, text = """I'll make a cup of coffee for your head""", words = mutableListOf(SemanticLyrics.Word(timeRange = 6165636uL..6165870uL, charRange = 0..3, isRtl = false), SemanticLyrics.Word(timeRange = 6165870uL..6166121uL, charRange = 5..8, isRtl = false), SemanticLyrics.Word(timeRange = 6166121uL..6166270uL, charRange = 10..10, isRtl = false), SemanticLyrics.Word(timeRange = 6166270uL..6166505uL, charRange = 12..14, isRtl = false), SemanticLyrics.Word(timeRange = 6166505uL..6166670uL, charRange = 16..17, isRtl = false), SemanticLyrics.Word(timeRange = 6166670uL..6167505uL, charRange = 19..24, isRtl = false), SemanticLyrics.Word(timeRange = 6167505uL..6167806uL, charRange = 26..28, isRtl = false), SemanticLyrics.Word(timeRange = 6167806uL..6168206uL, charRange = 30..33, isRtl = false), SemanticLyrics.Word(timeRange = 6168206uL..6168795uL, charRange = 35..38, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 6168795uL, isTranslated = false),
LyricLine(start = 6168941uL, text = """It'll get you up and going out of bed""", words = mutableListOf(SemanticLyrics.Word(timeRange = 6168941uL..6169223uL, charRange = 0..4, isRtl = false), SemanticLyrics.Word(timeRange = 6169223uL..6169474uL, charRange = 6..8, isRtl = false), SemanticLyrics.Word(timeRange = 6169474uL..6169623uL, charRange = 10..12, isRtl = false), SemanticLyrics.Word(timeRange = 6169623uL..6169858uL, charRange = 14..15, isRtl = false), SemanticLyrics.Word(timeRange = 6169858uL..6170042uL, charRange = 17..19, isRtl = false), SemanticLyrics.Word(timeRange = 6170042uL..6170724uL, charRange = 21..25, isRtl = false), SemanticLyrics.Word(timeRange = 6170724uL..6171140uL, charRange = 27..29, isRtl = false), SemanticLyrics.Word(timeRange = 6171140uL..6171575uL, charRange = 31..32, isRtl = false), SemanticLyrics.Word(timeRange = 6171575uL..6172082uL, charRange = 34..36, isRtl = false)), speaker = SpeakerEntity.Voice2, end = 6172082uL, isTranslated = false),
)
}
11 changes: 11 additions & 0 deletions app/src/test/java/org/akanework/gramophone/LrcUtilsTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,17 @@ class LrcUtilsTest {
assertEquals("how are you?", lrcM[1].text)
}

@Test
fun testLongSyncTimestamp() {
val lrc = parseSynced("[101:56:78]One two three\n[1234:56:78]Four five six")
assertNotNull(lrc)
assertEquals(2, lrc!!.size)
assertEquals("One two three", lrc[0].text)
assertEquals(6116780uL, lrc[0].start)
assertEquals("Four five six", lrc[1].text)
assertEquals(74096780uL, lrc[1].start)
}

@Test
fun testOffsetMultiLineParser() {
val lrc = parseSynced("[offset:+3][00:00.004]hello\ngood morning\n[00:00.005]how are you?", multiline = true)
Expand Down