mpvpop (2654B)
1 #!/bin/bash 2 3 shopt -s nullglob 4 5 readonly SOCKET='/tmp/mpvsocket' 6 7 help_msg() { 8 echo " 9 Usage: 10 ${PROGRAM} info 11 Show track info 12 ${PROGRAM} volume 13 Show current track volume or change it by passing value as argument (negative to lower) 14 ${PROGRAM} pause 15 Pause/unpause current track 16 ${PROGRAM} stop 17 Stop track/playlist 18 ${PROGRAM} next 19 Play next in playlist 20 ${PROGRAM} previous 21 Play previous in playlist 22 ${PROGRAM} help 23 Show this help menu 24 " 25 } 26 27 trim() { 28 echo $1 | sed -re 's/^[[:blank:]]+|[[:blank:]]+$//g' 29 } 30 31 mpv_property_data() { 32 printf '{ "command": ["get_property", "%s"] }\n' "$1" | socat - "${SOCKET}" | jq -r ".data" 2> /dev/null 33 } 34 35 mpv_metadata() { 36 local -r METADATA=($(mpv_property_data "metadata")) 37 local -r KEYS=$(echo -n "${METADATA[*]}" | jq -r "keys[]" 2> /dev/null) 38 39 if [[ "${KEYS[@]}" =~ 'icy-title' ]]; then 40 local -r RESULTDATA=$(echo "${METADATA[*]}" | jq -r '."icy-title"') 41 # split by divider 42 IFS=$'-' data=(${RESULTDATA}) 43 # print with newline splitter 44 printf "%s\n" "${data[@]}" 45 elif [[ "${KEYS[@]}" =~ 'title' ]]; then 46 echo "${METADATA[*]}" | jq -r '.artist,.title' 47 else 48 local -r FILENAME=$(mpv_property_data "filename") 49 # Remove extension 50 # print with newline splitter 51 printf "%s\n%s" "Track" "${FILENAME%.*}" 52 fi 53 } 54 55 mpv_filename() { 56 local -r FILENAME=$(mpv_property_data "filename") 57 # Remove extension 58 echo "${FILENAME%.*}" 59 } 60 61 track_info() { 62 local -r METADATA="$(mpv_metadata)" 63 64 # split by newline 65 IFS=$'\n' data=(${METADATA[*]}) 66 67 dunstify -h string:x-dunst-stack-tag:track-info $(trim "${data[0]}") $(trim "${data[1]}" ) 68 } 69 70 track_volume() { 71 test ! -z $1 && echo add volume $1 | socat - "${SOCKET}" 72 dunstify -h string:x-dunst-stack-tag:track-volume "Track Volume": $(mpv_property_data "volume") 73 } 74 75 track_pause() { 76 echo cycle pause | socat - "${SOCKET}" 77 dunstify -h string:x-dunst-stack-tag:track-pause "Track cycle pause" 78 } 79 80 track_stop() { 81 echo stop | socat - "${SOCKET}" 82 dunstify -h string:x-dunst-stack-tag:track-stop "Track stopped" 83 } 84 85 track_next() { 86 echo playlist-next | socat - "${SOCKET}" 87 sleep 0.5 88 track_info 89 } 90 91 track_prev() { 92 echo playlist-prev | socat - "${SOCKET}" 93 sleep 0.5 94 track_info 95 } 96 97 readonly PROGRAM="${0##*/}" 98 readonly COMMAND="$1" 99 100 case "$1" in 101 help|--help) shift; help_msg ;; 102 info|--info) shift; track_info ;; 103 volume|--volume) shift; track_volume "$@" ;; 104 pause|--pause) shift; track_pause ;; 105 stop|--stop) shift; track_stop ;; 106 next|--next) shift; track_next ;; 107 previous|--previous|prev|--prev) shift; track_prev ;; 108 *) notify-send "Unknown option" "Valid arg is required. --help for available options" ;; 109 esac 110 exit 0