use crate::config::Config;
use crate::media_duration::media_duration;
use crate::mp3::get_audio_duration;
use anyhow::{Context, Result};
use log::debug;
pub fn get_duration(
video_path: &str,
mp3_path: Option<String>,
duration_arg: Option<String>,
config: &Config,
) -> Result<u64> {
debug!("Getting duration with parameters:");
debug!(" video_path: {}", video_path);
debug!(" mp3_path: {:?}", mp3_path);
debug!(" duration_arg: {:?}", duration_arg);
let calculated_duration = match (mp3_path, duration_arg) {
(Some(mp3), None) => {
debug!("MP3 provided, duration not provided. Using MP3 duration.");
let duration = get_audio_duration(Some(mp3.clone()), config)
.context("Error determining MP3 duration")?
.ok_or_else(|| anyhow::anyhow!("MP3 duration not found"))?;
debug!("MP3 duration: {:?}", duration);
duration
}
(None, Some(dur_str)) => {
debug!("Duration provided, MP3 not provided. Using provided duration.");
let duration = dur_str
.parse::<u64>()
.map_err(|_| anyhow::anyhow!("Invalid duration argument"))?;
debug!("Provided duration: {:?}", duration);
duration
}
(Some(_), Some(dur_str)) => {
debug!("Both MP3 path and duration argument provided. Defaulting to explicitly set duration.");
let duration = dur_str
.parse::<u64>()
.map_err(|_| anyhow::anyhow!("Invalid duration argument"))?;
debug!("Provided duration: {:?}", duration);
duration
}
(None, None) => {
debug!("Neither MP3 nor duration provided. Checking for MP3 duration first.");
if let Some(duration) =
get_audio_duration(None, config).context("Error determining MP3 duration")?
{
debug!("Found MP3 duration: {:?}", duration);
duration
} else {
debug!("MP3 duration not found. Falling back to video duration.");
let duration =
media_duration(video_path).context("Error determining video duration")?;
debug!("Video duration: {:?}", duration);
duration
}
}
};
let final_duration = minimum_duration(calculated_duration, video_path)?;
Ok(final_duration)
}
pub fn minimum_duration(calculated_duration: u64, video_path: &str) -> Result<u64> {
let video_duration = media_duration(video_path)
.context("Error determining video duration in minimum_duration")?;
if calculated_duration > video_duration {
debug!(
"Calculated duration ({}) is greater than video duration ({}). Using video duration.",
calculated_duration, video_duration
);
Ok(video_duration)
} else {
debug!(
"Calculated duration ({}) is within video duration ({}).",
calculated_duration, video_duration
);
Ok(calculated_duration)
}
}