92 lines
3.0 KiB
Rust
92 lines
3.0 KiB
Rust
|
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.");*/ }
|
||
|
};
|
||
|
}
|
||
|
}
|