use crate::error::JsonError;
use std::time::Duration;
use symphonia_core::{meta::Metadata as ContainerMetadata, probe::ProbedMetadata};
pub(crate) mod ffprobe;
mod ytdl;
pub use ytdl::Output as YoutubeDlOutput;
use super::Parsed;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct AuxMetadata {
pub track: Option<String>,
pub artist: Option<String>,
pub album: Option<String>,
pub date: Option<String>,
pub channels: Option<u8>,
pub channel: Option<String>,
pub start_time: Option<Duration>,
pub duration: Option<Duration>,
pub sample_rate: Option<u32>,
pub source_url: Option<String>,
pub title: Option<String>,
pub thumbnail: Option<String>,
}
impl AuxMetadata {
pub fn from_ffprobe_json(value: &mut [u8]) -> Result<Self, JsonError> {
let output: ffprobe::Output = serde_json::from_slice(value)?;
Ok(output.into_aux_metadata())
}
#[must_use]
pub fn take(&mut self) -> Self {
Self {
track: self.track.take(),
artist: self.artist.take(),
album: self.album.take(),
date: self.date.take(),
channels: self.channels.take(),
channel: self.channel.take(),
start_time: self.start_time.take(),
duration: self.duration.take(),
sample_rate: self.sample_rate.take(),
source_url: self.source_url.take(),
title: self.title.take(),
thumbnail: self.thumbnail.take(),
}
}
}
pub struct Metadata<'a> {
pub probe: &'a mut ProbedMetadata,
pub format: ContainerMetadata<'a>,
}
impl<'a> From<&'a mut Parsed> for Metadata<'a> {
fn from(val: &'a mut Parsed) -> Self {
Metadata {
probe: &mut val.meta,
format: val.format.metadata(),
}
}
}