use std::collections::HashMap;
use std::time::Duration;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::{
audio::SampleRate,
format::Format,
spatial::{FrameRate, Resolution},
track::Track,
types::{MediaType, TrackKind},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MediaMetadata {
pub media_type: MediaType,
pub format: Format,
pub duration: Option<Duration>,
pub size: Option<u64>,
pub bitrate: Option<u64>,
pub tracks: Vec<Track>,
pub tags: HashMap<String, String>,
pub created_at: Option<DateTime<Utc>>,
}
impl MediaMetadata {
pub fn video_track(&self) -> Option<&Track> {
self.tracks.iter().find(|t| t.kind == TrackKind::Video)
}
pub fn audio_track(&self) -> Option<&Track> {
self.tracks.iter().find(|t| t.kind == TrackKind::Audio)
}
pub fn subtitle_tracks(&self) -> Vec<&Track> {
self.tracks
.iter()
.filter(|t| t.kind == TrackKind::Subtitle)
.collect()
}
pub fn resolution(&self) -> Option<Resolution> {
self.video_track()
.and_then(|t| t.video.as_ref())
.map(|v| v.resolution)
}
pub fn frame_rate(&self) -> Option<FrameRate> {
self.video_track()
.and_then(|t| t.video.as_ref())
.and_then(|v| v.frame_rate)
}
pub fn sample_rate(&self) -> Option<SampleRate> {
self.audio_track()
.and_then(|t| t.audio.as_ref())
.map(|a| a.sample_rate)
}
pub fn has_video(&self) -> bool {
self.video_track().is_some()
}
pub fn has_audio(&self) -> bool {
self.audio_track().is_some()
}
}