From f1e03d678aeddab34bdba865d503c28bb89ef80a Mon Sep 17 00:00:00 2001 From: kingslay <kingslay@icloud.com> Date: Sun, 19 Nov 2023 11:26:51 +0800 Subject: [PATCH] =?UTF-8?q?srt=E5=A2=9E=E5=8A=A0=E5=A4=9A=E8=A1=8C?= =?UTF-8?q?=E5=AD=97=E5=B9=95=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KSPlayer/Subtitle/KSParseProtocol.swift | 50 ++++++++++++++++--- .../KSPlayerTests/PlayerControllerTest.swift | 5 -- Tests/KSPlayerTests/SubtitleTest.swift | 44 ++++++++++++++++ 3 files changed, 86 insertions(+), 13 deletions(-) delete mode 100644 Tests/KSPlayerTests/PlayerControllerTest.swift create mode 100644 Tests/KSPlayerTests/SubtitleTest.swift diff --git a/Sources/KSPlayer/Subtitle/KSParseProtocol.swift b/Sources/KSPlayer/Subtitle/KSParseProtocol.swift index abf8b3190..6f8760ffd 100644 --- a/Sources/KSPlayer/Subtitle/KSParseProtocol.swift +++ b/Sources/KSPlayer/Subtitle/KSParseProtocol.swift @@ -354,7 +354,13 @@ public extension [String: String] { public class VTTParse: KSParseProtocol { public func canParse(scanner: Scanner) -> Bool { - scanner.scanString("WEBVTT") != nil + let result = scanner.scanString("WEBVTT") + if result != nil { + scanner.charactersToBeSkipped = nil + return true + } else { + return false + } } /** @@ -362,14 +368,26 @@ public class VTTParse: KSParseProtocol { 简中封装 by Q66 */ public func parsePart(scanner: Scanner) -> SubtitlePart? { - _ = scanner.scanUpToCharacters(from: .newlines) + _ = scanner.scanDecimal() + _ = scanner.scanCharacters(from: .newlines) let startString = scanner.scanUpToString("-->") // skip spaces and newlines by default. _ = scanner.scanString("-->") if let startString, - let endString = scanner.scanUpToCharacters(from: .newlines), - let text = scanner.scanUpToCharacters(from: .newlines) + let endString = scanner.scanUpToCharacters(from: .newlines) { + _ = scanner.scanCharacters(from: .newlines) + var text = "" + var newLine: String? = nil + repeat { + if let str = scanner.scanUpToCharacters(from: .newlines) { + text += str + } + newLine = scanner.scanCharacters(from: .newlines) + if newLine == "\n" { + text += "\n" + } + } while newLine == "\n" var textPosition = TextPosition() return SubtitlePart(startString.parseDuration(), endString.parseDuration(), attributedString: text.build(textPosition: &textPosition)) } @@ -379,7 +397,11 @@ public class VTTParse: KSParseProtocol { public class SrtParse: KSParseProtocol { public func canParse(scanner: Scanner) -> Bool { - scanner.string.contains(" --> ") + let result = scanner.string.contains(" --> ") + if result { + scanner.charactersToBeSkipped = nil + } + return result } /** @@ -388,14 +410,26 @@ public class SrtParse: KSParseProtocol { {\an4}慢慢来 */ public func parsePart(scanner: Scanner) -> SubtitlePart? { - _ = scanner.scanUpToCharacters(from: .newlines) + _ = scanner.scanDecimal() + _ = scanner.scanCharacters(from: .newlines) let startString = scanner.scanUpToString("-->") // skip spaces and newlines by default. _ = scanner.scanString("-->") if let startString, - let endString = scanner.scanUpToCharacters(from: .newlines), - let text = scanner.scanUpToCharacters(from: .newlines) + let endString = scanner.scanUpToCharacters(from: .newlines) { + _ = scanner.scanCharacters(from: .newlines) + var text = "" + var newLine: String? = nil + repeat { + if let str = scanner.scanUpToCharacters(from: .newlines) { + text += str + } + newLine = scanner.scanCharacters(from: .newlines) + if newLine == "\n" { + text += "\n" + } + } while newLine == "\n" var textPosition = TextPosition() return SubtitlePart(startString.parseDuration(), endString.parseDuration(), attributedString: text.build(textPosition: &textPosition)) } diff --git a/Tests/KSPlayerTests/PlayerControllerTest.swift b/Tests/KSPlayerTests/PlayerControllerTest.swift deleted file mode 100644 index aa5f8efb2..000000000 --- a/Tests/KSPlayerTests/PlayerControllerTest.swift +++ /dev/null @@ -1,5 +0,0 @@ -@testable import KSPlayer -import XCTest -class PlayerControllerTest: XCTestCase { - func testResize() {} -} diff --git a/Tests/KSPlayerTests/SubtitleTest.swift b/Tests/KSPlayerTests/SubtitleTest.swift new file mode 100644 index 000000000..7f784936b --- /dev/null +++ b/Tests/KSPlayerTests/SubtitleTest.swift @@ -0,0 +1,44 @@ +@testable import KSPlayer +import XCTest +class SubtitleTest: XCTestCase { + func testSrt() { + let string = """ + 1 + 00:00:00,050 --> 00:00:11,000 + <font color="#4096d1">本字幕仅供学习交流,严禁用于商业用途</font> + + 2 + 00:00:13,000 --> 00:00:18,000 + <font color=#4096d1>-=破烂熊字幕组=- + 翻译:风铃 + 校对&时间轴:小白</font> + + 3 + 00:01:00,840 --> 00:01:02,435 + 你现在必须走了吗? + + 4 + 00:01:02,680 --> 00:01:04,318 + 我说过我会去找他的 + + 5 + 00:01:07,194 --> 00:01:08,239 + - 很多事情我们都说过 + - 我承诺过他 + + 6 + 00:01:08,280 --> 00:01:10,661 + 我希望你明白 + + 7 + 00:01:12,814 --> 00:01:14,702 + 等等! 你是不可能活着回来的! + + """ + let scanner = Scanner(string: string) + let parse = SrtParse() + XCTAssertEqual(parse.canParse(scanner: scanner), true) + let parts = parse.parse(scanner: scanner) + XCTAssertEqual(parts.count, 7) + } +}