use anyhow::anyhow;
use chrono::NaiveDateTime;
use ffmpeg_next as ffmpeg;
use log::trace;
use std::path::Path;
use std::sync::Mutex;
static FFMPEG_INITIALIZED: Mutex<bool> = Mutex::new(false);
fn init_ffmpeg() -> anyhow::Result<()> {
match FFMPEG_INITIALIZED.lock() {
Ok(mut guard) => {
if *guard {
return Ok(());
}
ffmpeg::init().map_err(|e| anyhow!("Error initializing ffmpeg: {e:?}"))?;
*guard = true;
Ok(())
}
Err(poisoned) => Err(anyhow!("Mutex poisoned: {poisoned:?}")),
}
}
pub fn get_video_time<P: AsRef<Path>>(path: P) -> anyhow::Result<Option<NaiveDateTime>> {
init_ffmpeg()?;
let instance = ffmpeg::format::input(&path)?;
let result = instance
.metadata()
.get("creation_time")
.inspect(|x| trace!("Found creation_time ({x}) for video: {:?}", path.as_ref()))
.map(|v| NaiveDateTime::parse_from_str(v, "%+"));
Ok(result.transpose()?)
}