#!/bin/bash

if [ $# -lt 1 ]; then
	echo "IM Media Player (ver. 0.1.5). Created for Interplaymedium™ project (https://interplaymedium.org)"
	echo "Copyright © 2013 Dmitry Shalnov [interplaymedium.org]"
 	echo "Licensed under the Apache License, Version 2.0"

	echo "Usage: $0 -i <media url or file> [-m <video mode>] [-s <shift in min>] [-v <volume amp in dB>] [-c <crop vertically in px>] [-r <aspect mode>] [-d <deinterlace mode>]"
	echo "Dependences: omxplayer, youtube-dl, ttf-freefont, [bc]"
	exit 1
fi

# ------------------ settings ----------------------------------------------

# set screen resolution

# media box
#WIDTH=1024
#HEIGHT=580 # 620
#VERTICAL_COEFF="1.3"	# my screen

# IMAX edition TODO: stratching the image, need to be improved
# HEIGHT=720

# babooshka.tv

WIDTH=720
HEIGHT=576
VERTICAL_COEFF="1.12"	# babooshka SONY TV

# other default settings 

SHIFTTIME=0
VOLUME=0
AUDIOTRACK=2
SUBTITLES_SET=''
DEINTERLACE_SET=''
WINMODE_SET=''
timeTotal=0

# ------------ set environment ------------------------------------------------

# if [ "$VIDEOMODE" != "0" ]; then
#	./lght.sh 3
#	./prjctr.sh 1
# fi

# ------------ parse commandline ----------------------------------------------

while [ "$#" -gt 0 ]; do
	case "$1" in
		-i) MEDIAFILE="$2"; shift 2;;	# media file
		-m) VIDEOMODE="$2"; shift 2;;	# video mode
		-s) SHIFTTIME="$2"; shift 2;;	# shift in minutes
		-v) VOLUME="$2"; shift 2;;	# volume amp
		-a) AUDIOTRACK="$2"; shift 2;;	# number fo track
		-t) SUBTITLES="$2"; shift 2;;	# number fo track
		-c) CROP="$2"; shift 2;;	# pixels froms all sides
		-r) ASPECTMODE="$2"; shift 2;;	# aspect mode	(stretch, letterbox...)
		-d) DEINTERLACE="$2"; shift 2;;	# deinterlace

		-*) echo "unknown option: $1" >&2; exit 1;;
#		*) handle_argument "$1"; shift 1;;
	esac
done

# VIDEOMODE="720x576"

VOLUME=$(( $VOLUME * 100 ))

echo Audiotrack: $AUDIOTRACK

# ------------ preliminary calculation ---------------------------------------

# set aspect move 

if [ "$ASPECTMODE" != "" ]; then ASPECTMODE_SET=$ASPECTMODE; else ASPECTMODE_SET="stretch"; fi

# set deinterlace move 

if [ "$DEINTERLACE" != "" ]; then DEINTERLACE_SET="-d --advanced $DEINTERLACE"; fi

# set subtitles

if [ "$SUBTITLES" != "" ]; then 
	SUBTITLES_SET="-t $SUBTITLES"
	echo Subtitles: $SUBTITLES
fi

SHIFT=$(($SHIFTTIME*60))

echo "Time shift: $SHIFT"

startTime=$(date +%s)
#interruptTime=$(($bt+$SHIFT))
interruptTime=$(($bt))

# ---------- helpful functions ----------------------------------------------

round() {
	echo $1 | awk '{split($0,a,"."); print a[1]}'
}

calc() {
	# echo "$1" | bc -l
	EXPR=$(echo "$1" | sed 's/ //g')
	awk 'BEGIN { print ('$EXPR') }'
}

