#!/bin/sh
# pRecorder : screencast tray applet
# Screencast settings are defined by
# the user in the main pRecorder GUI.

export TEXTDOMAIN=precorder
export OUTPUT_CHARSET=UTF-8

APPDIR="/usr/local/precorder"
[ ! -d $APPDIR ] && mkdir -p $APPDIR
PREFDIR="$APPDIR/preferences"
[ ! -d $PREFDIR ] && mkdir -p $PREFDIR
[ ! -d $HOME/Videos ] && mkdir -p $HOME/Videos
[ ! -d $HOME/Videos/Screencasts ] && mkdir -p $HOME/Videos/Screencasts
SAVEDIR=`cat $PREFDIR/savedir 2>/dev/null`
[ ! "$SAVEDIR" ] && SAVEDIR="$HOME/Videos/Screencasts/"
WORKDIR="/tmp/precorder"
[ ! -d $WORKDIR ] && mkdir -p $WORKDIR

## SCREENCAST SETTINGS ##

# pRecorder settings (SCALE excluded)
AUDIO=`cat $PREFDIR/audio 2>/dev/null`
[ ! "$AUDIO" ] && AUDIO=true
AUDIO96=`cat $PREFDIR/audio96 2>/dev/null`
[ ! "$AUDIO96" ] && AUDIO96=false
AUDIOSOURCE=`cat $PREFDIR/audiosource 2>/dev/null`
[ ! "$AUDIOSOURCE" ] && AUDIOSOURCE=default
[ "$AUDIOSOURCE" = "default" ] && AUDIOSOURCE=""
[ "$AUDIO" = "true" ] && AUDIO="-a${AUDIOSOURCE}" || AUDIO=""
[ "$AUDIO96" = "true" ] && SAMPLERATE="-R 96000" || SAMPLERATE="-R 48000"
DATE=`cat $PREFDIR/date 2>/dev/null`
[ ! "$DATE" ] && DATE=false
DELAY=`cat $PREFDIR/delay 2>/dev/null`
[ ! "$DELAY" ] && DELAY=0
FILENAME=`cat $PREFDIR/filename 2>/dev/null`
[ ! "$FILENAME" ] && FILENAME=Screencast-1
FILETYPE=`cat $PREFDIR/filetype 2>/dev/null`
[ ! "$FILETYPE" ] && FILETYPE=MP4
FRAMES=`cat $PREFDIR/frames 2>/dev/null`
[ ! "$FRAMES" ] && FRAMES=default
[ "$FRAMES" = "default" ] && FRAMES="" || FRAMES="-r $FRAMES"
MEDIAPLAYER=`cat $PREFDIR/mediaplayer 2>/dev/null`
if [ ! "$MEDIAPLAYER" ]; then
	for i in defaultmediaplayer smplayer celluloid vlc kaffeine kodi mplayershell mplayer_shell parole totem; do [ "`which $i 2>/dev/null`" ] && { MEDIAPLAYER="$i"; break; } done
fi
TIME="86400" #arbitrarily high timeout, so user must stop recording
OPT=""

export DELAY

## COUNTDOWN FUNCTION ##

func_timer_delay(){
 if [ ${DELAY} -gt 2 ]; then #countdown code by SFR
	echo '<window resizable="false" opacity="0.7" type-hint="6" window-position="3">
		<vbox spacing="0" margin="0">
			<notebook show-border="false" show-tabs="false" tab-base-index="0">
				'$( for ((V=${DELAY}; V>=1; V--)); do
				echo '<text use-markup="true"><label>"<span font='"'Sans 24'"' size='"'xx-large'"' weight='"'bold'"' color='"'green'"'>'${V}'</span>"</label></text>'
				done )'
				<variable>varINDEX</variable>
				<input>echo $(( ($varINDEX+1) % '${DELAY}' ))</input>
			</notebook>
			<timer visible="false" interval="1">
				<action>refresh:varINDEX</action>
			</timer>
			<timer visible="false" interval="'${DELAY}'">
				<action>exit:EXIT</action>
			</timer>
		</vbox>
		<action signal="hide">exit:abort</action>
	</window>' | gtkdialog -s >/dev/null 2>&1
 else
	sleep ${DELAY}
 fi
}
export -f func_timer_delay

## MAIN DIALOG ##

[ -f /usr/local/lib/X11/pixmaps/info.xpm ] && ICON="/usr/local/lib/X11/pixmaps/info.xpm" || ICON=""
REPLY=`Xdialog --stdout --title "$(gettext 'Start Recording')" \
  --backtitle "$(gettext 'FORMAT'): ${FILETYPE} | $(gettext 'DELAY'): ${DELAY}s | $(gettext 'TIME'): $(gettext 'nonstop')" \
  --icon "$ICON" \
  --under-mouse \
  --buttons-style text \
  --no-tags \
  --cancel-label "$(gettext 'Cancel')" \
  --ok-label "$(gettext 'Record')" \
  --radiolist "$(gettext 'Recording continues until the Stop option \n is selected in the tray menu of pRecorder !')" 0 0 4  "1" "$(gettext 'Fullscreen')" "on"  "2" "$(gettext 'Region - selected by mouse')" "off" `
