WebVTTParser

用于解析 WebVTT 字幕的 Swift 包。

CI

安装

您可以通过将 swift-webvtt-parser 作为包添加到您的 Xcode 项目中。

https://github.com/mihai8804858/swift-webvtt-parser

如果您想在 SwiftPM 项目中使用 swift-webvtt-parser,只需将其添加到您的 Package.swift 中即可。

dependencies: [
  .package(url: "https://github.com/mihai8804858/swift-webvtt-parser", from: "1.0.0")
]

然后将产品添加到任何需要访问该库的目标。

.product(name: "WebVTTParser", package: "swift-webvtt-parser"),

快速开始

private let parser = WebVTTParser()
let contents = ...
let vtt = try parser.parse(contents)
let contents = try parser.print(vtt)

示例

解析

let contents = """
WEBVTT

1
00:02:17.440 --> 00:02:20.375
Senator, we're making
our <b>final</b> approach into <u>Coruscant</u>.

2
00:02:20.476 --> 00:02:22.501 line:5 line:80% position:50% size:60% align:center
<b>Very good, <i>Lieutenant</i></b>.
"""

dump(try WebVTTParser().parse(contents))
▿ WebVTTParser.WebVTT
  ▿ header: WebVTTParser.WebVTT.Header
    - text: nil
    - metadata: 0 elements
  ▿ elements: 2 elements
    ▿ WebVTTParser.WebVTT.Element.cue
      ▿ cue: WebVTTParser.WebVTT.Cue
        ▿ metadata: WebVTTParser.WebVTT.CueMetadata
          ▿ identifier: Optional("1")
            - some: "1"
          ▿ timing: WebVTTParser.WebVTT.Timing
            ▿ start: WebVTTParser.WebVTT.Time
              - hours: 0
              - minutes: 2
              - seconds: 17
              - milliseconds: 440
            ▿ end: WebVTTParser.WebVTT.Time
              - hours: 0
              - minutes: 2
              - seconds: 20
              - milliseconds: 375
          - settings: 0 elements
        ▿ payload: WebVTTParser.WebVTT.CuePayload
          ▿ components: 5 elements
            ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
              ▿ plain: (1 element)
                - text: "Senator, we\'re making\nour "
            ▿ WebVTTParser.WebVTT.CuePayload.Component.bold
              ▿ bold: (2 elements)
                - classes: 0 elements
                ▿ children: 1 element
                  ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
                    ▿ plain: (1 element)
                      - text: "final"
            ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
              ▿ plain: (1 element)
                - text: " approach into "
            ▿ WebVTTParser.WebVTT.CuePayload.Component.underline
              ▿ underline: (2 elements)
                - classes: 0 elements
                ▿ children: 1 element
                  ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
                    ▿ plain: (1 element)
                      - text: "Coruscant"
            ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
              ▿ plain: (1 element)
                - text: "."
    ▿ WebVTTParser.WebVTT.Element.cue
      ▿ cue: WebVTTParser.WebVTT.Cue
        ▿ metadata: WebVTTParser.WebVTT.CueMetadata
          ▿ identifier: Optional("2")
            - some: "2"
          ▿ timing: WebVTTParser.WebVTT.Timing
            ▿ start: WebVTTParser.WebVTT.Time
              - hours: 0
              - minutes: 2
              - seconds: 20
              - milliseconds: 476
            ▿ end: WebVTTParser.WebVTT.Time
              - hours: 0
              - minutes: 2
              - seconds: 22
              - milliseconds: 501
          ▿ settings: 5 elements
            ▿ WebVTTParser.WebVTT.Setting.lineNumber
              - lineNumber: 5
            ▿ WebVTTParser.WebVTT.Setting.linePercentage
              - linePercentage: 80
            ▿ WebVTTParser.WebVTT.Setting.position
              - position: 50
            ▿ WebVTTParser.WebVTT.Setting.size
              - size: 60
            ▿ WebVTTParser.WebVTT.Setting.align
              - align: WebVTTParser.WebVTT.Setting.Alignment.center
        ▿ payload: WebVTTParser.WebVTT.CuePayload
          ▿ components: 2 elements
            ▿ WebVTTParser.WebVTT.CuePayload.Component.bold
              ▿ bold: (2 elements)
                - classes: 0 elements
                ▿ children: 2 elements
                  ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
                    ▿ plain: (1 element)
                      - text: "Very good, "
                  ▿ WebVTTParser.WebVTT.CuePayload.Component.italic
                    ▿ italic: (2 elements)
                      - classes: 0 elements
                      ▿ children: 1 element
                        ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
                          ▿ plain: (1 element)
                            - text: "Lieutenant"
            ▿ WebVTTParser.WebVTT.CuePayload.Component.plain
              ▿ plain: (1 element)
                - text: "."

打印

let vtt = WebVTT {
    cue(identifier: "1", timing: 137.44...140.375) {
        plain("Senator, we're making\nour ")
        bold {
            plain("final")
        }
        plain(" approach into ")
        underline {
            plain("Coruscant")
        }
        plain(".")
    }
    cue(identifier: "2", timing: 140.476...142.501) {
        bold {
            plain("Very good, ")
            italic {
                plain("Lieutenant")
            }
        }
        plain(".")
    }
}

print(try WebVTTParser().print(vtt))
WEBVTT

1
02:17.440 --> 02:20.375
Senator, we're making
our <b>final</b> approach into <u>Coruscant</u>.

2
02:20.476 --> 02:22.501
<b>Very good, <i>Lieutenant</i></b>.

许可

本库采用 MIT 许可证发布。 详细信息请参阅LICENSE