Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: If8fe8b38c1d9c4fecd40ff71f88d2ae06a6a6964
62 lines
1.4 KiB
Rust
62 lines
1.4 KiB
Rust
//! 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<String>,
|
|
pub format: SubtitleFormat,
|
|
pub file_path: Option<PathBuf>,
|
|
pub is_embedded: bool,
|
|
pub track_index: Option<usize>,
|
|
pub offset_ms: i64,
|
|
pub created_at: DateTime<Utc>,
|
|
}
|
|
|
|
/// 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<Self, Self::Err> {
|
|
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}")),
|
|
}
|
|
}
|
|
}
|