From e2d117e6ca1addeeb0dcdb11e5cf357f9fae1989 Mon Sep 17 00:00:00 2001 From: jakka Date: Thu, 19 Jun 2025 15:34:40 +0300 Subject: added progress bars --- src/files.rs | 65 ++++++++++++++++++++++++++---------------------------------- 1 file changed, 28 insertions(+), 37 deletions(-) (limited to 'src/files.rs') 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, conn: Database) -> Result<()> { Ok(()) } -async fn count_flacs(path: impl AsRef) -> 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::>(); - counter -} - pub async fn index_files_recursively(path: impl AsRef, 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::>(); 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(()) } -- cgit v1.3.1