Skip to content

Commit

Permalink
srt增加多行字幕的支持
Browse files Browse the repository at this point in the history
  • Loading branch information
kingslay committed Nov 19, 2023
1 parent 8736ce7 commit f1e03d6
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 13 deletions.
50 changes: 42 additions & 8 deletions Sources/KSPlayer/Subtitle/KSParseProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -354,22 +354,40 @@ 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
}
}

/**
00:00.430 --> 00:03.380
简中封装 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))
}
Expand All @@ -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
}

/**
Expand All @@ -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))
}
Expand Down
5 changes: 0 additions & 5 deletions Tests/KSPlayerTests/PlayerControllerTest.swift

This file was deleted.

44 changes: 44 additions & 0 deletions Tests/KSPlayerTests/SubtitleTest.swift
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit f1e03d6

Please sign in to comment.