getMode () {

#	--- zona test workaround ---
#	width=720
#	height=360

	if [ "$VIDEOMODE" != "" ]; then
		width=$( echo $VIDEOMODE | awk '{split($0,a,"x"); print a[1]}')
		height=$( echo $VIDEOMODE | awk '{split($0,a,"x"); print a[2]}')
	else 
		width=$1
		height=$2
	fi

#	zoomCoeff=1
#	VERTICAL_COEFF="1.3"	# my screen

	vShift=0
	hShift=0

	height=$( calc "$VERTICAL_COEFF * $height" )
	
	comp=$( calc " $width/$height > $WIDTH/$HEIGHT" )

	if [ "$comp" == "1" ]; then
#		echo "calculate by width" >&2

		zoomCoeff=$( calc "$WIDTH / $width" )
		height=$( calc "$zoomCoeff * $height" )
#		width=1024
		width=$WIDTH

		vShift=$( calc "($HEIGHT - $height) / 2")
		height=$( calc "$height + $hShift")
	else 
#		echo "calculate by height" >&2

		zoomCoeff=$( calc "$HEIGHT / $height" )
		width=$( calc "$zoomCoeff * $width" )
#		height=620
		height=$HEIGHT

		hShift=$( calc "($WIDTH - $width) / 2")
		width=$( calc "$width + $hShift")

	fi 

	vShift=$( round $vShift )
	hShift=$( round $hShift )

	height=$( round $height )
	width=$( round $width )

#	echo "$hShift, $vShift, $width, $height" >&2

	echo "--win $hShift,$vShift,$width,$height"
}

