subtitler 2.6.1

Parse, convert, validate, edit, and generate subtitles in 15 formats (SRT, VTT, ASS/SSA, MicroDVD, SubViewer, TTML, SBV, LRC, SAMI, MPL2, SCC, EBU STL, DFXP, Whisper JSON). Full CLI included.
Documentation
#[macro_use]
extern crate tracing;

use subtitler::ass;
use subtitler::model::SubtitleFormat;
use subtitler::types::AnyResult;
use tracing::Level;
use tracing_subscriber::FmtSubscriber;

fn main() -> AnyResult<()> {
  let subscriber = FmtSubscriber::builder()
    .with_max_level(Level::INFO)
    .finish();
  tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");

  let content = r#"[Script Info]
Title: Example ASS
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288
WrapStyle: 0

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Italic,Arial,36,&H0000FFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:03.50,Default,,0,0,0,,Hello! How are you today?
Dialogue: 0,0:00:04.00,0:00:06.50,Default,,0,0,0,,I'm doing well, thank you!
Dialogue: 0,0:00:07.00,0:00:09.50,Default,,0,0,0,,What are your plans?
Dialogue: 0,0:00:10.00,0:00:12.50,Default,,0,0,0,,I might go hiking.
Dialogue: 0,0:00:13.00,0:00:15.50,Italic,,0,0,0,,That sounds great!
"#;

  let file = ass::parse_content(content)?;
  info!("Parsed {} subtitles", file.subtitles().len());
  info!("Styles: {:?}", file);

  let output = file.to_string();
  info!("Re-generated ASS:\n{}", output);

  Ok(())
}