Added last.fm support
This commit is contained in:
57
src/main.rs
57
src/main.rs
@@ -1,30 +1,67 @@
|
||||
mod filesystem;
|
||||
mod lastfm;
|
||||
mod metadata;
|
||||
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
|
||||
fn main() {
|
||||
dotenvy::dotenv().ok();
|
||||
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() != 2 {
|
||||
eprintln!("Usage: {} <directory>", args[0]);
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
let api_key = env::var("LASTFM_API_KEY").unwrap_or_default();
|
||||
let mut lastfm = if api_key.is_empty() {
|
||||
eprintln!("Warning: LASTFM_API_KEY not set, skipping similar artist lookups");
|
||||
None
|
||||
} else {
|
||||
Some(lastfm::LastfmClient::new(api_key))
|
||||
};
|
||||
|
||||
let dir = Path::new(&args[1]);
|
||||
|
||||
for path in filesystem::walk_music_files(dir) {
|
||||
println!("{}", path.display());
|
||||
|
||||
match metadata::read_track_metadata(&path) {
|
||||
Ok(Some(meta)) => {
|
||||
let unknown = "(unknown)";
|
||||
println!(" Title: {}", meta.title.as_deref().unwrap_or(unknown));
|
||||
println!(" Artist: {}", meta.artist.as_deref().unwrap_or(unknown));
|
||||
println!(" Album: {}", meta.album.as_deref().unwrap_or(unknown));
|
||||
match metadata::read_all_metadata(&path) {
|
||||
Ok(Some(entries)) => {
|
||||
println!("{}", path.display());
|
||||
for entry in &entries {
|
||||
println!(" {:30} {}", entry.key, entry.value);
|
||||
}
|
||||
}
|
||||
Ok(None) => {
|
||||
println!("{}", path.display());
|
||||
println!(" (no metadata tags found)");
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("{}: could not read metadata: {e}", path.display());
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(client) = lastfm.as_mut() {
|
||||
let artist_mbid = match metadata::read_artist_mbid(&path) {
|
||||
Ok(Some(mbid)) => mbid,
|
||||
Ok(None) => continue,
|
||||
Err(e) => {
|
||||
eprintln!("{}: could not read artist MBID: {e}", path.display());
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
match client.get_similar_artists(&artist_mbid) {
|
||||
Ok(similar) => {
|
||||
if !similar.is_empty() {
|
||||
println!(" Similar artists:");
|
||||
for a in similar.iter().take(50) {
|
||||
println!(" {:.2} {}", a.match_score, a.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => eprintln!(" Warning: similar artists lookup failed: {e}"),
|
||||
}
|
||||
Ok(None) => println!(" (no metadata tags found)"),
|
||||
Err(e) => eprintln!(" warning: could not read metadata: {e}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user