//! Subtitle management for video media items. use std::path::PathBuf; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::model::MediaId; /// A subtitle track associated with a media item. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Subtitle { pub id: Uuid, pub media_id: MediaId, pub language: Option, pub format: SubtitleFormat, pub file_path: Option, pub is_embedded: bool, pub track_index: Option, pub offset_ms: i64, pub created_at: DateTime, } /// Supported subtitle formats. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum SubtitleFormat { Srt, Vtt, Ass, Ssa, Pgs, } impl std::fmt::Display for SubtitleFormat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let s = match self { Self::Srt => "srt", Self::Vtt => "vtt", Self::Ass => "ass", Self::Ssa => "ssa", Self::Pgs => "pgs", }; write!(f, "{s}") } } impl std::str::FromStr for SubtitleFormat { type Err = String; fn from_str(s: &str) -> std::result::Result { match s { "srt" => Ok(Self::Srt), "vtt" => Ok(Self::Vtt), "ass" => Ok(Self::Ass), "ssa" => Ok(Self::Ssa), "pgs" => Ok(Self::Pgs), _ => Err(format!("unknown subtitle format: {s}")), } } }