feat!: search playerctl players using simsearch

This commit is contained in:
2024-06-29 12:37:17 +02:00
parent d2ed1dba66
commit 2c3dc3a3c9
3 changed files with 37 additions and 7 deletions

View File

@@ -1,20 +1,27 @@
use std::process::Command;
use anyhow::{anyhow, Result};
use simsearch::{SearchOptions, SimSearch};
fn get_playerctl_player(target: &str) -> Result<String> {
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<u32> = SimSearch::new_with(search_options);
for (i, p) in players.iter().enumerate() {
engine.insert(i as u32, p);
}
let results: Vec<u32> = 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(())
}