From 69028816e8bae8fa6736d81f042eedfcf4cf2463 Mon Sep 17 00:00:00 2001 From: Marty Sluijtman Date: Wed, 18 Jun 2025 09:30:08 +0200 Subject: [PATCH] Basic notification behaviour --- flake.nix | 2 +- src/main.rs | 157 ++++++++++++++++++++++++---------------------------- 2 files changed, 74 insertions(+), 85 deletions(-) diff --git a/flake.nix b/flake.nix index ee8e128..d50a68d 100644 --- a/flake.nix +++ b/flake.nix @@ -19,7 +19,7 @@ naersk-lib = pkgs.callPackage naersk { }; in { - defaultPackage = naersk-lib.buildPackage rec { + packages.default = naersk-lib.buildPackage rec { src = ./.; nativeBuildInputs = with pkgs; [ libnotify diff --git a/src/main.rs b/src/main.rs index abfef2c..b2a3caa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,10 @@ extern crate libnotify; extern crate mpd; -use std::time::Duration; -use std::{io, usize}; - -use mpd::{Client, Query, Song, Term}; - use clap::{Parser, Subcommand}; +use libnotify::Notification; +use mpd::{Client, Query, Song, Term}; +use std::time::Duration; #[derive(Parser)] #[command(author, version, about, long_about = "Banaan")] @@ -49,10 +47,10 @@ enum Commands { ///Only return the first n results #[arg(short, long)] max: Option, - #[arg(short, long)] - append: bool, - #[arg(short, long)] - insert: Option, + // #[arg(short, long)] + // append: bool, + // #[arg(short, long)] + // insert: Option, }, /// Query database differently Find { @@ -62,16 +60,21 @@ enum Commands { ///Only return the first n results #[arg(short, long)] max: Option, + #[arg(short, long)] + append: bool, }, /// List items in the current queueueu List {}, - Add { - #[arg(short, long)] - position: Option, - }, + // Add { + // #[arg(short, long)] + // position: Option, + // }, } fn main() { + libnotify::init("noise").unwrap(); + + let n = libnotify::Notification::new("Noise", None, None); let cli = Cli::parse(); let host = match cli.host { @@ -101,45 +104,41 @@ fn main() { Commands::Stop {} => conn.stop().unwrap(), Commands::Toggle {} => { - println!( - "{}", - match conn.status().unwrap().state { - mpd::State::Pause => "Resuming track...", - mpd::State::Play => "Pausing track...", - mpd::State::Stop => "Track stopped", - } - ); conn.toggle_pause().unwrap(); - let status = get_status(conn, cli.verbose); + let status = get_status(conn, cli.verbose, n); println!("{status}"); } - Commands::Next {} => conn.next().unwrap(), + Commands::Next {} => { + conn.next().unwrap(); + let status = get_status(conn, cli.verbose, n); + println!("{status}"); + } - Commands::Prev {} => conn.prev().unwrap(), + Commands::Prev {} => { + conn.prev().unwrap(); + let status = get_status(conn, cli.verbose, n); + println!("{status}"); + } Commands::List {} => print_songs(conn.queue().unwrap()), - // Commands::List {} => { - // conn.insert(first_song, usize::try_from(1).unwrap()); - // println!("{:?}", conn.queue().unwrap().first()); - // } + Commands::Update {} => { let thing = conn.update().unwrap(); println!("{thing}") } Commands::Current {} => { - let status = get_status(conn, cli.verbose); + let status = get_status(conn, cli.verbose, n); println!("{status}"); } Commands::Search { query, max, - append, - insert, + // append, + // insert, } => { - let mut result: Vec = vec![]; let mut songs: Vec = vec![]; let query = query.join(" "); // I want to return all results by default @@ -151,29 +150,26 @@ fn main() { conn.stats().unwrap().songs }, ); - if *append { - let queue_length = conn.status().unwrap().queue_len; - let _song = conn - .search(&Query::new().and(Term::Any, query), window) - .unwrap() - .iter() - .map(|x| songs.push(x.clone())); - conn.insert( - songs.first().unwrap(), - usize::try_from(queue_length).unwrap(), - ) - .unwrap(); - } else { - conn.search(&Query::new().and(Term::Any, query), window) - .unwrap() - .iter() - .for_each(|x| result.push(x.file.clone())); - result.iter().for_each(|x| println!("{x}")) - } + // let queue_length = conn.status().unwrap().queue_len; + // conn.search(&Query::new().and(Term::Any, query), window) + // .unwrap() + // .iter() + // .for_each(|x| songs.push(x.clone())); + + // songs.iter().rev().for_each(|x| { + // conn.insert(x, usize::try_from(queue_length).unwrap()) + // .unwrap(); + // }); + //conn.insert(, usize::try_from(queue_length).unwrap()) + conn.search(&Query::new().and(Term::Any, query), window) + .unwrap() + .iter() + .for_each(|x| songs.push(x.clone())); + songs.iter().for_each(|x| println!("{}", x.file)) } - Commands::Find { query, max } => { - let mut result: Vec = vec![]; + Commands::Find { query, max, append } => { + let mut songs: Vec = vec![]; let query = query.join(" "); let window = ( 0, @@ -183,11 +179,15 @@ fn main() { conn.stats().unwrap().songs }, ); - conn.find(&Query::new().and(Term::Any, query), window) - .unwrap() - .iter() - .for_each(|x| result.push(x.file.clone())); - result.iter().for_each(|x| println!("{x}")) + if *append { + conn.findadd(&Query::new().and(Term::Any, query)).unwrap(); + } else { + conn.find(&Query::new().and(Term::Any, query), window) + .unwrap() + .iter() + .for_each(|x| songs.push(x.clone())); + songs.iter().for_each(|x| println!("{}", x.file)) + } } Commands::Crossfade { seconds } => { @@ -200,37 +200,18 @@ fn main() { println!("Crossfade disabled") } } - } - - Commands::Add { position } => { - // insert_or_append(conn, *position); - println!("{:?}", position); - } + } // Commands::Add { position } => { + // // insert_or_append(conn, *position); + // println!("{:?}", position); + // } } } else { - let status = get_status(conn, cli.verbose); - println!("{}", status); - // println!("{:?}", conn.status().unwrap()); - - libnotify::init("noise").unwrap(); - let n = libnotify::Notification::new("Noise", None, None); - n.show().unwrap(); - + let status = get_status(conn, cli.verbose, n); + println!("{}", &status); libnotify::uninit(); } } -fn stdin_reader() -> String { - "fiets".to_string() -} - -// fn insert_or_append(mut client: Client, position: Option) { -// if let Some(pos) = position { -// client.insert(usize::try_from(1).unwrap(), usize::try_from(pos).unwrap()); -// // let position = usize::try_from(position.unwrap()).unwrap(); -// } -// } - fn print_songs(songs: Vec) -> () { songs .iter() @@ -246,7 +227,7 @@ fn bts(b: bool) -> &'static str { b.then(|| "on").unwrap_or("off") } -fn get_status(mut client: Client, verbose: bool) -> String { +fn get_status(mut client: Client, verbose: bool, notify: Notification) -> String { let status = client.status().unwrap(); let repeat = bts(status.repeat); @@ -269,6 +250,8 @@ fn get_status(mut client: Client, verbose: bool) -> String { output.push("No song playing".to_string()) } + send_notification(output.first().unwrap().clone(), notify); + if verbose { output.push(format!( "volume: {vol:<6} repeat: {repeat:<6} random: {rnd:<6} single: {single:<6} consume: {consume:<6}", @@ -294,6 +277,12 @@ fn get_status(mut client: Client, verbose: bool) -> String { output.join("\n") } +fn send_notification(body: String, notify: Notification) -> String { + let _ = notify.update("Noise", body.as_str(), None); + notify.show().unwrap(); + body +} + fn to_mins_string(dur: Duration) -> String { let seconds = dur.as_secs();