diff --git a/src/output.rs b/src/output.rs new file mode 100644 index 0000000..0e1e129 --- /dev/null +++ b/src/output.rs @@ -0,0 +1,87 @@ +use std::path::Path; +use crate::metadata::VideoMetadata; +use crate::error::Result; + +/// Save metadata to JSON file +pub fn save_metadata(video_path: &str, metadata: &VideoMetadata) -> Result { + let video_path = Path::new(video_path); + let video_dir = video_path.parent().unwrap_or(Path::new(".")); + let video_name = video_path.file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("unknown"); + + let output_file = video_dir.join(format!("{}.probe.json", video_name)); + + let json = serde_json::to_string_pretty(metadata)?; + std::fs::write(&output_file, json)?; + + Ok(output_file.to_string_lossy().to_string()) +} + +/// Print metadata summary to console +pub fn print_summary(metadata: &VideoMetadata) { + println!("✓ Video probed successfully!\n"); + + // Format info + if let Some(ref filename) = metadata.format.filename { + println!("File: {}", filename); + } + + if let Some(ref format_name) = metadata.format.format_long_name { + println!("Format: {}", format_name); + } + + println!("Duration: {:.2} seconds", metadata.format.duration); + println!("Size: {:.2} MB", metadata.format.size as f64 / 1024.0 / 1024.0); + println!("Bit rate: {:.0} kbps", metadata.format.bit_rate as f64 / 1000.0); + + // Video stream + if let Some(ref vs) = metadata.video_stream { + println!("\nVideo Stream:"); + if let Some(ref codec) = vs.codec_name { + print!(" Codec: {}", codec); + if let Some(ref profile) = vs.profile { + print!(" ({})", profile); + } + println!(); + } + println!(" Resolution: {}x{}", vs.width, vs.height); + if let Some(ref frame_rate) = vs.r_frame_rate { + println!(" Frame rate: {}", frame_rate); + } + if let Some(ref pix_fmt) = vs.pix_fmt { + println!(" Pixel format: {}", pix_fmt); + } + } + + // Audio streams + if !metadata.audio_streams.is_empty() { + println!("\nAudio Streams: {}", metadata.audio_streams.len()); + for (i, audio) in metadata.audio_streams.iter().enumerate() { + print!(" [{}] ", i + 1); + if let Some(ref codec) = audio.codec_name { + print!("{}", codec); + } + print!(" - {} channels", audio.channels); + if let Some(ref sample_rate) = audio.sample_rate { + print!(" @ {} Hz", sample_rate); + } + println!(); + } + } + + // Subtitle streams + if !metadata.subtitle_streams.is_empty() { + println!("\nSubtitle Streams: {}", metadata.subtitle_streams.len()); + for (i, sub) in metadata.subtitle_streams.iter().enumerate() { + print!(" [{}] ", i + 1); + if let Some(ref codec) = sub.codec_name { + print!("{}", codec); + } + if let Some(ref lang) = sub.language { + print!(" ({})", lang); + } + println!(); + } + } +} \ No newline at end of file