getTotalDuration(){
		totalDuration=$( echo "$metaData" | grep 'Duration:' | head -1 | awk '{gsub(/\([^\)]*\)/, "");$1=$1}1' | awk '{split($0,a,","); print a[1]}' | awk '{split($0,a," "); print a[2]}' )
		totalDurationInSec=$(echo "$totalDuration" | awk -F. '{print $1}' | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')

#		echo "metaData :: \"$metaData\"" >&2
#		echo "$metaData" | grep 'Duration:' | head -1 >&2
		echo $totalDurationInSec
}

getModeByMedia(){

		metaData=$1

		res=$( echo "$metaData" | grep 'Video:' | head -1 | awk '{gsub(/\([^\)]*\)/, "");$1=$1}1' | awk '{split($0,a,","); print a[3]}' | awk '{split($0,a," "); print a[1]}' )

		width=$( echo $res | awk '{split($0,a,"x"); print a[1]}' | tr -d -c 0-9 )
		height=$( echo $res | awk '{split($0,a,"x"); print a[2]}' | tr -d -c 0-9 )

#		echo ">>> $res, $width, $height" >&2

		if [[ $CROP != "" ]]; then

			cX=$(( 0 ))
			cY=$(( $CROP ))
			cX2=$(( $width ))
			cY2=$(( $height - $CROP ))
	
			cropMode=$(echo "--crop" $cX,$cY,$cX2,$cY2)

			width=$(( $width + $CROP * 4 ))

		fi 

		WINMODE_SET=$( getMode $width $height )

		echo "$cropMode" "$WINMODE_SET"
}

# ---------------------- playback ----------------------------------------------

	
	if [[ $MEDIAFILE == *"youtu.be"* ]]; then

		# -------------- extracting youtube URL ------

		echo "Extracting: $MEDIAFILE"
		MEDIAFILE=$(wget -qO- "$MEDIAFILE" | grep "canonical" | awk '{string = index($0, "canonical"); print substr($0, string + 17, index($0, "alternate") - string - 13 - 17) }')
		title=$(wget -qO- "$MEDIAFILE" | grep "canonical" | awk '{string = index($0, "<title>"); print substr($0, string + 7, index($0, "</title>") - string - 8 - 9) }')	
		echo "url:	$MEDIAFILE"
		echo "title:	$title"
	fi

	if [[ $MEDIAFILE == *"vimeo"* ]]; then

		# -------------- playing vimeo -------------

		echo "Media file (vimeo): $MEDIAFILE"

		vimeoID=$(echo "$MEDIAFILE" | awk -F '/' '{print $4}')

		vimeoData=$( curl -k "https://player.vimeo.com/video/$vimeoID" )

		# get video resolution and URL

		widthHeight=$( echo $vimeoData | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | grep "\"width\"\|\"height\"" )

		width=$( echo $widthHeight | awk -F ' ' '{print $1}' | awk -F ':' '{print $2}' )
		height=$( echo $widthHeight | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}' )

		if [ "$VIDEOMODE" != "0" ]; then
			WINMODE_SET=$( getMode $width $height )
		fi
			
		echo "URL: $myUrl"
		echo "Video: $WINMODE_SET, $ASPECTMODE_SET, $timeTotal"

	   	myUrl=$( echo $vimeoData | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | grep ".mp4" | grep "url" | awk -F '"' '{print $4}' | tail -1)

		# play file

		curl -k "$myUrl" | omxplayer pipe:0 $DEINTERLACE_SET --no-keys -b -o local --amp 0 --vol $VOLUME $WINMODE_SET --aspect-mode $ASPECTMODE_SET

	elif [[ $MEDIAFILE == *"youtube"* ]]; then

		# -------------- playing youtube -------------

		echo "Media file (youtube): $MEDIAFILE"
		
		if [ "$VIDEOMODE" != "0" ]; then
			myUrl=$(youtube-dl -f 'bestvideo[vcodec=avc1][height<=720]+bestaudio/best[abr<=120]' -g "$MEDIAFILE") # best video + audio
			metaData=$( omxplayer -i "$myUrl" 2>&1 )
			WINMODE_SET=$( getModeByMedia "$metaData" );
		else 
			myUrl=$(youtube-dl -f 'bestaudio/best[abr<=120]' -g "$MEDIAFILE") # best audio only
			WINMODE_SET=''
		fi 

		timeTotal=$(getTotalDuration "$metaData")

		echo "URL: $myUrl"
		echo "Video: $WINMODE_SET, $ASPECTMODE_SET, $timeTotal"

		# play file

		omxplayer -l 0:0:0 -b $DEINTERLACE_SET --amp 0 --vol $VOLUME -n $AUDIOTRACK -o local "$myUrl" $WINMODE_SET --aspect-mode $ASPECTMODE_SET --align center $SUBTITLES_SET

	elif [[ $MEDIAFILE == *"http"* ]]; then

		# -------------- playing remote file via http(s) ---------------

		echo "Media file (URL): $MEDIAFILE"

		# get video resolution

		metaData=$( omxplayer -i "$MEDIAFILE" 2>&1 )
		timeTotal=$(getTotalDuration "$metaData")

		if [ "$VIDEOMODE" != "0" ]; then
			WINMODE_SET=$( getModeByMedia "$metaData" )
		fi 

		echo "WINMODE_SET (http): $WINMODE_SET"

		if [[ $MEDIAFILE != *"24video"* ]] || [[ $MEDIAFILE != *"vibio"* ]]; then
			MEDIAFILE="${MEDIAFILE/http:/https:}"
		fi

		echo "Video: $WINMODE_SET, $ASPECTMODE_SET, $timeTotal"
	
		# play file (loop is broken stream workaround)

		for iter in {1..6}; do 
			SKIPSEC=$(( ($interruptTime - $startTime + $SHIFT) * 128000 ))	# ~128kbs ? TODO: get datarate from file
			curl -k "$MEDIAFILE" | tail -c +$SKIPSEC | omxplayer pipe:0 $DEINTERLACE_SET -b --no-keys -o local $WINMODE_SET --amp 0 --vol $VOLUME $WINMODE_SET --aspect-mode $ASPECTMODE_SET
			interruptTime=$(date +%s)
		done	

	else 	

		# -------------- playing local file ---------------

		echo "Media file (local): $MEDIAFILE"

		metaData=$( omxplayer -i "$MEDIAFILE" 2>&1 )
		timeTotal=$(getTotalDuration "$metaData")

		if [ "$VIDEOMODE" != "0" ]; then
			WINMODE_SET=$( getModeByMedia "$metaData" )
		fi 

		echo "Video: $WINMODE_SET, $ASPECTMODE_SET, $timeTotal"

		# play file

		omxplayer $DEINTERLACE_SET -l $SHIFT -b --amp 0 --vol $VOLUME -n $AUDIOTRACK -o local "$MEDIAFILE" $WINMODE_SET --aspect-mode $ASPECTMODE_SET --align center $SUBTITLES_SET
	
	fi 


# -------------- environment  ----------------------------------------------

# turn off projector if playback time > 60 min

endTime=$(date +%s)
timeDif=$(( $endTime - $startTime ))
echo "Playback duration: $timeDif/$timeTotal"

# if [ "$timeDif" -gt "3600" ]; then
#	./prjctr.sh 0
# fi

