Added basic airsonic support
This commit is contained in:
38
src/main.rs
38
src/main.rs
@@ -1,3 +1,4 @@
|
||||
mod airsonic;
|
||||
mod db;
|
||||
mod filesystem;
|
||||
mod lastfm;
|
||||
@@ -27,7 +28,7 @@ fn db_path() -> PathBuf {
|
||||
fn usage(program: &str) -> ! {
|
||||
eprintln!("Usage:");
|
||||
eprintln!(" {program} index [-v] [-f] <directory>");
|
||||
eprintln!(" {program} build [-v] [-m] [-s|-r] [-n COUNT] [file]");
|
||||
eprintln!(" {program} build [-v] [-m|-a] [-s|-r] [-n COUNT] [file]");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
@@ -139,6 +140,7 @@ fn cmd_index(args: &[String]) {
|
||||
fn cmd_build(args: &[String]) {
|
||||
let verbose = args.iter().any(|a| a == "-v");
|
||||
let mpd = args.iter().any(|a| a == "-m");
|
||||
let airsonic = args.iter().any(|a| a == "-a");
|
||||
let shuffle = args.iter().any(|a| a == "-s");
|
||||
let random = args.iter().any(|a| a == "-r");
|
||||
|
||||
@@ -147,12 +149,17 @@ fn cmd_build(args: &[String]) {
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
if mpd && airsonic {
|
||||
eprintln!("Error: -m and -a are mutually exclusive");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
// Parse -n COUNT
|
||||
let mut count: usize = 20;
|
||||
let mut rest: Vec<&String> = Vec::new();
|
||||
let mut iter = args.iter().skip(2);
|
||||
while let Some(arg) = iter.next() {
|
||||
if arg == "-v" || arg == "-m" || arg == "-s" || arg == "-r" {
|
||||
if arg == "-v" || arg == "-m" || arg == "-a" || arg == "-s" || arg == "-r" {
|
||||
continue;
|
||||
} else if arg == "-n" {
|
||||
match iter.next() {
|
||||
@@ -174,7 +181,7 @@ fn cmd_build(args: &[String]) {
|
||||
}
|
||||
|
||||
if rest.len() > 1 {
|
||||
eprintln!("Usage: {} build [-v] [-m] [-s|-r] [-n COUNT] [file]", args[0]);
|
||||
eprintln!("Usage: {} build [-v] [-m|-a] [-s|-r] [-n COUNT] [file]", args[0]);
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
@@ -217,7 +224,7 @@ fn cmd_build(args: &[String]) {
|
||||
}
|
||||
};
|
||||
|
||||
build_playlist(&conn, &artist_mbid, &seed_name, count, verbose, mpd, shuffle, random);
|
||||
build_playlist(&conn, &artist_mbid, &seed_name, count, verbose, mpd, airsonic, shuffle, random);
|
||||
}
|
||||
|
||||
fn build_playlist(
|
||||
@@ -227,6 +234,7 @@ fn build_playlist(
|
||||
count: usize,
|
||||
verbose: bool,
|
||||
mpd: bool,
|
||||
airsonic: bool,
|
||||
shuffle: bool,
|
||||
random: bool,
|
||||
) {
|
||||
@@ -329,10 +337,12 @@ fn build_playlist(
|
||||
|
||||
let tracks: Vec<String> = selected.iter().map(|(_, _, p)| p.clone()).collect();
|
||||
|
||||
let local_dir = env::var("LOCAL_MUSIC_DIR").unwrap_or_default();
|
||||
|
||||
if mpd {
|
||||
let music_dir = env::var("MPD_MUSIC_DIR").unwrap_or_default();
|
||||
if music_dir.is_empty() {
|
||||
eprintln!("Error: MPD_MUSIC_DIR not set");
|
||||
let mpd_dir = env::var("MPD_MUSIC_DIR").unwrap_or_default();
|
||||
if local_dir.is_empty() || mpd_dir.is_empty() {
|
||||
eprintln!("Error: LOCAL_MUSIC_DIR and MPD_MUSIC_DIR must be set");
|
||||
std::process::exit(1);
|
||||
}
|
||||
let mut client = match mpd::MpdClient::connect() {
|
||||
@@ -342,7 +352,19 @@ fn build_playlist(
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
client.queue_playlist(&tracks, &music_dir);
|
||||
client.queue_playlist(&tracks, &local_dir, &mpd_dir);
|
||||
} else if airsonic {
|
||||
let client = match airsonic::AirsonicClient::new() {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
eprintln!("Airsonic error: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
if let Err(e) = client.create_playlist(seed_name, &tracks, conn, verbose) {
|
||||
eprintln!("Airsonic error: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
} else {
|
||||
for track in &tracks {
|
||||
println!("{track}");
|
||||
|
||||
Reference in New Issue
Block a user