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)
+    }
+}