From 37c7e426fcef994e8ced676073015b137f3c7b04 Mon Sep 17 00:00:00 2001 From: Sabeeh Ul Hussnain Date: Wed, 5 Aug 2026 11:50:53 +0500 Subject: [PATCH] fix: parse WebVTT cues with settings --- .../subtitle/WebVttParser.kt | 6 ++-- .../subtitle/WebVttParserTest.kt | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 mediaplayer/src/commonTest/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParserTest.kt diff --git a/mediaplayer/src/commonMain/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParser.kt b/mediaplayer/src/commonMain/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParser.kt index d0344447..61bf6af4 100644 --- a/mediaplayer/src/commonMain/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParser.kt +++ b/mediaplayer/src/commonMain/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParser.kt @@ -35,8 +35,10 @@ object WebVttParser { val cues = mutableListOf() var i = 0 - // Skip header and empty lines - while (i < lines.size && !CUE_TIMING_PATTERN.matches(lines[i])) { + // Skip header and metadata until the first cue timing line. A timing line may contain + // WebVTT cue settings after the end timestamp, so it does not necessarily fully match + // the timestamp-only pattern. + while (i < lines.size && CUE_TIMING_PATTERN.find(lines[i]) == null) { i++ } diff --git a/mediaplayer/src/commonTest/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParserTest.kt b/mediaplayer/src/commonTest/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParserTest.kt new file mode 100644 index 00000000..397c2cb1 --- /dev/null +++ b/mediaplayer/src/commonTest/kotlin/io/github/kdroidfilter/composemediaplayer/subtitle/WebVttParserTest.kt @@ -0,0 +1,33 @@ +package io.github.kdroidfilter.composemediaplayer.subtitle + +import kotlin.test.Test +import kotlin.test.assertEquals + +class WebVttParserTest { + @Test + fun parsesCuesWithSettings() { + val content = + """ + WEBVTT + + STYLE + ::cue(.combine) { text-combine-upright: all; } + + 00:00:01.000 --> 00:00:03.000 line:0 + Top + + 00:00:04.000 --> 00:00:06.000 vertical:rl line:5% + Vertical + """.trimIndent() + + val subtitles = WebVttParser.parse(content) + + assertEquals(2, subtitles.cues.size) + assertEquals(1_000, subtitles.cues[0].startTime) + assertEquals(3_000, subtitles.cues[0].endTime) + assertEquals("Top", subtitles.cues[0].text) + assertEquals(4_000, subtitles.cues[1].startTime) + assertEquals(6_000, subtitles.cues[1].endTime) + assertEquals("Vertical", subtitles.cues[1].text) + } +}