audio_checker-0.1.0/.cargo_vcs_info.json0000644000000001360000000000100136170ustar { "git": { "sha1": "9d3c1525e404a989b9893a4a58f623ed2854b29c" }, "path_in_vcs": "" }audio_checker-0.1.0/.gitignore000064400000000000000000000000530072674642500144250ustar 00000000000000/target *.iml Cargo.lock src/main.rs .idea/audio_checker-0.1.0/Cargo.toml0000644000000016500000000000100116170ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "audio_checker" version = "0.1.0" authors = ["Rafał Mikrut"] description = "Library checking if audio files are broken" homepage = "https://github.com/qarmin/audio_checker" license = "MIT" repository = "https://github.com/qarmin/audio_checker" resolver = "2" [dependencies.symphonia] version = "0.5" features = [ "mp3", "aac", "alac", "flac", "isomp4", "mkv", "ogg", "pcm", "vorbis", "wav", ] audio_checker-0.1.0/Cargo.toml.orig000064400000000000000000000006240072674642500153300ustar 00000000000000[package] name = "audio_checker" authors = ["Rafał Mikrut"] version = "0.1.0" edition = "2021" description = "Library checking if audio files are broken" license = "MIT" homepage = "https://github.com/qarmin/audio_checker" repository = "https://github.com/qarmin/audio_checker" [dependencies] symphonia = {version="0.5", features=["mp3","aac","alac","flac","isomp4","mkv","ogg","pcm","vorbis","wav"]} audio_checker-0.1.0/README.md000064400000000000000000000004300072674642500137130ustar 00000000000000## Audio Checker Audio Checker is simple crate to check if audio files are not broken. It uses [Symphonia](https://github.com/pdeljanov/Symphonia) as backed, so feel free, if needed, to create issues there. It was created mainly for [Czkawka](https://github.com/qarmin/czkawka).audio_checker-0.1.0/src/lib.rs000064400000000000000000000034030072674642500143420ustar 00000000000000use std::fs::File; use std::io; use symphonia::core::codecs::CODEC_TYPE_NULL; use symphonia::core::errors::Error; use symphonia::core::errors::Error::IoError; use symphonia::core::io::MediaSourceStream; pub fn parse_audio_file(file_handler: File) -> Result<(), Error> { let mss = MediaSourceStream::new(Box::new(file_handler), Default::default()); let probed = match symphonia::default::get_probe().format( &Default::default(), mss, &Default::default(), &Default::default(), ) { Ok(t) => t, Err(_) => { return Err(Error::Unsupported( "probe info not available/file not recognized", )) } }; let mut format = probed.format; let track = match format .tracks() .iter() .find(|t| t.codec_params.codec != CODEC_TYPE_NULL) { Some(k) => k, None => return Err(Error::Unsupported("not supported audio track")), }; let mut decoder = match symphonia::default::get_codecs().make(&track.codec_params, &Default::default()) { Ok(k) => k, Err(_) => return Err(Error::Unsupported("not supported codec")), }; loop { let packet = match format.next_packet() { Ok(packet) => packet, Err(Error::ResetRequired) => { return Err(Error::ResetRequired); } Err(err) => { if let IoError(ref er) = err { // Catch eof, not sure how to do it properly if er.kind() == io::ErrorKind::UnexpectedEof { return Ok(()); } } return Err(err); } }; decoder.decode(&packet)?; } }