diff --git a/src/bot/bot.rs b/src/bot/bot.rs index 6018fc1..1ab1a6a 100644 --- a/src/bot/bot.rs +++ b/src/bot/bot.rs @@ -137,14 +137,10 @@ enum Command { DeclineChat(String), } -use crate::dl::spawn::spawn; +use crate::dl::ffprobe::FFProbe; async fn cmd_test(bot: Bot, msg: Message, _db: DbPool) -> HandlerResult { - //bot.send_message(msg.chat.id, t!("test_response")).await?; - let output = spawn("python", &["-c", "import os; print(os.environ)"]) - .await - .unwrap(); - println!("{}", std::str::from_utf8(&output.stdout[0..4095]).unwrap()); + dbg!(FFProbe::probe("/home/mykola/Videos/test-video").await); Ok(()) } diff --git a/src/bot/dl.rs b/src/bot/dl.rs index bc4503a..649548d 100644 --- a/src/bot/dl.rs +++ b/src/bot/dl.rs @@ -5,6 +5,8 @@ use tracing::{event, Level}; use super::types::HandlerResult; use crate::dl::download; +use crate::dl::ffprobe::FFProbe; + async fn bot_download(bot: Bot, msg: Message, url: String) -> HandlerResult { let output = match download(url.as_str()).await { Ok(file) => file, @@ -17,6 +19,8 @@ async fn bot_download(bot: Bot, msg: Message, url: String) -> HandlerResult { // query media info with // ffprobe -v quiet -print_format json -show_streams -select_streams v:0 input.mp4 + let probe = FFProbe::probe(&output.path).await; + dbg!(probe); let mut video = bot.send_video(msg.chat.id, InputFile::file(&output.path)); // set width, height and so on diff --git a/src/dl/ffprobe.rs b/src/dl/ffprobe.rs index 65b0286..85afd94 100644 --- a/src/dl/ffprobe.rs +++ b/src/dl/ffprobe.rs @@ -1,17 +1,27 @@ use super::spawn::{spawn, SpawnError}; -use serde::Deserialize; +use serde::{de, de::Error, Deserialize, Deserializer}; use std::fmt; +fn duration_from_str<'de, D>(deserializer: D) -> Result + where D: Deserializer<'de> +{ + let s = String::deserialize(deserializer)?; + + Ok(str::parse(&s).map_err(de::Error::custom)?) +} + #[derive(Deserialize, Debug)] pub struct FFProbeStream { pub index: u32, pub codec_name: String, - pub width: u32, - pub height: u32, - pub coded_width: u32, - pub coded_height: u32, + pub width: Option, + pub height: Option, + pub coded_width: Option, + pub coded_height: Option, pub time_base: String, pub duration_ts: u64, + + #[serde(deserialize_with = "duration_from_str")] pub duration: f64 } @@ -22,12 +32,15 @@ pub struct FFProbeOutput { impl FFProbeOutput { pub fn parse(json: &[u8]) -> Result { - let output: FFProbeOutput = serde_json::from_slice(json)?; + let output: Result = serde_json::from_slice(json); + dbg!(output); - Ok(output) + todo!(); + //Ok(output) } } +#[derive(Debug)] pub enum FFProbeError { SpawnError(SpawnError), JsonError