use std::io; use std::path::PathBuf; fn home_dir() -> PathBuf { return dirs::home_dir().unwrap(); } fn downloads_dir() -> PathBuf { let mut downloads = home_dir(); downloads.push("Downloads"); downloads } fn strip_null_bytes(str: &str) -> String { str.replace('\0', "") } /// e.g. for ~/Music/ABBA/ABBA Gold: /// `create_dir_if_not_exists(vec!["Music", "ABBA", "ABBA Gold"])` fn create_dir_if_not_exists(path: Vec<&str>) -> PathBuf { let mut dir = home_dir(); for item in path { dir.push(item); } std::fs::create_dir_all(&dir).unwrap_or(()); dir } fn move_file(file: PathBuf, mut destination: PathBuf) { println!("Moving to {:?}", destination); destination.push(file.file_name().unwrap().to_str().unwrap()); fs_extra::file::move_file(file, destination, &Default::default()) .expect("Couldn't move file"); } fn main() { let downloads = std::fs::read_dir(downloads_dir()).unwrap(); // todo break this out into a "handle_dir" function, and recursively call it for child dirs for file in downloads { let file = file.unwrap(); match file.path().extension().unwrap_or("none".as_ref()).to_str() { Some("gif") => { /*println!("Here's where we would move things to ~/Pictures");*/ } Some("jpg") => { /*println!("Here's where we would move things to ~/Pictures");*/ } Some("jpeg") => { /*println!("Here's where we would move things to ~/Pictures");*/ } Some("png") => { /*println!("Here's where we would move things to ~/Pictures");*/ } Some("mp3") => { let meta = mp3_metadata::read_from_file(file.path()).unwrap(); for tag in meta.tag { println!("----------------------"); println!("artist: {}", tag.artist.trim()); println!("album: {}", tag.album.trim()); println!("title: {}", tag.title.trim()); println!("move to: ~/Music/{}/{}/?", tag.artist.trim(), tag.album.trim()); let mut answer = String::new(); io::stdin().read_line(&mut answer) .expect("Failed to read input"); if answer.to_lowercase().starts_with("y") { move_file( file.path(), create_dir_if_not_exists( vec![ "Music", strip_null_bytes(&tag.artist).trim(), strip_null_bytes(&tag.album).trim() ] ) ); } else { println!("skipping..."); } } } // todo m4a, flac, etc? _ => { /*println!("Here's where we would do nothing.");*/ } }; } }