use crate::track::FourCc;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MetadataScope {
Udta,
Ilst,
Tag(TagScope),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum TagTarget {
Segment,
Track(u64),
Edition(u64),
Chapter(u64),
Attachment(u64),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct TagScope {
pub target_type_value: u64,
pub target: TagTarget,
pub binary: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum MetadataKey {
FourCc(FourCc),
Named(Vec<u8>),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MetadataData {
pub type_indicator: u32,
pub locale: u32,
pub payload: Vec<u8>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct MetadataItem {
pub scope: MetadataScope,
pub key: MetadataKey,
pub value: Vec<u8>,
pub data: Vec<MetadataData>,
}
impl MetadataItem {
pub fn text(&self) -> Option<&str> {
match self.scope {
MetadataScope::Tag(scope) if !scope.binary => std::str::from_utf8(&self.value).ok(),
MetadataScope::Tag(_) => None,
MetadataScope::Udta | MetadataScope::Ilst => self
.data
.iter()
.find(|data| data.type_indicator == 1)
.and_then(|data| std::str::from_utf8(&data.payload).ok()),
}
}
pub fn name(&self) -> Option<&str> {
match &self.key {
MetadataKey::Named(name) => std::str::from_utf8(name).ok(),
MetadataKey::FourCc(_) => None,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum ChapterSource {
Chpl,
Track(u32),
Matroska {
edition_uid: Option<u64>,
chapter_uid: u64,
depth: u32,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Chapter {
pub start: u64,
pub duration: Option<u64>,
pub timescale: u32,
pub title: String,
pub source: ChapterSource,
}