| 1 | #! /usr/bin/zsh -e |
| 2 | |
| 3 | bail () { echo >&2 "$*"; exit 2; } |
| 4 | |
| 5 | disorder=(disorder) |
| 6 | |
| 7 | get-disorder-state () { |
| 8 | coproc stdbuf -oL $disorder log; kid=$! |
| 9 | |
| 10 | while read -Ap i; do |
| 11 | case $i[2] in |
| 12 | state) |
| 13 | case $i[3] in |
| 14 | enable_random) randp=t ;; |
| 15 | disable_random) randp=nil ;; |
| 16 | enable_play) playp=t ;; |
| 17 | disable_play) playp=nil ;; |
| 18 | resume) pausep=nil ;; |
| 19 | pause) pausep=t ;; |
| 20 | esac |
| 21 | ;; |
| 22 | *) |
| 23 | break |
| 24 | ;; |
| 25 | esac |
| 26 | done |
| 27 | kill $kid |
| 28 | } |
| 29 | |
| 30 | alsa_mixer=Master,0 |
| 31 | op-volume-up () { amixer sset $alsa_mixer 5%+ >/dev/null; } |
| 32 | op-volume-down () { amixer sset $alsa_mixer 5%- >/dev/null; } |
| 33 | |
| 34 | op-now-playing () { |
| 35 | coproc $disorder playing; kid=$! |
| 36 | read -p k track |
| 37 | case $k in |
| 38 | nothing) echo "Not playing."; return ;; |
| 39 | track) ;; |
| 40 | *) bail "unexpected first-line token \`$k'" ;; |
| 41 | esac |
| 42 | read -p k _ |
| 43 | case $k in id) ;; *) bail "unexpected second-line token \`$k'" ;; esac |
| 44 | read -p k _ |
| 45 | case $k in played) ;; *) bail "unexpected third-line token \`$k'" ;; esac |
| 46 | read -pA t |
| 47 | case $t[-1] in started | ok) st="" ;; paused) st=" (paused)" ;; esac |
| 48 | kill $kid |
| 49 | |
| 50 | artist=$(disorder part $track display artist) |
| 51 | album=$(disorder part $track display album) |
| 52 | title=$(disorder part $track display title) |
| 53 | case $artist in [A-Z]) artist=$album album= ;; esac |
| 54 | echo "$artist: ‘$title’${album+, from ‘$album’}" |
| 55 | } |
| 56 | |
| 57 | op-scratch () { disorder scratch; } |
| 58 | op-enable/disable () { |
| 59 | get-disorder-state |
| 60 | case $playp in |
| 61 | t) disorder disable ;; |
| 62 | nil) disorder enable ;; |
| 63 | esac |
| 64 | } |
| 65 | op-play/pause () { |
| 66 | get-disorder-state |
| 67 | case $playp,$pausep in |
| 68 | nil,t) disorder enable; disorder resume ;; |
| 69 | nil,nil) disorder enable ;; |
| 70 | t,t) disorder resume ;; |
| 71 | t,nil) disorder pause ;; |
| 72 | esac |
| 73 | } |
| 74 | |
| 75 | if [[ -e $HOME/etc/media-keys.local ]]; then |
| 76 | . $HOME/etc/media-keys.local |
| 77 | fi |
| 78 | |
| 79 | case $# in 0) echo >&2 "usage: $0 OP"; exit 2 ;; esac |
| 80 | op=$1; shift |
| 81 | case $(whence -w op-$op) in |
| 82 | "op-$op: function") ;; |
| 83 | *) echo >&2 "$0: unknown operation \`$op'"; exit 2 ;; |
| 84 | esac |
| 85 | op-$op "$@" |