From cccff3edc2358ab10da2da33e2d3a3b621ff1983 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Fri, 13 Sep 2024 08:11:08 +0300 Subject: [PATCH] begin working on ffprobe --- src/bot/dl.rs | 10 +++++-- src/dl.rs | 1 + src/dl/ffprobe.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/dl/ffprobe.rs diff --git a/src/bot/dl.rs b/src/bot/dl.rs index 1cd84fd..bc4503a 100644 --- a/src/bot/dl.rs +++ b/src/bot/dl.rs @@ -15,8 +15,14 @@ async fn bot_download(bot: Bot, msg: Message, url: String) -> HandlerResult { } }; - bot.send_video(msg.chat.id, InputFile::file(&output.path)) - .await?; + // query media info with + // ffprobe -v quiet -print_format json -show_streams -select_streams v:0 input.mp4 + + let mut video = bot.send_video(msg.chat.id, InputFile::file(&output.path)); + // set width, height and so on + + video.await?; + Ok(()) } diff --git a/src/dl.rs b/src/dl.rs index 6b587a3..42dfade 100644 --- a/src/dl.rs +++ b/src/dl.rs @@ -9,6 +9,7 @@ use self::tmpfile::{TmpFile, TmpFileError}; use self::yt_dlp::{YtDlp, YtDlpError, YtDlpInfo}; pub mod ffmpeg; +pub mod ffprobe; pub mod spawn; mod tmpfile; pub mod yt_dlp; diff --git a/src/dl/ffprobe.rs b/src/dl/ffprobe.rs new file mode 100644 index 0000000..65b0286 --- /dev/null +++ b/src/dl/ffprobe.rs @@ -0,0 +1,72 @@ +use super::spawn::{spawn, SpawnError}; +use serde::Deserialize; +use std::fmt; + +#[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 time_base: String, + pub duration_ts: u64, + pub duration: f64 +} + +#[derive(Deserialize, Debug)] +pub struct FFProbeOutput { + pub streams: Vec +} + +impl FFProbeOutput { + pub fn parse(json: &[u8]) -> Result { + let output: FFProbeOutput = serde_json::from_slice(json)?; + + Ok(output) + } +} + +pub enum FFProbeError { + SpawnError(SpawnError), + JsonError +} + +impl From for FFProbeError { + fn from(value: SpawnError) -> Self { + Self::SpawnError(value) + } +} + +impl From for FFProbeError { + fn from(value: serde_json::Error) -> Self { + Self::JsonError + } +} + +impl fmt::Display for FFProbeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use FFProbeError as FFPE; + match (self) { + FFPE::SpawnError(e) => write!(f, "{}", e), + FFPE::JsonError => write!(f, "ffprobe json error") + } + } +} + +pub struct FFProbe {} +impl FFProbe { + pub async fn probe(input_path: &str) -> Result { + let output = spawn("ffprobe", &[ + "-v", "quiet", + "-print_format", "json", + "-show_streams", + input_path + ]).await?; + + let output = FFProbeOutput::parse(&output.stdout)?; + + Ok(output) + } +} \ No newline at end of file