#parser #webvtt #subrip

subtp

用于解析字幕文件,如SubRip字幕(.srt)和WebVTT(.vtt)

2个不稳定版本

0.2.0 2024年2月20日
0.1.0 2024年2月17日

#632 in 解析器实现

47 每月下载量
用于 oaapi

MIT/Apache

155KB
4K SLoC

subtp

一个用于解析字幕文本格式(如SubRip字幕(.srt)格式和WebVTT(.vtt)格式)的Rust解析器。

安装

在您的项目目录中运行以下Cargo命令

cargo add subtp

或向您的Cargo.toml添加以下行

[dependencies]
subtp = "0.2.0"

功能

用法

SubRip字幕(.srt)

将SubRip字幕(.srt)文本解析为subtp::srt::SubRip结构体。

use subtp::srt::SubRip;

let text = r#"
1
00:00:00,000 --> 00:00:02,000
Hello, world!

2
00:00:02,000 --> 00:00:04,000
This is a subtitle.
"#;

let subrip = SubRip::parse(text)?;

subtp::srt::SubRip结构体渲染为SubRip字幕(.srt)文本。

subtp::srt::SubRip由一个subtp::srt::SrtSubtitle向量构成。

use subtp::srt::{SubRip, SrtSubtitle, SrtTimestamp};

let subrip = SubRip {
    subtitles: vec![
        SrtSubtitle {
            sequence: 1,
            start: SrtTimestamp {
                seconds: 1,
                ..Default::default()
            },
            end: SrtTimestamp {
                seconds: 2,
                ..Default::default()
            },
            text: vec!["This is the first subtitle.".to_string()],
            ..Default::default()
        },
        SrtSubtitle {
            sequence: 2,
            start: SrtTimestamp {
                seconds: 3,
                ..Default::default()
            },
            end: SrtTimestamp {
                seconds: 4,
                ..Default::default()
            },
            text: vec![
                "This is the second subtitle.".to_string(),
                "Subtitle text can span multiple lines.".to_string(),
            ],
            ..Default::default()
        },
    ],
};
 
let text = subrip.render();

WebVTT(.vtt)

将WebVTT(.vtt)文本解析为subtp::vtt::WebVTT结构体。

use subtp::vtt::WebVtt;

let text = r#"WEBVTT

1
00:00:00.000 --> 00:00:02.000
Hello, world!

2
00:00:02.000 --> 00:00:04.000
This is a subtitle.
"#;

let webvtt = WebVtt::parse(text)?;

subtp::vtt::WebVTT结构体渲染为WebVTT(.vtt)文本。

subtp::vtt::WebVTT由一个头部subtp::vtt::VttHeader和一个subtp::vtt::VttBlcok向量构成。

subtp::vtt::VttBlcok可以是以下类型

  • subtp::vtt::VttCue
    • 带有标识符(可选)、时间、设置(可选)和字幕文本的提示块。
  • subtp::vtt::VttComment
    • 带有注释文本的注释块。
  • subtp::vtt::VttStyle
    • 带有CSS样式文本的样式块。
  • subtp::vtt::VttRegion
    • 带有区域定义的区域块。
use subtp::vtt::{WebVtt, VttBlock, VttCue, VttHeader, VttTimings, VttTimestamp};

let webvtt = WebVtt {
    blocks: vec![
        VttCue {
            identifier: Some("1".to_string()),
            timings: VttTimings {
                start: VttTimestamp {
                    seconds: 0,
                    ..Default::default()
                },
                end: VttTimestamp {
                    seconds: 2,
                    ..Default::default()
                },
            },
            payload: vec!["Hello, world!".to_string()],
            ..Default::default()
        }.into(),
        VttCue {
            identifier: Some("2".to_string()),
            timings: VttTimings {
                start: VttTimestamp {
                    seconds: 2,
                    ..Default::default()
                },
                end: VttTimestamp {
                    seconds: 4,
                    ..Default::default()
                },
            },
            payload: vec!["This is a subtitle.".to_string()],
            ..Default::default()
        }.into(),
    ],
    ..Default::default()
};

let text = webvtt.render();

其他示例

请参阅./examples目录。

变更日志

请参阅CHANGELOG

许可证

根据您的选择,许可协议为Apache License, Version 2.0MIT协议。

依赖项

~0.4–0.9MB
~19K SLoC