use super::media::MediaData;
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioData {
pub base64_data: String,
pub format: String,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub is_url: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample_rate: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<u8>,
}
impl MediaData for AudioData {
fn base64_data(&self) -> &str {
&self.base64_data
}
fn mime_type(&self) -> String {
match self.format.as_str() {
"wav" => "audio/wav".to_string(),
"mp3" => "audio/mpeg".to_string(),
"ogg" => "audio/ogg".to_string(),
"flac" => "audio/flac".to_string(),
"webm" => "audio/webm".to_string(),
"m4a" | "aac" => "audio/aac".to_string(),
other => format!("audio/{}", other),
}
}
fn is_url(&self) -> bool {
self.is_url
}
fn from_base64(base64_data: impl Into<String>, format: impl Into<String>) -> Self {
Self {
base64_data: base64_data.into(),
format: format.into(),
is_url: false,
sample_rate: None,
channels: None,
}
}
fn guess_format(path: &Path) -> Option<String> {
path.extension()
.and_then(|e| e.to_str())
.map(|e| e.to_lowercase())
}
}
crate::impl_media_forwarders!(AudioData, format);
impl AudioData {
pub fn from_url(url: impl Into<String>) -> Self {
Self {
base64_data: url.into(),
format: String::new(),
is_url: true,
sample_rate: None,
channels: None,
}
}
pub fn with_sample_rate(mut self, rate: u32) -> Self {
self.sample_rate = Some(rate);
self
}
pub fn with_channels(mut self, channels: u8) -> Self {
self.channels = Some(channels);
self
}
}