#! /usr/bin/zsh -e bail () { echo >&2 "$*"; exit 2; } disorder=(disorder) get-disorder-state () { coproc stdbuf -oL $disorder log; kid=$! while read -Ap i; do case $i[2] in state) case $i[3] in enable_random) randp=t ;; disable_random) randp=nil ;; enable_play) playp=t ;; disable_play) playp=nil ;; resume) pausep=nil ;; pause) pausep=t ;; esac ;; *) break ;; esac done kill $kid } alsa_mixer=Master,0 op-volume-up () { amixer sset $alsa_mixer 5%+ >/dev/null; } op-volume-down () { amixer sset $alsa_mixer 5%- >/dev/null; } op-now-playing () { coproc $disorder playing; kid=$! read -p k track case $k in nothing) echo "Not playing."; return ;; track) ;; *) bail "unexpected first-line token \`$k'" ;; esac read -p k _ case $k in id) ;; *) bail "unexpected second-line token \`$k'" ;; esac read -p k _ case $k in picked) read -p k _ ;; esac case $k in played) ;; *) bail "unexpected third-line token \`$k'" ;; esac read -pA t case $t[-1] in started | ok) st="" ;; paused) st=" (paused)" ;; esac kill $kid artist=$(disorder part $track display artist) album=$(disorder part $track display album) title=$(disorder part $track display title) case $artist in [A-Z]) artist=$album album= ;; esac echo "$artist: ‘$title’${album+, from ‘$album’}" } op-scratch () { disorder scratch; } op-enable/disable () { get-disorder-state case $playp in t) disorder disable ;; nil) disorder enable ;; esac } op-play/pause () { get-disorder-state case $playp,$pausep in nil,t) disorder enable; disorder resume ;; nil,nil) disorder enable ;; t,t) disorder resume ;; t,nil) disorder pause ;; esac } if [[ -e $HOME/etc/media-keys.local ]]; then . $HOME/etc/media-keys.local fi case $# in 0) echo >&2 "usage: $0 OP"; exit 2 ;; esac op=$1; shift case $(whence -w op-$op) in "op-$op: function") ;; *) echo >&2 "$0: unknown operation \`$op'"; exit 2 ;; esac op-$op "$@"