diff options
| author | salmonik <raisersoft@proton.me> | 2026-05-06 13:20:02 +0200 |
|---|---|---|
| committer | salmonik <raisersoft@proton.me> | 2026-05-06 13:20:02 +0200 |
| commit | 932436d47af1c73b6d5781dedec84bd82bfe7ff4 (patch) | |
| tree | 436d0554710e06b94ed62d5d429adff82f5c5fdb | |
| parent | Add install script, shell completions, and systemd service (diff) | |
| download | rsplayer-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
| -rw-r--r-- | completions/rsp.bash | 2 | ||||
| -rw-r--r-- | completions/rsp.fish | 2 | ||||
| -rw-r--r-- | completions/rsp.zsh | 2 | ||||
| -rw-r--r-- | src/cli.rs | 5 | ||||
| -rw-r--r-- | src/daemon.rs | 15 |
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 | ||
| 3 | complete -c rsp -n '__fish_use_subcommand' -a 'start stop restart play pause resume next previous volume shuffle queue status scan settings' -d 'Command' | 3 | complete -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 | ||
| 5 | complete -c rsp -n '__fish_seen_subcommand_from play' -f -d 'Audio file or directory' | 5 | complete -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) |
| @@ -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)); |
