summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakka <jakkadoujin@gmail.com>2025-06-19 22:28:40 +0300
committerjakka <jakkadoujin@gmail.com>2025-06-19 22:28:40 +0300
commit631a904769fb7859adfb7e0ca9fb1bb20f9c5c77 (patch)
tree7be6ba6892ec363d437b129df080ac691985b076
parent1dde9216b9fc231720815963a5417066f3160248 (diff)
checking files before reencodingv0.1.2
-rw-r--r--CHANGELOG.md5
-rw-r--r--Cargo.lock13
-rw-r--r--Cargo.toml11
-rw-r--r--src/files.rs78
-rw-r--r--src/flac.rs7
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
diff --git a/Cargo.lock b/Cargo.lock
index 64f5849..7246b0b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index da428e8..617c6fb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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()