From 93289110b103f80ecd20fe5aa8d217dc6d3cb3a0 Mon Sep 17 00:00:00 2001 From: jakka Date: Fri, 11 Jul 2025 11:47:25 +0300 Subject: removed hashing since its not really needed if original file is intact, now brocessing data in blocks --- Cargo.lock | 94 ---------------------------------------------------------- Cargo.toml | 2 -- src/flac.rs | 98 +++++++++++++++++++++++++++++-------------------------------- 3 files changed, 46 insertions(+), 148 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7102fca..11e9741 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,39 +58,18 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" -[[package]] -name = "bytemuck" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" - [[package]] name = "byteorder" version = "1.5.0" @@ -225,16 +204,6 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - [[package]] name = "ctrlc" version = "3.4.7" @@ -245,16 +214,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - [[package]] name = "directories" version = "6.0.0" @@ -321,9 +280,7 @@ dependencies = [ "ctrlc", "directories", "flac-bound", - "i24", "indicatif", - "md-5", "metaflac", "rayon", "rusqlite", @@ -336,16 +293,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -381,16 +328,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "i24" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4e9f59fce450959a3bfe4a762ebba4afe2327ab3795ba11c489233c5d29733" -dependencies = [ - "bytemuck", - "num-traits", -] - [[package]] name = "indicatif" version = "0.18.0" @@ -464,16 +401,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - [[package]] name = "metaflac" version = "0.2.8" @@ -496,15 +423,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -656,12 +574,6 @@ dependencies = [ "syn", ] -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - [[package]] name = "unicode-ident" version = "1.0.18" @@ -698,12 +610,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 217288f..3b15da8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,9 +15,7 @@ clap = { version = "4.5.40", features = ["cargo", "help", "std"] } clap_complete = "4.5.54" directories = "6.0.0" flac-bound = { version = "0.5.0", default-features = false } -i24 = { version = "2.1.0", features = ["std"] } indicatif = { version = "0.18.0", features = ["improved_unicode"] } -md-5 = "0.10.6" walkdir = "2.5.0" console = { version = "0.15.11", features = ["windows-console-colors"] } claxon = { git = "https://github.com/justjakka/claxon.git" } diff --git a/src/flac.rs b/src/flac.rs index eb38bc5..4d7c632 100644 --- a/src/flac.rs +++ b/src/flac.rs @@ -1,7 +1,6 @@ use anyhow::{Result, anyhow}; use claxon::{FlacReader, FlacReaderOptions}; use flac_bound::FlacEncoder; -use md5::{Digest, Md5}; use metaflac::{Block, Tag}; use std::{ path::Path, @@ -13,15 +12,14 @@ use std::{ pub const CURRENT_VENDOR: &str = "reference libFLAC 1.5.0 20250211"; -fn write_tags(filename: impl AsRef, hash: Vec) -> Result<()> { +fn write_tags(filename: impl AsRef) -> Result<()> { let tags = Tag::read_from_path(&filename)?; let temp_name = filename.as_ref().with_extension("tmp"); let mut output = Tag::read_from_path(&temp_name)?; - let mut streaminfo = tags.get_streaminfo().unwrap().clone(); - - streaminfo.md5 = hash; - output.set_streaminfo(streaminfo); + if let Some(streaminfo) = tags.get_streaminfo() { + output.set_streaminfo(streaminfo.clone()); + } for block in tags.blocks() { match block { @@ -50,7 +48,6 @@ fn encode_file(filename: impl AsRef, handler: Arc) -> Result, handler: Arc) -> Result { - hasher.update(i16::try_from(sample)?.to_le_bytes()); - } - 24 => { - hasher.update(if let Some(conv_sample) = i24::i24::try_from_i32(sample) { - conv_sample.to_le_bytes() - } else { - return Err(anyhow!("failed to hash samples")); - }); - } - 32 => { - hasher.update(sample.to_le_bytes()); + loop { + if !handler.load(Ordering::SeqCst) { + let _ = encoder.finish(); + std::fs::remove_file(temp_name)?; + return Ok(true); + } + match frame_reader.read_next_or_eof(block_buffer) { + Ok(Some(block)) => { + for sample in 0..(block.len() / block.channels()) { + for ch in 0..block.channels() { + buffer.push(block.sample(ch, sample)); + } } - _ => {} - } - buf.push(sample); - if num_channels == buf.len() { - if let Err(_) = encoder.process_interleaved(&buf, 1) { - return Err(anyhow!("failed to process samples:\t{:?}", encoder.state())); + if let Err(_) = encoder.process_interleaved(&buffer, block.len() / block.channels()) + { + return Err(anyhow!( + "Error while processing samples:\t{:?}", + encoder.state() + )); }; - buf.clear(); + buffer.clear(); + block_buffer = block.into_buffer(); } - } else { - let _ = std::fs::remove_file(temp_name); - return Ok(true); + Ok(None) => break, + Err(error) => return Err(error.into()), } } if let Err(enc) = encoder.finish() { return Err(anyhow!("Encoding failed:\t{:?}", enc.state())); } - - let hash = hasher.finalize().to_vec(); - write_tags(&filename, hash)?; + write_tags(&filename)?; std::fs::rename(temp_name, filename)?; Ok(false) } @@ -154,11 +145,12 @@ mod tests { std::fs::copy(name, tempname).unwrap(); let handler = Arc::new(AtomicBool::new(true)); encode_file(name, handler).unwrap(); - let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum; - let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum; - + let output = std::process::Command::new("flac") + .arg("-wts") + .arg(name) + .status(); std::fs::rename(tempname, name).unwrap(); - assert_eq!(target_md5, temp_md5); + assert!(output.unwrap().success()); } #[test] @@ -168,11 +160,12 @@ mod tests { std::fs::copy(name, tempname).unwrap(); let handler = Arc::new(AtomicBool::new(true)); encode_file(name, handler).unwrap(); - let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum; - let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum; - + let output = std::process::Command::new("flac") + .arg("-wts") + .arg(name) + .status(); std::fs::rename(tempname, name).unwrap(); - assert_eq!(target_md5, temp_md5); + assert!(output.unwrap().success()); } #[test] @@ -182,10 +175,11 @@ mod tests { std::fs::copy(name, tempname).unwrap(); let handler = Arc::new(AtomicBool::new(true)); encode_file(name, handler).unwrap(); - let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum; - let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum; - + let output = std::process::Command::new("flac") + .arg("-wts") + .arg(name) + .status(); std::fs::rename(tempname, name).unwrap(); - assert_eq!(target_md5, temp_md5); + assert!(output.unwrap().success()); } } -- cgit v1.3.1