diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d604dd5..63d8612 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1241,17 +1241,6 @@ dependencies = [ "regex", ] -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags 1.3.2", - "ignore", - "walkdir", -] - [[package]] name = "gobject-sys" version = "0.15.10" @@ -1890,7 +1879,6 @@ version = "0.3.2" dependencies = [ "anyhow", "data-encoding", - "globwalk", "indoc", "kira", "lofty", @@ -1906,6 +1894,7 @@ dependencies = [ "tauri-build", "thiserror", "tokio", + "walkdir", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e8dfd97..9fe015e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -17,7 +17,6 @@ tauri-build = { version = "1.3", features = [] } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.4", features = [ "shell-open", "devtools", "dialog-all", "global-shortcut-all", "os-all", "path-all", "protocol-all", "window-all"] } -globwalk = "0.8.1" reqwest = { version = "0.11.12", features = ["json"] } lofty = "0.19.2" anyhow = "1.0.71" @@ -31,6 +30,7 @@ data-encoding = "2.4.0" kira = "0.8.7" symphonia = { version = "0.5.2", features = ["all"] } regex = "1.10.4" +walkdir = "2" [features] # by default Tauri runs in production mode diff --git a/src-tauri/src/fs_track.rs b/src-tauri/src/fs_track.rs index 7dcc901..d94087c 100644 --- a/src-tauri/src/fs_track.rs +++ b/src-tauri/src/fs_track.rs @@ -1,4 +1,3 @@ -use globwalk::{glob, DirEntry}; use lofty::error::LoftyError; use lofty::file::AudioFile; use lofty::file::TaggedFileExt; @@ -15,6 +14,7 @@ use thiserror::Error; use std::time::Instant; use crate::db; use tauri::Manager; +use walkdir::{WalkDir, DirEntry}; #[derive(Serialize, Deserialize, Clone, Debug)] pub struct FsTrack { @@ -210,19 +210,25 @@ pub fn load_tracks_from_directories(directories: &Vec, conn: &mut Connec let mut files_scanned: usize = 0; for directory in directories.iter() { let mut entry_batch: Vec = vec![]; - let globwalker = glob(format!("{}/**/*.{{mp3,m4a,flac,ogg,opus,wav,MP3,M4A,FLAC,OGG,OPUS,WAV}}", directory))?; - for item in globwalker { - let entry = item?; - entry_batch.push(entry); - if entry_batch.len() == 100 { - let tracks = load_tracks_from_entry_batch(&entry_batch)?; - - db::add_tracks(&tracks, conn)?; - files_scanned += entry_batch.len(); - app_handle.emit_all("initialize-progress", ScanProgress { progress: None, files_scanned, files_count: Some(files_count) }).unwrap(); - entry_batch.clear(); + for entry in WalkDir::new(directory).follow_links(true).into_iter().filter_map(|e| e.ok()) { + if let Some(extension) = entry.path().extension() { + match extension.to_str().unwrap_or("").to_lowercase().as_str() { + "mp3" | "m4a" | "flac" | "ogg" | "opus" | "wav" => { + entry_batch.push(entry); + }, + _ => {} + } } + if entry_batch.len() == 100 { + let tracks = load_tracks_from_entry_batch(&entry_batch)?; + + db::add_tracks(&tracks, conn)?; + files_scanned += entry_batch.len(); + app_handle.emit_all("initialize-progress", ScanProgress { progress: None, files_scanned, files_count: Some(files_count) }).unwrap(); + entry_batch.clear(); } + } + let tracks = load_tracks_from_entry_batch(&entry_batch)?; db::add_tracks(&tracks, conn)?; files_scanned += entry_batch.len(); @@ -233,11 +239,25 @@ pub fn load_tracks_from_directories(directories: &Vec, conn: &mut Connec Ok(()) } + pub fn count_files_from_directories(directories: &Vec) -> Result { let mut files_count = 0; + for directory in directories.iter() { - let files_in_dir = glob(format!("{}/**/*.{{mp3,m4a,flac,ogg,opus,wav,MP3,M4A,FLAC,OGG,OPUS,WAV}}", directory))?; - files_count += files_in_dir.into_iter().count(); + println!("Scanning directory: {}", directory); + + for entry in WalkDir::new(directory).follow_links(true).into_iter().filter_map(Result::ok) { + let path = entry.path(); + + if let Some(extension) = path.extension() { + match extension.to_str().unwrap_or("").to_lowercase().as_str() { + "mp3" | "m4a" | "flac" | "ogg" | "opus" | "wav" => { + files_count += 1; + }, + _ => {} + } + } + } } Ok(files_count)