258 lines
7.6 KiB
Bash
Executable file
258 lines
7.6 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# See README.md for usage instructions
|
|
volume_step=5
|
|
mic_volume_step=5
|
|
brightness_step=5
|
|
kbd_brightness_step=5
|
|
max_volume=100
|
|
max_mic_volume=100
|
|
volume_notification_timeout=1000
|
|
mic_volume_notification_timeout=1000
|
|
brightness_notification_timeout=1000
|
|
kbd_brightness_notification_timeout=1000
|
|
player_notification_timeout=5000
|
|
download_album_art=true
|
|
show_album_art=true
|
|
show_music_in_volume_indicator=true
|
|
|
|
# Uses regex to get volume from pactl
|
|
function get_volume {
|
|
pactl get-sink-volume @DEFAULT_SINK@ | grep -Po '[0-9]{1,3}(?=%)' | head -1
|
|
}
|
|
|
|
function get_mic_volume {
|
|
pactl get-source-volume @DEFAULT_SOURCE@ | grep -Po '[0-9]{1,3}(?=%)' | head -1
|
|
}
|
|
|
|
# Uses regex to get mute status from pactl
|
|
function get_mute {
|
|
pactl get-sink-mute @DEFAULT_SINK@ | grep -Po '(?<=Mute: )(yes|no)'
|
|
}
|
|
|
|
function get_mic_mute {
|
|
pactl get-source-mute @DEFAULT_SOURCE@ | grep -Po '(?<=Mute: )(yes|no)'
|
|
}
|
|
|
|
# Uses regex to get brightness from xbacklight
|
|
function get_brightness {
|
|
brightnessctl -c backlight -P get | grep -Po '[0-9]{1,3}' | head -n 1
|
|
}
|
|
|
|
function get_kbd_brightness {
|
|
brightnessctl -d kbd_backlight -P get | grep -Po '[0-9]{1,3}' | head -n 1
|
|
}
|
|
|
|
# Returns a mute icon, a volume-low icon, or a volume-high icon, depending on the volume
|
|
function get_volume_icon {
|
|
volume=$(get_volume)
|
|
mute=$(get_mute)
|
|
if [ "$mute" == "yes" ]; then
|
|
volume_icon="volume-level-muted"
|
|
elif [ "$volume" -eq 0 ]; then
|
|
volume_icon="volume-level-low"
|
|
elif [ "$volume" -lt 50 ]; then
|
|
volume_icon="volume-level-medium"
|
|
else
|
|
volume_icon="volume-level-high"
|
|
fi
|
|
}
|
|
|
|
function get_mic_volume_icon {
|
|
mic_volume=$(get_mic_volume)
|
|
mic_mute=$(get_mic_mute)
|
|
if [ "$mic_mute" == "yes" ]; then
|
|
mic_volume_icon="mic-volume-muted"
|
|
elif [ "$mic_volume" -eq 0 ]; then
|
|
mic_volume_icon="mic-volume-low"
|
|
elif [ "$mic_volume" -lt 50 ]; then
|
|
mic_volume_icon="mic-volume-medium"
|
|
else
|
|
mic_volume_icon="mic-volume-high"
|
|
fi
|
|
}
|
|
|
|
# Always returns the same icon - I couldn't get the brightness-low icon to work with fontawesome
|
|
function get_brightness_icon {
|
|
brightness=$(get_brightness)
|
|
if [ "$brightness" -eq 0 ]; then
|
|
brightness_icon="gpm-brightness-lcd-disabled"
|
|
else
|
|
brightness_icon="gpm-brightness-lcd"
|
|
fi
|
|
}
|
|
|
|
function get_kbd_brightness_icon {
|
|
kbd_brightness=$(get_kbd_brightness)
|
|
if [ "$kbd_brightness" -eq 0 ]; then
|
|
kbd_brightness_icon="gpm-brightness-kbd-disabled"
|
|
else
|
|
kbd_brightness_icon="gpm-brightness-kbd"
|
|
fi
|
|
}
|
|
|
|
function get_album_art {
|
|
url=$(playerctl -f "{{mpris:artUrl}}" metadata)
|
|
if [[ $url == "file://"* ]]; then
|
|
album_art="${url/file:\/\//}"
|
|
elif [[ $url == "http://"* ]] && [[ $download_album_art == "true" ]]; then
|
|
# Identify filename from URL
|
|
filename="$(echo $url | sed "s/.*\///")"
|
|
|
|
# Download file to /tmp if it doesn't exist
|
|
if [ ! -f "/tmp/$filename" ]; then
|
|
wget -O "/tmp/$filename" "$url"
|
|
fi
|
|
|
|
album_art="/tmp/$filename"
|
|
elif [[ $url == "https://"* ]] && [[ $download_album_art == "true" ]]; then
|
|
# Identify filename from URL
|
|
filename="$(echo $url | sed "s/.*\///")"
|
|
|
|
# Download file to /tmp if it doesn't exist
|
|
if [ ! -f "/tmp/$filename" ]; then
|
|
wget -O "/tmp/$filename" "$url"
|
|
fi
|
|
|
|
album_art="/tmp/$filename"
|
|
else
|
|
album_art=""
|
|
fi
|
|
}
|
|
|
|
# Displays a volume notification
|
|
function show_volume_notif {
|
|
volume=$(get_mute)
|
|
get_volume_icon
|
|
|
|
notify-send -a "volume-brightness" -t $volume_notification_timeout -h string:x-dunst-stack-tag:volume_notif -h int:value:$volume -i "$volume_icon" "Volume"
|
|
}
|
|
|
|
function show_mic_volume_notif {
|
|
mic_volume=$(get_mic_mute)
|
|
get_mic_volume_icon
|
|
|
|
notify-send -a "volume-brightness" -t $mic_volume_notification_timeout -h string:x-dunst-stack-tag:volume_notif -h int:value:$mic_volume -i "$mic_volume_icon" "Microphone volume"
|
|
}
|
|
|
|
# Displays a music notification
|
|
function show_music_notif {
|
|
song_title=$(playerctl -f "{{title}}" metadata)
|
|
song_artist=$(playerctl -f "{{artist}}" metadata)
|
|
song_album=$(playerctl -f "{{album}}" metadata)
|
|
|
|
if [[ $show_album_art == "true" ]]; then
|
|
get_album_art
|
|
fi
|
|
|
|
notify-send -a "volume-brightness" -t $player_notification_timeout -h string:x-dunst-stack-tag:music_notif -i "$album_art" "$song_title" "$song_artist - $song_album"
|
|
}
|
|
|
|
# Displays a brightness notification using dunstify
|
|
function show_brightness_notif {
|
|
brightness=$(get_brightness)
|
|
echo $brightness
|
|
get_brightness_icon
|
|
notify-send -a "volume-brightness" -t $brightness_notification_timeout -h string:x-dunst-stack-tag:brightness_notif -h int:value:$brightness -i "$brightness_icon" "Brightness"
|
|
}
|
|
|
|
function show_kbd_brightness_notif {
|
|
kbd_brightness=$(get_kbd_brightness)
|
|
echo $kbd_brightness
|
|
get_kbd_brightness_icon
|
|
notify-send -a "volume-brightness" -t $kbd_brightness_notification_timeout -h string:x-dunst-stack-tag:brightness_notif -h int:value:$kbd_brightness -i "$kbd_brightness_icon" "Keyboard brightness"
|
|
}
|
|
|
|
# Main function - Takes user input, "volume_up", "volume_down", "brightness_up", or "brightness_down"
|
|
case $1 in
|
|
volume_up)
|
|
# Unmutes and increases volume, then displays the notification
|
|
pactl set-sink-mute @DEFAULT_SINK@ 0
|
|
volume=$(get_volume)
|
|
if [ $(( "$volume" + "$volume_step" )) -gt $max_volume ]; then
|
|
pactl set-sink-volume @DEFAULT_SINK@ $max_volume%
|
|
else
|
|
pactl set-sink-volume @DEFAULT_SINK@ +$volume_step%
|
|
fi
|
|
show_volume_notif
|
|
;;
|
|
|
|
volume_down)
|
|
# Raises volume and displays the notification
|
|
pactl set-sink-volume @DEFAULT_SINK@ -$volume_step%
|
|
show_volume_notif
|
|
;;
|
|
|
|
volume_mute)
|
|
# Toggles mute and displays the notification
|
|
pactl set-sink-mute @DEFAULT_SINK@ toggle
|
|
show_volume_notif
|
|
;;
|
|
|
|
mic_volume_up)
|
|
# Unmutes and increases volume, then displays the notification
|
|
pactl set-source-mute @DEFAULT_SOURCE@ 0
|
|
mic_volume=$(get_mic_volume)
|
|
if [ $(( "$mic_volume" + "$mic_volume_step" )) -gt $max_mic_volume ]; then
|
|
pactl set-source-volume @DEFAULT_SOURCE@ $max_mic_volume%
|
|
else
|
|
pactl set-source-volume @DEFAULT_SOURCE@ +$mic_volume_step%
|
|
fi
|
|
show_mic_volume_notif
|
|
;;
|
|
|
|
mic_volume_down)
|
|
# Raises volume and displays the notification
|
|
pactl set-source-volume @DEFAULT_SOURCE@ -$mic_volume_step%
|
|
show_mic_volume_notif
|
|
;;
|
|
|
|
mic_volume_mute)
|
|
# Toggles mute and displays the notification
|
|
pactl set-source-mute @DEFAULT_SOURCE@ toggle
|
|
show_mic_volume_notif
|
|
;;
|
|
|
|
brightness_up)
|
|
# Increases brightness and displays the notification
|
|
brightnessctl -c backlight set $brightness_step%+
|
|
show_brightness_notif
|
|
;;
|
|
|
|
brightness_down)
|
|
# Decreases brightness and displays the notification
|
|
brightnessctl -c backlight set $brightness_step%-
|
|
show_brightness_notif
|
|
;;
|
|
|
|
kbd_brightness_up)
|
|
# Increases brightness and displays the notification
|
|
brightnessctl -d kbd_backlight set $kbd_brightness_step%+
|
|
show_kbd_brightness_notif
|
|
;;
|
|
|
|
kbd_brightness_down)
|
|
# Decreases brightness and displays the notification
|
|
brightnessctl -d kbd_backlight set $kbd_brightness_step%-
|
|
show_kbd_brightness_notif
|
|
;;
|
|
|
|
next_track)
|
|
# Skips to the next song and displays the notification
|
|
playerctl next
|
|
sleep 0.5 && show_music_notif
|
|
;;
|
|
|
|
prev_track)
|
|
# Skips to the previous song and displays the notification
|
|
playerctl previous
|
|
sleep 0.5 && show_music_notif
|
|
;;
|
|
|
|
play_pause)
|
|
playerctl play-pause
|
|
show_music_notif
|
|
# Pauses/resumes playback and displays the notification
|
|
;;
|
|
esac
|
|
|