if [ "$REPLY" = "1" ]; then #record fullscreen
	OUTPUTS="`wlr-randr | grep -m 2 -v '^ ' | cut -f 1 -d ' ' | tr '\n' ' ' | sed 's/ $//'`" #define screen ID
	OUTPUT="${OUTPUTS%% *}"
	[ -z "$OUTPUT" ] && exit
	if [ "$OUTPUT" != "$OUTPUTS" ]; then #when multiple screens detected, use mouse-click to select a screen for fullscreen capture
		OUTPUT="`slurp -p -f %o`"
		[ -z "$OUTPUT" ] && exit
	fi
	FILETYPE="`echo ${FILETYPE} | tr [:upper:] [:lower:]`"
	num=1
	while [ -f "$SAVEDIR$FILENAME.$FILETYPE" ]
	do
		FILENAME=Screencast-"$num"
		let num=num+1
	done
	[ "$DATE" = "true" ] && DATE="$(date +%Y-%m-%d_%H-%M-%S)" FILENAME="" || DATE=""
	[ "$FILETYPE" = "gif" ] && AUDIO="" OPT="--muxer gif --codec gif"
	[ "$FILETYPE" = "webm" ] && OPT="--muxer webm --codec libvpx --audio-codec=libvorbis"
	func_timer_delay
	sleep .5
	if [ "$FILETYPE" = "gif" ]; then
		timeout -s SIGINT ${TIME}s wf-recorder -o "$OUTPUT" -y ${AUDIO} ${SAMPLERATE} ${FRAMES} ${OPT} -f "${WORKDIR}/tmp-precorder.mkv"
		gtkdialog-splash -close never -margin 10 -placement center -fontsize large -bg goldenrod -text " $(gettext 'Processing GIF, please wait...') " &
		XPID=$!
		ffmpeg -i "${WORKDIR}/tmp-precorder.mkv" -filter_complex "fps=10,scale=720:-1[s]; [s]split[a][b]; [a]palettegen[palette]; [b][palette]paletteuse" "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
		rm -f "${WORKDIR}/tmp-precorder.mkv"
		kill $XPID
	else
		timeout -s SIGINT ${TIME}s wf-recorder -o "$OUTPUT" -y ${AUDIO} ${SAMPLERATE} ${FRAMES} ${OPT} -f "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
	fi
	echo "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}" > $PREFDIR/current
	gtkdialog-splash -close never -timeout 5 -margin 10 -placement center -fontsize large -bg goldenrod -text " ${FILENAME}${DATE}.${FILETYPE} $(gettext 'saved in '$SAVEDIR'') "
	$MEDIAPLAYER "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
elif [ "$REPLY" = "2" ]; then #record selected region of interest (ROI)
	FILETYPE="`echo ${FILETYPE} | tr [:upper:] [:lower:]`"
	num=1
	while [ -f "$SAVEDIR$FILENAME.$FILETYPE" ]
	do
		FILENAME=Screencast-"$num"
		let num=num+1
	done
	[ "$DATE" = "true" ] && DATE="$(date +%Y-%m-%d_%H-%M-%S)" FILENAME="" || DATE=""
	[ "$FILETYPE" = "gif" ] && AUDIO="" OPT="--muxer gif --codec gif"
	[ "$FILETYPE" = "webm" ] && OPT="--muxer webm --codec libvpx --audio-codec=libvorbis"
	func_timer_delay
	sleep .5
	cd $SAVEDIR
	if [ "$FILETYPE" = "gif" ]; then
		timeout -s SIGINT ${TIME}s wf-recorder -y ${AUDIO} ${SAMPLERATE} ${FRAMES} ${OPT} -g "$(slurp -d)" -f "${WORKDIR}/tmp-precorder.mkv"
		gtkdialog-splash -close never -margin 10 -placement center -fontsize large -bg goldenrod -text " $(gettext 'Processing GIF, please wait...') " &
		XPID=$!
		ffmpeg -i "${WORKDIR}/tmp-precorder.mkv" -filter_complex "[0]split[a][b]; [a]palettegen[palette]; [b][palette]paletteuse" "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
		rm -f "${WORKDIR}/tmp-precorder.mkv"
		kill $XPID
	else
		timeout -s SIGINT ${TIME}s wf-recorder -y ${AUDIO} ${SAMPLERATE} ${FRAMES} ${OPT} -g "$(slurp -d)" -f "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
	fi
	echo "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}" > $PREFDIR/current
	gtkdialog-splash -close never -timeout 5 -margin 10 -placement center -fontsize large -bg goldenrod -text " ${FILENAME}${DATE}.${FILETYPE} $(gettext 'saved in '$SAVEDIR'') "
	$MEDIAPLAYER "${SAVEDIR}${FILENAME}${DATE}.${FILETYPE}"
else
	exit 0
fi

exit 0
