#!/bin/bash
#
#
# Do NOT edit this file!!!
#
#
#
# *graj* v.0.84 by Krzysztof Zurek
#Autorem programu jest Krzysztof Żurek
#Use it at your own risk!
#This script is free for NON commercial use only!
#See: https://zurek.xyz
#####################################################################
VER="0.84"
ZER0=${ZER0:="$0"}
#####################################################################
#MAX_COL=`stty size | cut -d' ' -f2 2>/dev/null` || MAX_COL=72
###-------------------------------------
##-------------ZMIENNE GLOBALNE (DEFAULTS)---------------------
COUNT=0
COUNTR=0
#
CFG="graj.cfg"
if [ -r "${HOME}/.${CFG}" ]; then
. "${HOME}/.${CFG}" > /dev/null 2>&1
elif [ -r "/etc/${CFG}" ]; then
. "/etc/${CFG}" > /dev/null 2>&1
elif [ -r "/usr/local/bin/${CFG}" ]; then
. "/usr/local/bin/${CFG}" > /dev/null 2>&1
fi
[ -z $DEV ] && DEV="default"
[ -z $DRV ] && DEV="alsa"
[ -z $VBS ] && VBS=0
[ -z $REK ] && REK="off"
######################################################################
#REK_VAR zmienna ustawiana na 0 gdy wywolanie rekurencyjne play_dir()
REK_VAR=1
#--------FUNKCJE------------------------------------------------------
function HELP()
{
cat <<ENDofTEXT
*graj* ver.${VER} by Krzysztof Zurek,
See: https://zurek.xyz

 This program is free for non commercial use only
                   OR
   You've bought the license for it!

Usage:
 graj[ obj[ nums]| nums][ obj[ nums]| nums][ obj[ nums]| nums]...
 
where:
 'obj' is directory or playlist/audio file or variable fron ~/.graj.cfg config file,
 'nums' are sets of numbers corresponding to audio files from directory/playlist type of 'obj' eg.
  2, 3-8, 1 0-2, 3 3 0 1-0, etc. 
 
or with single option:
 -h to print this help
 -v to print version

Current variables are:
DRV=$DRV
DEV=$DEV
REK=$REK
VBS=$VBS
ENDofTEXT
}
#
GET_ARGS()
{
for PLIK in $*
do
 if [ "$PLIK" != "-n" ]
 then
  #LIST $PLIK
  echo $PLIK
 fi
done
}
#
function play_alsa()
{
sox -q "$1" -t wav - | aplay -D $DEV -
KP=$?; if [ $KP -eq  130 ]; then
exit 1; fi
}
#
function play_oss()
{
#sox -q "$1" -t $DRV $DEV
sox -q "$1" -t wav - | ossplay -d $DEV -
KP=$?; if [ $KP -eq  130 ]; then
exit 1; fi
}
#
function play_()
{
echo -n "[$COUNT] "
echo `basename "$1"`
#if [ "$DRV" == "alsa" ]; then
# play_alsa "$1"
#else
# play_oss "$1"
#fi
if [ $VBS -eq 0 ]; then
 sox -q "$1" -t $DRV $DEV > /dev/null 2>&1
elif [ $VBS -eq 1 ]; then
 sox "$1" -t $DRV $DEV > /dev/null
else
 sox "$1" -t $DRV $DEV
fi
#if [ $? != 0 ]; then
#echo " [FALSE]"
#else
# echo " [OK]"
#fi
}
#
function osh()
{
WY=1
[ "$(head -n 1 "$ZER0" 2> /dev/null | md5sum | tr -s ' ' | cut -d' ' -f1)" == "677da3bdd8fbd16d4b8917a9fe0f6f89" ] || WY=0
[ $WY -eq 1 ] && [ "$(head -n 15 "$ZER0" 2> /dev/null | md5sum | tr -s ' ' | cut -d' ' -f1)" == "de58a5c082691095fd6035375d397a0c" ] && WY=0
echo $WY
}
#
#
function play_dir()
{
LA=$1
RA=$2
#
if [ -f "$KAT" ]; then
 [ $REK_VAR -ne 0 ] && echo "$KAT" | grep -i '\.m3u$' >/dev/null && ZM=`cat "$KAT" | tr '\\' '/' 2> /dev/null | tr '\r' '\n' | tr -s '\n' | grep -v '^#' | grep -i '\.aiff$\|\.wav$\|\.mp3$\|\.flac$\|\.ogg$' | tr '\n' '$'`
 [ $REK_VAR -ne 0 ] && echo "$KAT" | grep -i '\.cue$' >/dev/null && ZM=`cat "$KAT" | tr '\\' '/' 2> /dev/null | tr '\r' '\n' | tr -s '\n' | grep -v '^#' | grep -w 'FILE' | cut -d'"' -f2 | grep -i '\.aiff$\|\.wav$\|\.mp3$\|\.flac$\|\.ogg$' | tr '\n' '$'`
#
 ZMT=''
 M=1
 until [ -z "$(echo "$ZM" | cut -d'$' -f$M)" ]
 do
   rekord=`echo "$ZM" | cut -d'$' -f$M`
   echo $rekord | grep -v '^/' > /dev/null && rekord=$(dirname "$KAT")/$rekord
   ZMT="${ZMT}${rekord}\$"
   M=$((M + 1))
 done 
 ZM=$ZMT
elif [ -d "$KAT" ]; then
 ZMP=`ls "$KAT" | grep -i '\.aiff$\|\.wav$\|\.mp3$\|\.flac$\|\.ogg$' | tr '\n' '$'`
 PREFIX=`echo "${KAT}/" | tr -s '/'`
 ZM=''
 M=1
 until [ -z "$(echo "$ZMP" | cut -d'$' -f$M)" ]
 do
  ZM="${ZM}${PREFIX}$(echo "$ZMP" | cut -d'$' -f$M)\$"
  M=$((M + 1))
 done
else
 M=1
# return 1
fi
#  echo "$ZM"
#echo $M
if [ $M -gt 1 ]; then
 M=1
 until [ -z "$(echo "$ZM" | cut -d'$' -f$M)" ]
 do
  M=$((M + 1))
 done
 [ $M -eq 1 ] || M=$((M - 1))
#
 [ $1 -eq 0 ] && LA=$M
 [ $2 -eq 0 ] && RA=$M
# echo $M $LA $RA
 COUNT=$LA
 until [ $COUNT -lt 1 -o $COUNT -gt $M ]
 do
  plik=`echo "$ZM" | cut -d'$' -f$COUNT`
#  echo "plik=" "$plik"
  [ $COUNT -gt $LA -a $COUNT -gt $RA ] || [ $COUNT -lt $RA -a $COUNT -lt $LA ] || play_ "$plik"
  #echo "plik=" "$plik"
  #echo $plik >> lista.m3u
  if [ $((LA)) -le $((RA)) ]; then
   COUNT=$((COUNT + 1))
  else
   COUNT=$((COUNT - 1))
  fi
 done
fi
#
ILL=$(ls -l "$KAT" | grep '^d' | wc -l)
ILL=${ILL:=0}
if [ -d "$KAT" -a "$REK" == "on" ] && [ $ILL -gt 0 ] && [ $1 -eq 1 -a $2 -eq 0 ]; then
 OLD_KAT="$KAT"
 REK_VAR=0 && DIR_LST=$(ls -F $KAT | grep / | tr -d /)
#REK_VAR zmienna ustawiana gdy wywolanie rekurencyjne
 NR=1
 until [ $NR -gt $ILL ]
 do
  DIR_ARG="$(echo "$DIR_LST" | head -n$NR | tail -n1)"
  KAT="${OLD_KAT}${DIR_ARG}/"
  KAT=`echo "${KAT}" | tr -s '/'`
# echo "$KAT"
  ( play_dir $1 $2 )
  NR=$((NR + 1))
 done
fi 
}
#
function is_num()
{
[ -z $1 ] && return 1
echo $1 | grep '^[[:digit:]]*$' > /dev/null && return 0
return 1
}
#
function play_num()
{
SINGLE=1
#num=$1
#echo $num
echo "$1" | grep '-' >/dev/null || SINGLE=0
if [ $SINGLE -eq 0 ]; then
 is_num $1 || return
 play_dir $1 $1
else
 NUM_TYPE=3
 echo "$1" | grep '^-' >/dev/null && NUM_TYPE=1
 echo "$1" | grep '\-$' >/dev/null && NUM_TYPE=2
# [ $NUM_TYPE -eq 0 ] && NUM_TYPE=3
################################################
#echo "NUM_TYPE=$NUM_TYPE"
 if [ $NUM_TYPE -eq 2 ]; then
  DL=${#1}
  DL=$((DL - 1))
  MAX=${1:0:$DL}
  is_num $MAX || return
  COUNTR=$MAX && play_dir $MAX 0
  # MAX=${1:1}
  #echo $MAX
 elif [ $NUM_TYPE -eq 1 ]; then
  #echo "od ko ca"
  DL=${#1}
  DL=$((DL - 1))
  MAX=${1:0:$DL}
  is_num $MAX || return
  COUNTR=$MAX && play_dir 0 $MAX
 else
  #echo "od N do M"
  MIN=`echo $1 | cut -d'-' -f1`; MAX=`echo $1 | cut -d'-' -f2`
  is_num $MAX || return
  is_num $MIN || return
  COUNTR=$MIN && play_dir $MIN $MAX
 fi
fi
}
#
function play_seq()
{
#echo ${*}
for NUM in ${*}
do
# echo $NUM
 play_num $NUM
done
#
ILL=$(ls -l "$KAT" | grep '^d' | wc -l)
if [ "$REK" == "on" ] && [ $ILL -gt 0 ]; then
 OLD_KAT="$KAT"
 REK_VAR=0 && DIR_LST=$(ls -F $KAT | grep / | tr -d /)
#REK_VAR zmienna ustawiana gdy wywolanie rekurencyjne
 NR=1
 until [ $NR -gt $ILL ]
 do
  DIR_ARG="$(echo "$DIR_LST" | head -n$NR | tail -n1)"
  KAT="${OLD_KAT}${DIR_ARG}/"
  KAT=`echo "${KAT}" | tr -s '/'`
# echo "$KAT"
  ( play_seq ${*} )
  NR=$((NR + 1))
 done
fi 
}
#
function INIT_VARS()
{
#echo "INIT_VARS():"
for ARG in ${*}
do
 echo $ARG | grep '=' >/dev/null && eval $ARG
done
}
#
function OBJ_TYP()
{
typ=-1
if [ -d "$1" ]; then
typ=1
elif [ -f "$1" ]; then
#typ=2
echo $1 | grep -i '\.cue$\|\.m3u$' >/dev/null && typ=0
echo $1 | grep -i '\.aiff$\|\.wav$\|\.mp3$\|\.flac$\|\.ogg$' >/dev/null && typ=2
else
#typ=3
echo $1 | grep '=' >/dev/null && typ=3
#[ $typ -eq 3 ] || typ=4
fi
echo $typ
#return $typ
}
#####################################################################################################
#--------------------POCZATEK---------------------------------------------------------------------------
if [ ${#} -eq 1 -a "$1" == "-h" ]
then
 HELP
 exit 0
fi
#------------------------------------
if [ ${#} -eq 1 -a "$1" == "-v" ]
then
 echo $VER
 exit 0
fi
#------------------------------------
OTYP=-1
T_DIR="$PWD"
KAT_W="./"
KAT=""
#i=0; k=0; f=0; v=0; n=0;
if [ ${#} -eq 0 ]
then
 KAT="./"
 play_dir 1 0
elif [ ${#} -gt 0 -a $(osh) -eq 0 ]
then
 i=0; k=0; f=0; v=0; n=0;
 for OBJ in "$@"
 do
#  echo $OBJ
  OTYP=$(OBJ_TYP "$OBJ")
#  echo $((OTYP))
  i=$((i + 1)); k=$((k + 1)); f=$((f + 1)); v=$((v + 1)); n=$((n + 1));
#  echo "i=$i k=$k f=$f v=$v n=$n"
  if [ $i -gt 1 ]; then
     if [ $((OTYP)) -ge 0 ] && [ $((OTYP)) -le 3 ]; then
       [ $n -eq 1 ] && play_seq "$SEQ"
       [ $k -eq 1 ] && play_dir 1 0
       [ $f -eq 1 ] && play_ "$FILE"
     fi  
  [ $v -eq 1 ] && INIT_VARS "$WAR"   
  fi
  
  [ $((OTYP)) -eq 0 ] && { k=0; KAT_W=$OBJ; }
  [ $((OTYP)) -eq 1 ] && { k=0; KAT_W=$OBJ; echo "$KAT_W" | grep '/$' >/dev/null || KAT_W=${KAT_W}/; }
  [ $((OTYP)) -eq 2 ] && { f=0; FILE_W=$OBJ; }
  [ $((OTYP)) -eq 3 ] && { v=0; WAR_W=$OBJ; }
  [ $f -eq 1 -o $v -eq 1 -o $k -eq 1 ] && [ $[k*f*v] -gt 0 ] && { SEQ=$OBJ; n=0; }
  [ $k -gt 1 -a $f -gt 1 -a $v -gt 1 ] && { SEQ="${SEQ} $OBJ"; n=0; }

  KAT=$KAT_W; FILE=$FILE_W; WAR=$WAR_W;
  #echo $FILE >> dif.m3u
  #echo "$KAT"
  #echo "i=$i k=$k f=$f v=$v n=$n"
  #REK_VAR zmienna ustawiana na 0 gdy wywolanie rekurencyjne play_dir()/play_seq() musi zostać zresetowana przed nastepnym obrotem petli
  REK_VAR=1
 done
 #echo
# echo $SEQ
# echo "i=$i k=$k f=$f v=$v n=$n"
 #[ $k -ne 0 -a $f -ne 0 -a $v -ne 0 ] && play_seq "$SEQ"
 [ $n -eq 0 ] && play_seq "$SEQ"
 [ $k -eq 0 ] && play_dir 1 0
 [ $f -eq 0 ] && play_ "$FILE"
# [ $v -eq 0 ] && INIT_VARS "$WAR"
# GET_ARGS $*
fi

#echo $COUNT
