diff options
| author | jakka <jakkadoujin@gmail.com> | 2025-06-19 22:28:40 +0300 |
|---|---|---|
| committer | jakka <jakkadoujin@gmail.com> | 2025-06-19 22:28:40 +0300 |
| commit | 631a904769fb7859adfb7e0ca9fb1bb20f9c5c77 (patch) | |
| tree | 7be6ba6892ec363d437b129df080ac691985b076 | |
| parent | 1dde9216b9fc231720815963a5417066f3160248 (diff) | |
checking files before reencodingv0.1.2
| -rw-r--r-- | CHANGELOG.md | 5 | ||||
| -rw-r--r-- | Cargo.lock | 13 | ||||
| -rw-r--r-- | Cargo.toml | 11 | ||||
| -rw-r--r-- | src/files.rs | 78 | ||||
| -rw-r--r-- | src/flac.rs | 7 |
5 files changed, 77 insertions, 37 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e2a1a60 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# v0.1.2 +* added better bar incremental logic by passing it to threads +* added graceful shutdown (albeit its a bit slow) +* checks file if it exists before reencoding +* removes temporary file if it was left uncleaned from the previous session
\ No newline at end of file @@ -547,12 +547,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "flac-reencoder" -version = "0.1.1" +version = "0.1.2" dependencies = [ "anyhow", "clap", @@ -1858,6 +1858,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symphonia" version = "0.5.4" +source = "git+https://github.com/sscobici/Symphonia.git?rev=2213f274c3e7231fbd7b08aa9347049852915b29#2213f274c3e7231fbd7b08aa9347049852915b29" dependencies = [ "lazy_static", "symphonia-bundle-flac", @@ -1868,6 +1869,7 @@ dependencies = [ [[package]] name = "symphonia-bundle-flac" version = "0.5.4" +source = "git+https://github.com/sscobici/Symphonia.git?rev=2213f274c3e7231fbd7b08aa9347049852915b29#2213f274c3e7231fbd7b08aa9347049852915b29" dependencies = [ "log", "symphonia-common", @@ -1878,6 +1880,7 @@ dependencies = [ [[package]] name = "symphonia-common" version = "0.5.4" +source = "git+https://github.com/sscobici/Symphonia.git?rev=2213f274c3e7231fbd7b08aa9347049852915b29#2213f274c3e7231fbd7b08aa9347049852915b29" dependencies = [ "symphonia-core", "symphonia-metadata", @@ -1886,6 +1889,7 @@ dependencies = [ [[package]] name = "symphonia-core" version = "0.5.4" +source = "git+https://github.com/sscobici/Symphonia.git?rev=2213f274c3e7231fbd7b08aa9347049852915b29#2213f274c3e7231fbd7b08aa9347049852915b29" dependencies = [ "bitflags 2.9.1", "bytemuck", @@ -1898,6 +1902,7 @@ dependencies = [ [[package]] name = "symphonia-metadata" version = "0.5.4" +source = "git+https://github.com/sscobici/Symphonia.git?rev=2213f274c3e7231fbd7b08aa9347049852915b29#2213f274c3e7231fbd7b08aa9347049852915b29" dependencies = [ "lazy_static", "log", @@ -1,6 +1,6 @@ [package] name = "flac-reencoder" -version = "0.1.1" +version = "0.1.2" edition = "2024" repository = "https://github.com/justjakka/reencoder/" license = "BSD-3-Clause" @@ -24,13 +24,10 @@ indicatif = { version = "0.17.11", features = [ "improved_unicode", "futures", ] } -libsql = { version = "0.9.10", features = ["core", "sync"] } +libsql = { version = "0.9.11" } md-5 = "0.10.6" metaflac = "0.2.8" pin-utils = "0.1.0" -symphonia = { version = "0.5.4", path = "../Symphonia/symphonia", default-features = false, features = [ - "flac", -] } tokio = { version = "1.45.1", features = [ "macros", "rt", @@ -39,4 +36,6 @@ tokio = { version = "1.45.1", features = [ ] } tokio-util = "0.7.15" walkdir = "2.5.0" -#symphonia = { git = "https://github.com/pdeljanov/Symphonia.git", branch = "dev-0.6", default-features = false, features = ["flac"] } +symphonia = { git = "https://github.com/sscobici/Symphonia.git", rev = "2213f274c3e7231fbd7b08aa9347049852915b29", default-features = false, features = [ + "flac", +] } diff --git a/src/files.rs b/src/files.rs index bbf4acb..bbcc0c4 100644 --- a/src/files.rs +++ b/src/files.rs @@ -1,6 +1,6 @@ use anyhow::{Result, anyhow}; use futures_util::StreamExt; -#[allow(unused_imports)] +#[cfg(not(test))] use indicatif::{ProgressBar, ProgressStyle}; use pin_utils::pin_mut; use std::{ @@ -15,7 +15,7 @@ use walkdir::WalkDir; use crate::{db::Database, flac::encode_file}; -#[allow(dead_code)] +#[cfg(not(test))] const BAR_TEMPLATE: &str = "{msg} [{wide_bar:.green/cyan}] Elapsed: {elapsed} {pos:>7}/{len:7}"; #[derive(Debug)] @@ -84,7 +84,7 @@ pub async fn index_files_recursively( } let abspath = path.as_ref().canonicalize()?; - let mut tasks = JoinSet::new(); + let mut tasks: JoinSet<Result<(), anyhow::Error>> = JoinSet::new(); #[cfg(not(test))] let bar = ProgressBar::new(0) @@ -99,7 +99,14 @@ pub async fn index_files_recursively( if let Some(ext) = path.extension() { if ext == "flac" { let newconn = conn.clone(); - tasks.spawn(async move { handle_file(path, newconn).await }); + #[cfg(not(test))] + let newbar = bar.clone(); + tasks.spawn(async move { + handle_file(path, newconn).await?; + #[cfg(not(test))] + newbar.inc(1); + Ok(()) + }); #[cfg(not(test))] bar.inc_length(1); } @@ -110,9 +117,18 @@ pub async fn index_files_recursively( while let Some(task) = tokio::select! { _ = canceltoken.cancelled() => { + tasks.abort_all(); + + while let Some(task) = tasks.join_next().await { + match task { + Ok(Err(error)) => eprintln!("{error}"), + Err(error) => if !error.is_cancelled() {eprintln!("Error encountered:\t{}", error)}, + _ => {} + } + } + #[cfg(not(test))] bar.abandon_with_message("Indexing aborted"); - tasks.shutdown().await; return Ok(()) }, task = tasks.join_next() => task @@ -120,10 +136,7 @@ pub async fn index_files_recursively( match task { Ok(Err(error)) => eprintln!("{error}"), Err(error) => eprintln!("Error encountered:\t{}", error), - _ => { - #[cfg(not(test))] - bar.inc(1); - } + _ => {} } } @@ -146,27 +159,43 @@ pub async fn reencode_files(conn: &Database, canceltoken: CancellationToken) -> while let Some(Ok(row)) = stream.next().await { if let Some(file) = row.get_value(0)?.as_text() { let filename = Path::new(file).canonicalize()?; - let newconn = conn.clone(); - tasks.spawn(async move { - let file = filename.clone(); - if let Err(error) = tokio::task::spawn_blocking(move || encode_file(file)).await? { - return Err(anyhow!(FileError::new(&filename, error))); - }; - - if let Err(error) = newconn.update_file(&filename).await { - return Err(anyhow!(FileError::new(&filename, error))); - }; + if filename.exists() { + let newconn = conn.clone(); + #[cfg(not(test))] + let newbar = bar.clone(); + tasks.spawn(async move { + let file = filename.clone(); + if let Err(error) = + tokio::task::spawn_blocking(move || encode_file(file)).await? + { + return Err(anyhow!(FileError::new(&filename, error))); + }; - Ok(()) - }); + if let Err(error) = newconn.update_file(&filename).await { + return Err(anyhow!(FileError::new(&filename, error))); + }; + #[cfg(not(test))] + newbar.inc(1); + Ok(()) + }); + } } } while let Some(task) = tokio::select! { _ = canceltoken.cancelled() => { + tasks.abort_all(); + + while let Some(task) = tasks.join_next().await { + match task { + Ok(Err(error)) => eprintln!("{error}"), + Err(error) => if !error.is_cancelled() {eprintln!("Error encountered:\t{}", error)}, + _ => {} + } + } + #[cfg(not(test))] bar.abandon_with_message("Reencoding aborted"); - tasks.shutdown().await; return Ok(()) }, task = tasks.join_next() => task @@ -174,10 +203,7 @@ pub async fn reencode_files(conn: &Database, canceltoken: CancellationToken) -> match task { Ok(Err(error)) => eprintln!("Error encountered:\t{error}"), Err(error) => eprintln!("Error encountered:\t{error}"), - _ => { - #[cfg(not(test))] - bar.inc(1); - } + _ => {} } } diff --git a/src/flac.rs b/src/flac.rs index 2870500..4283aad 100644 --- a/src/flac.rs +++ b/src/flac.rs @@ -283,8 +283,13 @@ fn encode_cycle_32( pub fn encode_file(filename: impl AsRef<Path>) -> Result<()> { let filencoder = FileEncoder::new(filename)?; + let temp_name = filencoder.temp_name(); - let mut outf = File::create(filencoder.temp_name())?; + if temp_name.exists() { + std::fs::remove_file(&temp_name)?; + } + + let mut outf = File::create(temp_name)?; let mut outw = WriteWrapper(&mut outf); let enc = FlacEncoder::new() .unwrap() |
