aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsalmonik <raisersoft@proton.me>2026-05-06 13:20:02 +0200
committersalmonik <raisersoft@proton.me>2026-05-06 13:20:02 +0200
commit932436d47af1c73b6d5781dedec84bd82bfe7ff4 (patch)
tree436d0554710e06b94ed62d5d429adff82f5c5fdb
parentAdd install script, shell completions, and systemd service (diff)
downloadrsplayer-932436d47af1c73b6d5781dedec84bd82bfe7ff4.tar.gz
rsplayer-932436d47af1c73b6d5781dedec84bd82bfe7ff4.zip
Add toggle command to resume/pause playback and fix queue display bug
- Add 'rsp toggle' command to toggle between play and pause - Fix queue display showing wrong track as playing when shuffle is enabled - Update shell completion scripts for new toggle command
Diffstat (limited to '')
-rw-r--r--completions/rsp.bash2
-rw-r--r--completions/rsp.fish2
-rw-r--r--completions/rsp.zsh2
-rw-r--r--src/cli.rs5
-rw-r--r--src/daemon.rs15
5 files changed, 22 insertions, 4 deletions
diff --git a/completions/rsp.bash b/completions/rsp.bash
index 55a25b0..b625927 100644
--- a/completions/rsp.bash
+++ b/completions/rsp.bash
@@ -6,7 +6,7 @@ _rsp() {
6 6
7 case $prev in 7 case $prev in
8 rsp) 8 rsp)
9 COMPREPLY=($(compgen -W "start stop restart play pause resume next previous volume shuffle queue status scan settings" -- "$cur")) 9 COMPREPLY=($(compgen -W "start stop restart play pause resume toggle next previous volume shuffle queue status scan settings" -- "$cur"))
10 ;; 10 ;;
11 play) 11 play)
12 _filedir 12 _filedir
diff --git a/completions/rsp.fish b/completions/rsp.fish
index 1fd7483..4f44f63 100644
--- a/completions/rsp.fish
+++ b/completions/rsp.fish
@@ -1,6 +1,6 @@
1# rsp fish completion 1# rsp fish completion
2 2
3complete -c rsp -n '__fish_use_subcommand' -a 'start stop restart play pause resume next previous volume shuffle queue status scan settings' -d 'Command' 3complete -c rsp -n '__fish_use_subcommand' -a 'start stop restart play pause resume toggle next previous volume shuffle queue status scan settings' -d 'Command'
4 4
5complete -c rsp -n '__fish_seen_subcommand_from play' -f -d 'Audio file or directory' 5complete -c rsp -n '__fish_seen_subcommand_from play' -f -d 'Audio file or directory'
6 6
diff --git a/completions/rsp.zsh b/completions/rsp.zsh
index c07feb1..cfba4e5 100644
--- a/completions/rsp.zsh
+++ b/completions/rsp.zsh
@@ -8,7 +8,7 @@ _rsp() {
8 case $state in 8 case $state in
9 cmd) 9 cmd)
10 _values 'command' \ 10 _values 'command' \
11 'start' 'stop' 'restart' 'play' 'pause' 'resume' 'next' 'previous' \ 11 'start' 'stop' 'restart' 'play' 'pause' 'resume' 'toggle' 'next' 'previous' \
12 'volume' 'shuffle' 'queue' 'status' 'scan' 'settings' 12 'volume' 'shuffle' 'queue' 'status' 'scan' 'settings'
13 ;; 13 ;;
14 args) 14 args)
diff --git a/src/cli.rs b/src/cli.rs
index a18b8f1..0da3078 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -37,6 +37,8 @@ pub enum Commands {
37 Pause, 37 Pause,
38 /// Resume playback 38 /// Resume playback
39 Resume, 39 Resume,
40 /// Toggle play/pause
41 Toggle,
40 /// Stop playback 42 /// Stop playback
41 StopPlayback, 43 StopPlayback,
42 /// Skip to next track 44 /// Skip to next track
@@ -133,6 +135,9 @@ impl Cli {
133 Commands::Resume => { 135 Commands::Resume => {
134 crate::daemon::send_command("resume".to_string())?; 136 crate::daemon::send_command("resume".to_string())?;
135 } 137 }
138 Commands::Toggle => {
139 crate::daemon::send_command("toggle".to_string())?;
140 }
136 Commands::StopPlayback => { 141 Commands::StopPlayback => {
137 crate::daemon::send_command("stop".to_string())?; 142 crate::daemon::send_command("stop".to_string())?;
138 } 143 }
diff --git a/src/daemon.rs b/src/daemon.rs
index dab0e5a..3379c7b 100644
--- a/src/daemon.rs
+++ b/src/daemon.rs
@@ -475,6 +475,15 @@ fn process_command(
475 audio.resume(); 475 audio.resume();
476 "Resumed\n".to_string() 476 "Resumed\n".to_string()
477 } 477 }
478 "toggle" => {
479 if audio.is_playing() {
480 audio.pause();
481 "Paused\n".to_string()
482 } else {
483 audio.resume();
484 "Resumed\n".to_string()
485 }
486 }
478 "stop" => { 487 "stop" => {
479 audio.stop(); 488 audio.stop();
480 // Clear queue on stop 489 // Clear queue on stop
@@ -685,6 +694,10 @@ fn process_command(
685 } else { 694 } else {
686 let mut output = String::new(); 695 let mut output = String::new();
687 let current_position = q.position; 696 let current_position = q.position;
697 let playing_track_idx = match q.shuffle {
698 ShuffleMode::None => current_position,
699 _ => *q.shuffled_indices.get(current_position).unwrap_or(&0),
700 };
688 // Use shuffled_indices for display order if shuffle is on 701 // Use shuffled_indices for display order if shuffle is on
689 let indices: Vec<usize> = if let ShuffleMode::None = q.shuffle { 702 let indices: Vec<usize> = if let ShuffleMode::None = q.shuffle {
690 (0..q.tracks.len()).collect() 703 (0..q.tracks.len()).collect()
@@ -694,7 +707,7 @@ fn process_command(
694 for (display_idx, &track_idx) in indices.iter().enumerate() { 707 for (display_idx, &track_idx) in indices.iter().enumerate() {
695 if let Some(track) = q.tracks.get(track_idx) { 708 if let Some(track) = q.tracks.get(track_idx) {
696 let track_str = track.display_string(display_idx); 709 let track_str = track.display_string(display_idx);
697 if track_idx == current_position { 710 if track_idx == playing_track_idx {
698 output.push_str(&format!("> {} (playing)\n", track_str)); 711 output.push_str(&format!("> {} (playing)\n", track_str));
699 } else { 712 } else {
700 output.push_str(&format!(" {}\n", track_str)); 713 output.push_str(&format!(" {}\n", track_str));