Skip to content

Instantly share code, notes, and snippets.

@nicholascw
Last active February 24, 2024 09:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicholascw/945d5ddc3b6724ef186de5a2697fe41e to your computer and use it in GitHub Desktop.
Save nicholascw/945d5ddc3b6724ef186de5a2697fe41e to your computer and use it in GitHub Desktop.
i3bar MPRIS control using zsh and playerctl
mpris_bar () {
echo '{"version":1, "click_events":true}'
echo '['
echo '[]'
mpris_cur_player=0
while :;
do
mpris_players=( $(playerctl -l) )
num_of_players=$#mpris_players
if [[ $num_of_players -eq 0 ]]; then
echo ",[{\"full_text\":\"Nothing playing!\"}]"
sleep 1
continue
fi
let 'mpris_cur_player %= num_of_players'
mpris_cur_player_name=${mpris_players[@]:$mpris_cur_player:1}
mpris_status=$(playerctl -p $mpris_cur_player_name metadata -f '{{status}}: {{ duration(position) }} / {{ duration(mpris:length) }}' | tr -d '\n' | jq -Rs)
mpris_playing=$(playerctl -p $mpris_cur_player_name status)
mpris_loop=$(playerctl -p $mpris_cur_player_name loop)
mpris_shuffle=$(playerctl -p $mpris_cur_player_name shuffle)
mpris_title=$(playerctl -p $mpris_cur_player_name metadata title | tr -d '\n' | jq -Rs)
mpris_artist=$(playerctl -p $mpris_cur_player_name metadata artist | tr -d '\n' | jq -Rs)
mpris_album=$(playerctl -p $mpris_cur_player_name metadata album | tr -d '\n' | jq -Rs)
#mpris_url=$(playerctl -p $mpris_cur_player_name metadata xesam:url)
playpause_txt="play!"
if [[ $mpris_playing = "Playing" ]] playpause_txt="pause"
player_name_output="Player: $mpris_cur_player_name ($(($mpris_cur_player+1))/$num_of_players)"
echo ",["
echo "{\"name\":\"player\",\"full_text\":$(printf $player_name_output | tr -d '\n' | jq -Rs)},"
echo "{\"name\":\"status\",\"full_text\":$mpris_status},"
echo "{\"name\":\"title\",\"full_text\":$mpris_title},"
echo "{\"name\":\"album\",\"full_text\":$mpris_album},"
echo "{\"name\":\"artist\",\"full_text\":$mpris_artist},"
echo "{\"name\":\"playpause\",\"full_text\":\"$playpause_txt\"},"
echo "{\"name\":\"prev\",\"full_text\":\"prev\"},"
echo "{\"name\":\"next\",\"full_text\":\"next\"},"
echo "{\"name\":\"loop\",\"full_text\":\"loop: $mpris_loop\"},"
echo "{\"name\":\"shuffle\",\"full_text\":\"shuffle: $mpris_shuffle\"}"
echo "]"
clickevent=""
read -t 1 clickevent
event_name=$(echo $clickevent | grep -o '{.*' | jq '.name' | grep -Eo '[^"]*')
if [[ $event_name = "player" ]]; then
echo $clickevent >> /tmp/cur
mpris_players=( $(playerctl -l) )
num_of_players=$#mpris_players
let 'mpris_cur_player += 1'
let 'mpris_cur_player %= num_of_players'
fi
if [[ $event_name = "status" ]]; then
playerctl -p $mpris_cur_player_name play-pause
fi
if [[ $event_name = "playpause" ]]; then
playerctl -p $mpris_cur_player_name play-pause
fi
if [[ $event_name = "prev" ]]; then
playerctl -p $mpris_cur_player_name previous
fi
if [[ $event_name = "next" ]]; then
playerctl -p $mpris_cur_player_name next
fi
if [[ $event_name = "loop" ]]; then
playerctl -p $mpris_cur_player_name loop toggle
fi
if [[ $event_name = "shuffle" ]]; then
playerctl -p $mpris_cur_player_name shuffle toggle
fi
#if [[ $event_name = "title" && ! -z $mpris_url ]]; then
# i3-msg exec firefox - $mpris_url
#fi
#if [[ $event_name = "album" && ! -z $mpris_url ]]; then
# i3-msg exec firefox - $mpris_url
#fi
#if [[ $event_name = "artist" && ! -z $mpris_url ]]; then
# i3-msg exec firefox - $mpris_url
#fi
#if [[ $event_name = "title" && ! -z $mpris_url ]]; then
# i3-msg exec firefox - $mpris_url
#fi
done
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment