diff options
| author | Peter Olson <polson136@gmail.com> | 2013-08-07 15:32:00 -0500 | 
|---|---|---|
| committer | Lars-Dominik Braun <lars@6xq.net> | 2013-08-12 15:21:31 +0200 | 
| commit | b8e389973b037417a2b61cdf3793062f9e377bc5 (patch) | |
| tree | 879b0781dfa811f5a247e439c1dc49aa4d39d535 | |
| parent | c3306855d4b7dea40446850ef76f5474f769a790 (diff) | |
| download | pianobar-windows-b8e389973b037417a2b61cdf3793062f9e377bc5.tar.gz pianobar-windows-b8e389973b037417a2b61cdf3793062f9e377bc5.tar.bz2 pianobar-windows-b8e389973b037417a2b61cdf3793062f9e377bc5.zip | |
headless_pianobar: Support command-line arguments
See issue #383.
| -rwxr-xr-x | contrib/headless_pianobar | 218 | 
1 files changed, 148 insertions, 70 deletions
| diff --git a/contrib/headless_pianobar b/contrib/headless_pianobar index 20f8a54..d520200 100755 --- a/contrib/headless_pianobar +++ b/contrib/headless_pianobar @@ -56,49 +56,66 @@  # techniques and currently requires bash. -# This script regularly checks whether or not pianobar is running in the -# background in order to detect when it closes.  This variable sets how long of -# a delay there will be between checks (in seconds). +# Set default config options, as defined in the pianobar man page. Only set for variables actually used. +# They can all be overridden by the main pianobar config file. +# headless_pianobar options: +# check_period: sets how frequently the script checks if pianobar is running +# output_lines: sets how many lines of pianobar output to print when reconnecting  CHECK_PERIOD=${CHECK_PERIOD:-"1"} - -# This variable will set how many lines of pianobar's output to print when -# re-connecting to pianobar.  OUTPUT_LINES=${OUTPUT_LINES:-"30"} +ACT_SONGPLAY=P +ACT_SONGPAUSETOGGLE=p +ACT_SONGPAUSETOGGLE2=' ' # space +XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +FIFO=$XDG_CONFIG_HOME/pianobar/ctl +OUT=$XDG_CONFIG_HOME/pianobar/out +CONFIG=$XDG_CONFIG_HOME/pianobar/config -# Ensure the ctrl fifo exists. -if [ ! -p $HOME/.config/pianobar/ctl ] -then -	echo "pianobar ctl fifo not present at $HOME/.config/pianobar/ctl" -	echo -n "Create? (y/N) " -	read YN -	if [ "$YN" = "y" ] || [ "$YN" = "yes" ] || [ "$YN" = "Y" ] || [ "$YN" = "YES" ] -	then -		mkdir -p $HOME/.config/pianobar/ -		mkfifo  $HOME/.config/pianobar/ctl -		if [ ! -p $HOME/.config/pianobar/ctl ] -		then -			echo "Failed to create fifo, aborting" -			exit 1 -		fi -	else -		exit 1 -	fi -fi + +# Load the pianobar config file as bash variables +# also strip password info for security reasons +# ex: act_upcoming becomes ACT_UPCOMING +# ex: user becomes PIANOBAR_USER (in order to avoid conflicts with the user environment variable) +load_config(){ +        if [[ -r $CONFIG ]] +        then +                source <(sed -n \ +                        -e 's/password.*//' \ +                        -e 's/user/pianobar_user/' \ +                        -e 's/\([0-9A-Za-z_]*\) = \(.*\)/\U\1\E="\2"/p' < $CONFIG) +        else +                echo "Couldn't load config file $CONFIG, using defaults" +                false +        fi +} + +is_running(){ +        ps -u $(id -u) -o comm | grep -q "^pianobar$" +}  # Launch pianobar if it is not already running. -if ! ps -u $(id -u) -o comm | grep -q "^pianobar$" -then -	echo "pianobar not running, launching pianobar" -	nohup pianobar &>$HOME/.config/pianobar/out &disown -	sleep 1 -fi +launch(){ +        if ! is_running +        then +                ensure_fifo true +                echo "Pianobar not running, launching Pianobar" +                nohup pianobar &>$OUT &disown +                sleep 1 +        else +                ensure_fifo +        fi +} -# Sanity check: ensure pianobar's output can be read. -if [ ! -f $HOME/.config/pianobar/out ] -then -	echo "pianobar does not seem to be outputting to $HOME/.config/pianobar/out, try killing it and starting $0 again" -	exit 2 -fi +# Check on a regular basis that pianobar is still running. +# If pianobar stops running, stop this script as well. +running(){ +        while is_running +        do +        	sleep $CHECK_PERIOD +        done +        echo "Pianobar died, quitting" +        quit +}  # Function to cleanly quit.  Ensures that the two backgrounded processes (the  # output, tail, and the check, running()) both exit along with the parent (this @@ -120,44 +137,105 @@ quit(){  	exit 0  } -# Check on a regular basis that pianobar is still running. -# If pianobar stops running, stop this script as well. -running(){ -	while ps -u $(id -u) -o comm | grep -q "^pianobar$" -	do -		sleep $CHECK_PERIOD -	done -	echo "pianobar died, quitting" -	quit -} - -# Ensure quit() is called to clean up when exiting -trap quit HUP INT TERM -  # Print pianobar's output. -tail -n$OUTPUT_LINES -f $HOME/.config/pianobar/out & -TAILPID=$! +output(){ +        # Sanity check: ensure pianobar's output can be read. +        if [ ! -f $OUT ] +        then +                echo "pianobar does not seem to be outputting to $OUT, try killing it and starting $0 again" +                exit 2 +        fi -# Run running() in the background to detect when pianobar closes. -running & -RUNNINGPID=$! +        tail -n$OUTPUT_LINES -f $OUT & +        TAILPID=$! +}  # Get input from user, character by character, and feed it to pianobar's ctl  # fifo.  Note that no newline character is given with `read`.  Rather, one  # simply gets an empty variable back.  Detect this situation and pass a newline  # along to pianobar.  Otherwise, send the character read from input to -# pianobar. -IFS="" -while /bin/true -do -	read -n1 -s INPUT -        if [[ $? == "1" || "$INPUT" == $'\004' ]] +# pianobar. If ^D or EOF is given, quit +input(){ +        IFS="" +        while /bin/true +        do +                read -n1 -s INPUT +                if [[ $? == "1" || "$INPUT" == $'\004' ]] +                then +                        quit +                elif [ "$INPUT" == "" ] +                then +                        send_input "\n" +                else +                        send_input "$INPUT" +                fi +        done +} + +# send the first argument to the control fifo +send_input(){ +        echo -ne "$1" > $FIFO +} + +# Ensure the ctrl fifo exists. Arg1: create if it doesn't exist +ensure_fifo(){ +        if [ ! -p $FIFO ]          then -                quit -	elif [ "$INPUT" == "" ] -	then -		echo "" > $HOME/.config/pianobar/ctl -	else -		echo -n $INPUT > $HOME/.config/pianobar/ctl -	fi -done +                if [[ $1 ]] +                then +                        echo "Pianobar ctl fifo not present at $FIFO, creating" +                        mkfifo $FIFO +                        if [ ! -p $FIFO ] +                        then +                                echo "Failed to create fifo, aborting" +                                exit 1 +                        fi +                else +                        echo "Pianobar ctl fifo not present at $FIFO, aborting" +                        exit 1 +                fi +        fi +} + +# Ensure quit() is called to clean up when exiting +trap quit HUP INT TERM + +mkdir -p $XDG_CONFIG_HOME/pianobar + +# load the main pianobar config file +# Don't use $XDG_CONFIG_HOME or $HOME after this because it may have changed if set in the config file. +load_config + +# if no arguments, launch pianobar if not running, then connect to the pianobar ui +if [[ $# == 0 ]] +then +        launch + +        # Run running() in the background to detect when pianobar closes. +        running & +        RUNNINGPID=$! + +        output + +        input +else +        if ! is_running +        then +# if there are arguments, and pianobar is not running, start pianobar if it makes sense to +                case $1 in +                        $ACT_SONGPLAY | $ACT_SONGPAUSETOGGLE | $ACT_SONGPAUSETOGGLE2) +                                launch +                                shift ;; +                        *) +                                echo "Pianobar not running, nothing executed" +                                exit 0 +                                ;; +                esac +        fi +# if there are arguments and pianobar is running, send arguments to pianobar, then exit +        ensure_fifo +        while [[ $# > 0 ]]; do +                send_input "$1" +                shift +        done +fi | 
