diff options
| author | jakka <jakkadoujin@gmail.com> | 2025-06-14 00:22:23 +0300 |
|---|---|---|
| committer | jakka <jakkadoujin@gmail.com> | 2025-06-14 00:22:23 +0300 |
| commit | 11d428265b3f7f5541779ef2df24bfb17d7250aa (patch) | |
| tree | fca76dc45e78325d5b4dc2597002d430eec888c2 /src/files.rs | |
| parent | cddc489acdd2f0ed93632093f8b86a45fc3601aa (diff) | |
added more file processing logic
Diffstat (limited to 'src/files.rs')
| -rw-r--r-- | src/files.rs | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/src/files.rs b/src/files.rs index e0d9757..dc96650 100644 --- a/src/files.rs +++ b/src/files.rs @@ -1,5 +1,6 @@ use anyhow::{Result, anyhow}; -use libsql::Connection; +use futures_util::StreamExt; +use pin_utils::pin_mut; use std::{ fmt::Display, path::{Path, PathBuf, absolute}, @@ -7,14 +8,20 @@ use std::{ }; use tokio::{fs::read_dir, task::JoinSet}; -use crate::db::Database; +use crate::{db::Database, flac::handle_encode}; #[derive(Debug)] -struct FileError { +pub struct FileError { file: PathBuf, error: anyhow::Error, } +impl FileError { + pub fn new(file: PathBuf, error: anyhow::Error) -> Self { + FileError { file, error } + } +} + impl Display for FileError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -37,17 +44,17 @@ async fn handle_file(file: PathBuf, conn: Database) -> Result<()> { let db_time = conn.get_modtime(&file).await?; if modtime != db_time { if let Err(error) = conn.update_file(&file).await { - return Err(anyhow!(FileError { file, error })); + return Err(anyhow!(FileError::new(file, error))); }; } return Ok(()); } - Err(error) => return Err(anyhow!(FileError { file, error })), + Err(error) => return Err(anyhow!(FileError::new(file, error))), _ => {} } if let Err(error) = conn.insert_file(&file).await { - return Err(anyhow!(FileError { file, error })); + return Err(anyhow!(FileError::new(file, error))); } Ok(()) @@ -59,7 +66,6 @@ pub async fn index_files_recursively(path: &Path, conn: &Database) -> Result<()> } let abspath = absolute(path)?; let mut tasks = JoinSet::new(); - let mut counter: i64 = 0; let mut dirs = vec![abspath]; @@ -74,12 +80,34 @@ pub async fn index_files_recursively(path: &Path, conn: &Database) -> Result<()> if let Some(ext) = path.extension() { if ext == "flac" { let newconn = conn.clone(); - counter += 1; tasks.spawn(async move { handle_file(path, newconn).await }); } } } - print!("\rFiles found:\t{counter}") + } + } + + while let Some(task) = tasks.join_next().await { + match task { + Ok(Err(error)) => eprintln!("{error}"), + Err(error) => eprintln!("Error encountered:\t{}", error), + _ => {} + } + } + + Ok(()) +} + +pub async fn reencode_files(conn: &Database) -> Result<()> { + let stream = conn.get_toencode_stream().await?; + pin_mut!(stream); + + let mut tasks = JoinSet::new(); + + while let Some(Ok(row)) = stream.next().await { + if let Some(file) = row.get_value(0)?.as_text() { + let filename = PathBuf::from(file.clone()); + tasks.spawn_blocking(move || handle_encode(filename)); } } |
