diff options
| -rw-r--r-- | Cargo.lock | 2 | ||||
| -rw-r--r-- | Cargo.toml | 8 | ||||
| -rw-r--r-- | src/files.rs | 65 | ||||
| -rw-r--r-- | src/main.rs | 8 |
4 files changed, 39 insertions, 44 deletions
@@ -584,7 +584,7 @@ dependencies = [ [[package]] name = "flac-reencoder" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "clap", @@ -1,6 +1,6 @@ [package] name = "flac-reencoder" -version = "0.1.0" +version = "0.1.1" edition = "2024" repository = "https://github.com/justjakka/reencoder/" license = "BSD-3-Clause" @@ -19,7 +19,11 @@ flac-bound = { version = "0.5.0", features = [ ], default-features = false } futures-util = "0.3.31" i24 = "2.1.0" -indicatif = { version = "0.17.11", features = ["tokio", "improved_unicode", "futures"] } +indicatif = { version = "0.17.11", features = [ + "tokio", + "improved_unicode", + "futures", +] } libsql = { version = "0.9.10", features = ["core", "sync"] } md-5 = "0.10.6" metaflac = "0.2.8" diff --git a/src/files.rs b/src/files.rs index 6f2bce2..79d0499 100644 --- a/src/files.rs +++ b/src/files.rs @@ -1,5 +1,6 @@ use anyhow::{Result, anyhow}; use futures_util::StreamExt; +use indicatif::{ProgressBar, ProgressStyle}; use pin_utils::pin_mut; use std::{ error::Error, @@ -7,11 +8,17 @@ use std::{ path::{Path, PathBuf}, time::UNIX_EPOCH, }; -use tokio::{fs::read_dir, task::JoinSet}; +use tokio::task::JoinSet; use walkdir::WalkDir; use crate::{db::Database, flac::encode_file}; +const INDEXBAR_TEMPLATE: &str = + "{msg} [{wide_bar:.green/cyan}] Elapsed: {elapsed} {pos:>7}/{len:7}"; + +const REENCODEBAR_TEMPLATE: &str = + "{msg} [{wide_bar:.green/cyan}] Elapsed: {elapsed} {pos:>7}/{len:7}"; + #[derive(Debug)] pub struct FileError { file: PathBuf, @@ -68,64 +75,45 @@ async fn handle_file(file: impl AsRef<Path>, conn: Database) -> Result<()> { Ok(()) } -async fn count_flacs(path: impl AsRef<Path>) -> u64 { - let mut counter = 0; - let _ = WalkDir::new(path) - .into_iter() - .map(|file| { - let path = file.unwrap().into_path(); - if path.is_file() && path.extension().unwrap() == "flac" { - counter += 1 - } - }) - .collect::<Vec<_>>(); - counter -} - pub async fn index_files_recursively(path: impl AsRef<Path>, conn: &Database) -> Result<()> { if !path.as_ref().is_dir() { return Err(anyhow!("Invalid root directory")); } let abspath = path.as_ref().canonicalize()?; - let files = count_flacs(&abspath).await; - - println!("Total flacs:\t{files}"); - let mut tasks = JoinSet::new(); - let mut dirs = vec![abspath]; + let bar = ProgressBar::new(0) + .with_style(ProgressStyle::with_template(INDEXBAR_TEMPLATE)?.progress_chars("#>-")) + .with_message("Indexing"); - let mut counter: u64 = 0; - - while let Some(dir) = dirs.pop() { - let mut read_dir = read_dir(dir).await?; - - while let Some(entry) = read_dir.next_entry().await? { - let path = entry.path(); - if path.is_dir() { - dirs.push(path); - } else if path.is_file() { + let _ = WalkDir::new(abspath) + .into_iter() + .map(|file| { + let path = file.unwrap().into_path(); + if path.is_file() { if let Some(ext) = path.extension() { if ext == "flac" { let newconn = conn.clone(); tasks.spawn(async move { handle_file(path, newconn).await }); + bar.inc_length(1); } } } - } - } + }) + .collect::<Vec<_>>(); while let Some(task) = tasks.join_next().await { match task { Ok(Err(error)) => eprintln!("{error}"), Err(error) => eprintln!("Error encountered:\t{}", error), _ => { - counter += 1; - print!("\rParsed files:\t{counter}"); + bar.inc(1); } } } + + bar.finish_with_message("Finished indexing"); Ok(()) } @@ -135,7 +123,9 @@ pub async fn reencode_files(conn: &Database) -> Result<()> { let mut tasks = JoinSet::new(); - let mut counter: u64 = 0; + let bar = ProgressBar::new(conn.get_toencode_number().await?) + .with_style(ProgressStyle::with_template(REENCODEBAR_TEMPLATE)?.progress_chars("#>-")) + .with_message("Reencoding"); while let Some(Ok(row)) = stream.next().await { if let Some(file) = row.get_value(0)?.as_text() { @@ -161,12 +151,13 @@ pub async fn reencode_files(conn: &Database) -> Result<()> { Ok(Err(error)) => eprintln!("Error encountered:\t{error}"), Err(error) => eprintln!("Error encountered:\t{error}"), _ => { - counter += 1; - print!("Reencoded:\t{counter}"); + bar.inc(1); } } } + bar.finish_with_message("Finished encoding"); + Ok(()) } diff --git a/src/main.rs b/src/main.rs index bb2a716..5273921 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,10 +91,10 @@ fn main() -> Result<()> { if path.is_none() && !args.get_flag("clean") && !args.get_flag("doit") { let count = conn.get_toencode_number().await?; println!("Files to reencode:\t{count}"); - } else if let Some(realpath) = path { - if !args.get_flag("doit") { - files::index_files_recursively(realpath, &conn).await?; - } + } + + if let Some(realpath) = path { + files::index_files_recursively(realpath, &conn).await?; } if args.get_flag("clean") { |
