use chrono::DateTime;
use crate::model::Video;
use crate::model::format::Format;
pub trait BaseMetadata {
fn extract_basic_metadata(video: &Video) -> Vec<(String, String)> {
let mut metadata = vec![("title".to_string(), video.title.clone())];
Self::add_metadata_if_some(&mut metadata, "artist", video.channel.clone());
Self::add_metadata_if_some(&mut metadata, "album_artist", video.channel.clone());
Self::add_metadata_if_some(&mut metadata, "album", video.channel.clone());
if !video.tags.is_empty() {
metadata.push(("genre".to_string(), video.tags.join(", ")));
}
if let Some(timestamp) = video.upload_date.filter(|&t| t > 0) {
if let Some(date_str) = Self::format_timestamp(timestamp, "%Y-%m-%d") {
metadata.push(("date".to_string(), date_str));
}
if let Some(year_str) = Self::format_timestamp(timestamp, "%Y") {
metadata.push(("year".to_string(), year_str));
}
}
metadata
}
fn extract_video_format_metadata(format: &Format) -> Vec<(String, String)> {
let mut metadata = Vec::new();
if let (Some(width), Some(height)) = (format.video_resolution.width, format.video_resolution.height) {
metadata.push(("resolution".to_string(), format!("{}x{}", width, height)));
}
Self::add_metadata_if_some(&mut metadata, "framerate", format.video_resolution.fps);
Self::add_metadata_if_some(&mut metadata, "video_codec", format.codec_info.video_codec.clone());
Self::add_metadata_if_some(&mut metadata, "video_bitrate", format.rates_info.video_rate);
metadata
}
fn extract_audio_format_metadata(format: &Format) -> Vec<(String, String)> {
let mut metadata = Vec::new();
Self::add_metadata_if_some(&mut metadata, "audio_bitrate", format.rates_info.audio_rate);
Self::add_metadata_if_some(&mut metadata, "audio_codec", format.codec_info.audio_codec.clone());
Self::add_metadata_if_some(&mut metadata, "audio_channels", format.codec_info.audio_channels);
Self::add_metadata_if_some(&mut metadata, "audio_sample_rate", format.codec_info.asr);
metadata
}
fn format_timestamp(timestamp: i64, format_str: &str) -> Option<String> {
DateTime::from_timestamp(timestamp, 0).map(|dt| dt.format(format_str).to_string())
}
fn add_metadata_if_some<T: ToString>(metadata: &mut Vec<(String, String)>, key: &str, value: Option<T>) {
if let Some(value) = value {
let value_str = value.to_string();
metadata.push((key.to_string(), value_str));
}
}
}