#!/bin/sh -a
# Config include string generation macro
Me=`realpath "$0"`
_CONFIG() { echo " -include $CONFDIR/$1"; }

die() {	# [msg [errcode]]
  echo ${1:-"ERROR"} >&2
  exit ${2:-1}
}

ConfParse() { # StationID
  # ID -> Stream
  # Name -> Site
  # Method -> URL
  # Options -> config
  cd "$CONFDIR"
  $WGET "$CONFURL"
  sed -n "/<th>.*>$1[^<]*<\/a>/,/<\/tr>/{
/<t[dh]>/s@.*<a href=.\(.*\).>\([^>]*\)</a>.*@\1$SED_N\2@p
}" "$CN_FILE" | while {
    read Stream
    read ID
    read Site
    read Name
    read URL
    read Method
    read Conf
    read Options
  } do
    echo "Name='$Name'"
    echo "ID='$ID'"
    echo "Site='$Site'"
    echo "Stream='$Stream'"
    echo "Method='$Method'"
    echo "URL='$URL'"
    echo "Conf='$Conf'"
    echo "Options='$Options'"
  done
}

Nop() {
  echo "$@"
  read _nop
}

# Select xterm geometry (NOW FOR CTWM ONLY)
SelectGeometry() { # x y w h type
  {
    test -n "$DISPLAY" || return
    case "$5" in
      ctwm) # Fr. Br. George's ctwm WorkSpaceManager
	T=$(xwininfo -name WorkSpaceManager ) || { echo "$1x$2$3$4"; return; }
	T="${T##*Width: }"; T="${T%%[^0-9]*}"
	T=$(($T+10)) || { echo "$1x$2$3$4"; return; }
	echo "$1x$2+$T$4" 
      ;;
      *) echo "$1x$2$3$4" ;;
    esac
  } # 2> /dev/null
}

test "$1" = "-" && shift || {
# Defaults
MPL=mplayer					# MPlayer binary name
VARGS="-really-quiet"				# Arguments for playing verbosity
ARGS="-vo null"					# Arguments for default player
IARGS="-quiet -vo null -ao null -nocache"	# Arguments for info picker
XTERM=`which xterm`				# XTerm binary name
XTA_UI="-T MPlayer +sb"				# XTerm lookout options
DGM="56 3 +2 -2"
XTA_Geometry="-g $(SelectGeometry $DGM ctwm)"	# XTerm geometry
XTA_Font="-fn xtermg-8x14"			# XTerm font
SLEEP=10					# Sleep between info picks
CONFDIR="$HOME/.netradio"			# Where to store data
CN_HOST="http://localhost"			# Config site
CN_PATH="~george/radio"				# Path to config file 
CN_FILE="netradio.config.shtml"			# Config file
WGET="wget -q -N"				# how to get config
# System dependent variables:
#	SED_N		sed's \n char
case `uname` in
  FreeBSD) SED_N='\
'
	;;
  Linux) SED_N='\n'
  	;;
  *) SED_N='n'
  	;;
esac

# TODO getopots
_GETOPTS="x:X:c:C:l:dDgvh"
Usage="$Me [-$_GETOPTS] [Radio-ID]"
while getopts "$_GETOPTS" opt
do
  case "$opt" in
    l) LOG="$OPTARG" ;;
    x) XTERM="$OPTARG" ;;
    X) XTARG="$OPTARG" ;;
    c) CONFURL="$OPTARG"; CN_FILE="${CONFURL##*/}" ;;
    C) CONFDIR="$OPTARG" ;;
    v) Verb=$(($Verb+1)); test $Verb = 1 && VARGS="-quiet" || VARGS=""; LOG="-" ;;
    m) MPL="$OPTARG" ;;
    D) DISPLAY="" ;;
    g) set -x ;;
    d) DMPL=Nop; VARGS="" ;;
    h) echo "Usage: $Usage"; exit 0;;
    *) echo "Usage: $Usage" >&2 ; exit 1;;
  esac
done
shift $(($OPTIND-1))

CONFDIR=$(realpath "$CONFDIR")
test -n "$XTARG" || XTARG="$XTA_UI $XTA_Geometry $XTA_Font"		# All XTerm options
test -n "$CONFURL" || CONFURL="$CN_HOST/$CN_PATH/$CN_FILE"		# Where to get config
test -n "$LOG" || LOG="/dev/null"
test -n "$DMPL" || DMPL="$MPL"

ID="$1"

# if no args display station table
test -z "$Verb" || echo "
Parsing config from $CONFURL"
test -z "$ID" || eval `ConfParse "$ID"`
test "0$Verb" -le "1" || ConfParse "$ID"
test -n "$Stream" || { 
  echo "	Stations configured:"; echo
  ConfParse | sed "s/='\(.*\)'/	\1/
  s/Name/	/
  ";
  test -z "$ID" || echo "ERROR: unknown station ID '$ID'"
  test -z "$ID"
  exit $?;
} >&2

# Launch XTerm if possible
test -n "$DISPLAY" -a "$#" -ne "0" -a "$1" != "-" &&
	{ $XTERM $XTARG -e "$Me" - "$@"& exit; }
}

# KILL info picker on exit
exit_handler() {
  local rc=$? F
  trap - EXIT
  test -z "$IPID" || kill $IPID
  exit $rc
}
trap exit_handler EXIT HUP INT QUIT PIPE TERM

_ICYInfo() { # URL
  echo | $MPL $IARGS "$1" 2>/dev/null | while read A; do
    case "$A" in
      ICY*Info:*) echo $A ; return;
    esac
  done | sed "s/ICY Info: //
s/;/$SED_N/g"
}

ICYInfo() { # URL
  _ICYInfo "$1" | sed "s/StreamTitle='\(.*\) - \(.*\)'/Group=\1; Song=\2;/
  s/'/./g
  s/=\([^;]*\);/='\1';/g
  "
}

ICYInfoM() { # URL
  _ICYInfo "$1" | sed "s/StreamTitle='\(.*\) (\([^:]*\): *\(.*\))'/Album=\3; Song=\1; Group=\2;/
  s/'/./g
  s/=\([^;]*\);/='\1';/g
  "
}

SpecialRadio() {        # Special Radio http://specialradio.ru
  wget -q --header='Accept-Charset: koi8-r' -O - "$1" | sed "
  s@.*grp=[^>]*>\([^<]*\)<[Aa]/*> -  *\([^<]*\).*@Group=\1; Song=\2;@
  s/'/./g
  s/=\([^;]*\);/='\1';/g
  "
}


InfoPicker() {
  local gs=""
  echo -n "HINT: 0 / 9 -- change volume
	$Name"
  while {
    test -z "$Method" || eval `$Method "$URL"`
    test "$Group$Song" = "$gs" || echo -n "
$Group / $Song"
    gs="$Group$Song"
  } do sleep $SLEEP; done
}


test -z "$Verb" || echo "
Launching $Method InfoPicker from $URL" >&2
InfoPicker & IPID="$!"

test -z "$Verb" || echo "
Starting $Conf MPlayer from $Stream" >&2
test "$LOG" = "-" && 
$DMPL $ARGS $VARGS $Options $(_CONFIG "$Conf") "$Stream" ||
$DMPL $ARGS $VARGS $Options $(_CONFIG "$Conf") "$Stream" > "$LOG" 2>&1
