#!/bin/bash

# Note for later: check comparison of aac encoders
#     aac, libfaac, libfdk_aac, libvo_aacenc
# https://trac.ffmpeg.org/wiki/AACEncodingGuide
# Best encoders: libfdk_aac > libfaac > Native FFmpeg AAC ≥ libvo_aacenc

PGM=`basename "$0"`
TMP=/tmp/$PGM.$$
TURBO=true
EXT=mp4
DEBUG=yes

[ -f $(dirname "$0")/casting-helpers ] && . $(dirname "$0")/casting-helpers || exit 1

#which avconv | grep -q avconv || alias avconv=avconv
#avconv -version >/dev/null 2>/dev/null || exit $?

list=$1
format=$2
[ ! $format ] && format=web

if [ ! $EXT ]
	then
	EXT=mov
fi

lastnumber=$(ls *.mov 2>/dev/null | sort -n | tail -1 | cut -d "." -f 1)
if [ $lastnumber ]
	then
	lastnumber=$(($lastnumber + 1))
else
	lastnumber=9999999
fi

index2list()
{
	local IFS=,
	for index in $@
	do
		echo $index | grep -qv "-" && echo $index && continue
		i=$(echo $index | cut -d- -f 1)
		[ ! "$i" ] && i=0
		j=$(echo $index | cut -d- -f 2)
		echo "$i" | grep -q "[^0-9,-]" && end 1 "var i $i is not a number"
		echo "$j" | grep -q "[^0-9,-]" && end 1 "var i $j is not a number"
		if [ "$i" -le "$j" ]
		then
			while [ $i -le $j ]
			do
				echo $i
				i=$(($i + 1))
			done
		else
			while [ $i -ge $j ]
			do
				echo $i
				i=$(($i - 1))
			done
		fi
	done
}

makemovie()
{
	[ ! "$2" ] && echo "usage makemovie index name $@" >&2 && return
	local index=$1
	shift
	showname=$@

	filename=$(echo "$showname" | webnormalize | sed "s|_*/_*|_|g")
	case $format in
		"web")
		convertfolder=$SDDIR
		output="$WEBDIR/$filename.$EXT"
		scale=640x360
		videorate=800k
		;;
		"large")
		scale=1920x1080
		videorate=2000k
		convertfolder=$HDDIR
		output="$WEBDIR/$filename-large.$EXT"
		;;
		# "dvd")
		# scale=1024x576
		# videorate=3000k
		# convertfolder=../dv
		# output="../dv/$filename.dv"
		# ;;
		*)
		echo format: $format >&2
		return
		;;
	esac
	printf "$showname "

	cd "$convertfolder" || exit $?
	convertfolder="$PWD"
	cd "$OLDPWD"

	export convertfolder
	export scale
	export videorate
	# export output

	printf " ($index)"
	printf "" > $TMP.sources
	first=$(index2list $index | head -1)
	for nr in $(index2list $index)
	do
		cp ignore .ignore.$$ 2>/dev/null || touch .ignore.$$
		if [ $nr -ne $first ]
		then
			grep -q "^$nr\." .ignore.$$ 2>/dev/null && continue
		fi
		printf " $nr"
		echo "$convertfolder/$nr.mp4" >> $TMP.sources
		# alias=$(ls -t $nr.mov $nr.mp4 $nr.MP4 $nr.MTS 2>/dev/null | head -1)
		alias=$nr.mov
		[ ! "$alias" ] && printf "\?" && continue
		input=$(grep "\s$alias$" .aliases | sed "s/\s[0-9]*\.[[:alnum:]]*$//")
		# echo "file '$convertfolder/$nr.mp4'" >> $TMP.sources
		mp4output="$convertfolder/$nr.mp4"
		if [ ! -f "$mp4output" ]
		# if [ ! -f "$0" ]
		then
			printf "(c)"
			rm -f "$mp4output"
			makemp4 -o "$mp4output" "$input" 2>/dev/null
			ffprobe -i "$mp4output" 2>/dev/null \
			&& printf "\b\b\b   \b\b\b" \
			|| {
				printf "\b\b\b[$?]"
				rm -f "$mp4output"
			}
		fi
		rm .ignore.$$
	done
	printf "\n"
	sources=$(cat $TMP.sources | tr "\n" " ")

	if [ -f $output ]
	then
		echo "$output ok" > $TMP.log
	else
		ls -1 $sources >/dev/null 2>/dev/null
		if [ $? -eq 0 ]
		then
			if [ -f "$TMP.sources" ]
			then
				echo "  $index $output"
				printf "  mergin $sources" | sed "s|$convertfolder/*||g"
				moviemerge "$output" $sources 2>/dev/null || log "merge failed $?"
			fi
		fi
	fi
}

cat $list | sed -e "s://.*::" -e "s:#.*::" | egrep "^[0-9]" \
| while read index name
do
	# log "index '$index' name '$name'"
	# echo "$index" | grep -q "[^0-9,-]" && echo "Wrong index: in '$index $name'" >&2 && begin= && showname= && theend= && continue
	echo "$index" | grep -q "[^0-9,-]" && end 1 "Wrong index '$index': in '$index $name'"

	if [ $begin -a "$showname" ]
	then
		theend=$(echo $index | sed "s/[^0-9].*//")
		[ $theend -gt $begin ] || end 1 "end $theend lower than begin $begin"
		# echo pending $begin-$(($theend - 1)) $showname
		makemovie $begin-$(($theend - 1)) $showname
		showname=
	fi
	begin=
	showname=
	echo $index | grep -q "[,-]"
	if [ $? -eq 0 ]
	then
		# echo "proceed now $index $name"
		[ ! "$name" ] && continue
		# log "makemovie $index $name"
		makemovie $index $name
		continue
	else
		if [ "$name" ]
		then
			begin=$index && showname=$name
		fi
		continue
	fi
	log "processed $index $name"
done
