From 2c3dc3a3c904a955643467a3ad640d6be3ae3eb4 Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 12:37:17 +0200 Subject: [PATCH 1/2] feat!: search playerctl players using simsearch --- Cargo.lock | 23 +++++++++++++++++++++++ Cargo.toml | 1 + src/playerctl.rs | 20 +++++++++++++------- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af6df35..1a49051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,7 @@ version = "0.1.0" dependencies = [ "anyhow", "libpulse-binding", + "simsearch", ] [[package]] @@ -105,6 +106,22 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "simsearch" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c869b25830e4824ef7279015cfc298a0674aca6a54eeff2efce8d12bf3701fe" +dependencies = [ + "strsim", + "triple_accel", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.109" @@ -116,6 +133,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "triple_accel" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622b09ce2fe2df4618636fb92176d205662f59803f39e70d1c333393082de96c" + [[package]] name = "unicode-ident" version = "1.0.12" diff --git a/Cargo.toml b/Cargo.toml index 6ec7ef1..6d21a2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] anyhow = "1.0.86" pulse = { version = "2.0", package = "libpulse-binding" } +simsearch = "0.2.5" diff --git a/src/playerctl.rs b/src/playerctl.rs index bf18e4b..aabc6bf 100644 --- a/src/playerctl.rs +++ b/src/playerctl.rs @@ -1,20 +1,27 @@ use std::process::Command; use anyhow::{anyhow, Result}; +use simsearch::{SearchOptions, SimSearch}; fn get_playerctl_player(target: &str) -> Result { let get_players = Command::new("playerctl").arg("-l").output()?; let get_players_output = String::from_utf8(get_players.stdout)?; - let players: Vec<&str> = get_players_output.split("\n").collect(); + let players: Vec<&str> = get_players_output.split("\n").filter(|s| !s.is_empty()).collect(); - let Some(player) = players - .iter() - .find(|p| p.to_lowercase().contains(&target.to_lowercase())) - else { + let search_options = SearchOptions::new().threshold(0.8); + let mut engine: SimSearch = SimSearch::new_with(search_options); + + for (i, p) in players.iter().enumerate() { + engine.insert(i as u32, p); + } + + let results: Vec = engine.search(target); + + let Some(player_index) = results.get(0) else { return Err(anyhow!("Error getting player '{target}'")); }; - Ok(player.to_string()) + Ok(players.iter().nth(*player_index as usize).unwrap().to_string()) } pub fn playerctl_play_pause(target: &str) -> Result<()> { @@ -33,7 +40,6 @@ pub fn playerctl_next(target: &str) -> Result<()> { Command::new("playerctl") .args(vec!["-p", &player, "next"]) .spawn()?; - Ok(()) } From b5ffe7257a0a846c11cc9b2d8002a46755fc0bed Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 12:49:50 +0200 Subject: [PATCH 2/2] fix: README --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index c64a514..368527f 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,3 @@ Mixrs will create a unix socket at `/tmp/mixrs` and listen for instructions. Ins |6|PlayPauseCurrent|Tells the current sink input to toggle its `playing` state.
*Behavior varies based on the current sink input's player*| |7|PlayNext|Tells the current sink input to play the next item (e.g. the next song).
*Behavior varies based on the current sink input's player*| |8|PlayPrevious|Tells the current sink input to play the previous item (e.g. the previous song).
*Behavior varies based on the current sink input's player*| -======= -# mixrs -A practical multimedia controller written in Rust