diff options
| author | krolxon <krolyxon@tutanota.com> | 2024-04-22 13:02:31 +0530 |
|---|---|---|
| committer | krolxon <krolyxon@tutanota.com> | 2024-04-22 13:02:31 +0530 |
| commit | 579b09b61dd15776244a060d99e7d704eb651c33 (patch) | |
| tree | 287f5824604825ba4a9760ee0c2f640552fe4c18 /src/connection.rs | |
| parent | e5e69281caed57c5d76d77e3a5260f37a2673548 (diff) | |
add dmenu selector
Diffstat (limited to 'src/connection.rs')
| -rwxr-xr-x | src/connection.rs | 119 |
1 files changed, 78 insertions, 41 deletions
diff --git a/src/connection.rs b/src/connection.rs index ebc847f..71db995 100755 --- a/src/connection.rs +++ b/src/connection.rs @@ -1,66 +1,53 @@ use mpd::song::Song; use mpd::Client; +use simple_dmenu::dmenu; +use std::process::Command; pub struct Connection { pub conn: Client, + pub songs_filenames: Vec<String>, } impl Connection { pub fn new(addrs: &str) -> Result<Self, mpd::error::Error> { - let conn = Client::connect(addrs)?; - Ok(Self { conn }) + let mut conn = Client::connect(addrs)?; + let mut songs_filenames: Vec<String> = Vec::new(); + get_file_tree_into_vec(&mut conn, &mut songs_filenames, ".", "."); + + Ok(Self { + conn, + songs_filenames, + }) } pub fn play_fzf(&mut self) { - let mut ss: Vec<String> = Vec::new(); - self.get_file_tree_into_vec(&mut ss, ".", "."); - - let choice: usize; + let ss = &self.songs_filenames; let fzf_choice = rust_fzf::select(ss.clone(), Vec::new()).unwrap(); - if let Some(index) = ss.iter().position(|s| s == fzf_choice.get(0).unwrap()) { - choice = index; - } else { - return; - } + let index = get_choice_index(&self.songs_filenames, fzf_choice.get(0).unwrap()); + let song = self.get_song_with_only_filename(ss.get(index).unwrap()); + self.push(&song); + } - let song = self.get_song(ss.get(choice).unwrap()); + pub fn play_dmenu(&mut self) { + let ss: Vec<&str> = self.songs_filenames.iter().map(|x| x.as_str()).collect(); + let op = dmenu!(iter &ss; args "-l", "30"); + let index = get_choice_index(&self.songs_filenames, &op); + let song = self.get_song_with_only_filename(ss.get(index).unwrap()); + self.push(&song); + } + fn push(&mut self, song: &Song) { + self.conn.push(song).unwrap(); if self.conn.queue().unwrap().is_empty() { - self.push(song); + self.conn.push(song).unwrap(); self.conn.play().unwrap(); } else { - self.push(song); + self.conn.push(song).unwrap(); self.conn.next().unwrap(); } } - fn get_file_tree_into_vec(&mut self, vec: &mut Vec<String>, path: &str, dir_append: &str) { - let songs = self.conn.listfiles(path).unwrap_or_default(); - for (i, s) in songs { - // Output of listfiles contains the last-modified thing, we dont want that - if i != "Last-Modified" { - if i == "directory" { - self.get_file_tree_into_vec(vec, &s, &s); - } else { - // We parse the string as float because the output of listfiles contains some random numbers, we dont want that - if !s.parse::<f32>().is_ok() { - let mut sam: String = String::new(); - sam.push_str(dir_append); - sam.push_str(r"/"); - sam.push_str(s.as_str()); - vec.push(sam); - } - } - } - } - } - - fn push(&mut self, song: Song) { - self.conn.push(song).unwrap(); - - } - - fn get_song(&self, filename: &str) -> Song { + fn get_song_with_only_filename(&self, filename: &str) -> Song { Song { file: filename.to_string(), artist: None, @@ -89,4 +76,54 @@ impl Connection { status.volume, status.repeat, status.random, status.single, status.consume ); } + + // Play controls + pub fn pause(&mut self) { + self.conn.pause(true).unwrap(); + } + + pub fn toggle_pause(&mut self) { + self.conn.toggle_pause().unwrap(); + } + + // Volume controls + pub fn inc_volume(&mut self, inc: i8) { + let cur = self.conn.status().unwrap().volume; + self.conn.volume(cur + inc).unwrap(); + } + + pub fn dec_volume(&mut self, dec: i8) { + let cur = self.conn.status().unwrap().volume; + self.conn.volume(cur - dec).unwrap(); + } +} + +fn get_file_tree_into_vec(conn: &mut Client, vec: &mut Vec<String>, path: &str, dir_append: &str) { + let songs = conn.listfiles(path).unwrap_or_default(); + for (i, s) in songs { + // Output of listfiles contains the last-modified thing, we dont want that + if i != "Last-Modified" { + if i == "directory" { + get_file_tree_into_vec(conn, vec, &s, &s); + } else { + // We parse the string as float because the output of listfiles contains some random numbers, we dont want that + if !s.parse::<f32>().is_ok() { + let mut sam: String = String::new(); + sam.push_str(dir_append); + sam.push_str(r"/"); + sam.push_str(s.as_str()); + vec.push(sam); + } + } + } + } +} + +fn get_choice_index(ss: &Vec<String>, selection: &str) -> usize { + let mut choice: usize = 0; + if let Some(index) = ss.iter().position(|s| s == selection) { + choice = index; + } + + choice } |
