swift-webvtt-parser

1.0.1

Swift package to parse WebVTT subtitles
mihai8804858/swift-webvtt-parser

What's New

1.0.1

2024-05-22T20:40:05Z
  • Parse tag style class name

Full Changelog: 1.0.0...1.0.1

WebVTTParser

Swift package to parse WebVTT subtitles.

CI

Installation

You can add swift-webvtt-parser to an Xcode project by adding it to your project as a package.

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

If you want to use swift-webvtt-parser in a SwiftPM project, it's as simple as adding it to your Package.swift:

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

And then adding the product to any target that needs access to the library:

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

Quick Start

  • Create an instance of WebVTTParser:
private let parser = WebVTTParser()
  • Get the WebVTT contents:
let contents = ...
  • Parse the contents into a structured model:
let vtt = try parser.parse(contents)
  • Print an WebVTT model back into raw contents:
let contents = try parser.print(vtt)

Example

Parsing

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: "."

Printing

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>.

License

This library is released under the MIT license. See LICENSE for details.

Description

  • Swift Tools 5.9.0
View More Packages from this Author

Dependencies

Last updated: Thu May 30 2024 22:55:57 GMT-0900 (Hawaii-Aleutian Daylight Time)