#!/bin/sh
usage() {
	printf '%b\n' "${0##*/} -i <input_file> [OPTIONS]"              \
	              "\noptions:"                                      \
	              "\t-S TIMESTAMP - timestamp to start the gif"     \
	              "\t-d SECONDS   - how long the gif should be"     \
	              "\t-o FILE      - output file (default: out.gif)" \
	              "\t-s SCALE     - border size (default: 1)"
}

while [ "$*" ]
do
	case $1 in
		-  ) shift; continue ;;
		-- ) shift; break ;;
		-* ) flag=${1#-}; shift ;;
		*  ) shift; continue ;;
	esac

	while [ "$flag" ]
	do
		arg=${flag%"${flag#?}"}

		case $arg in
			S ) VID2GIF_START=$1; shift ;;
			d ) VID2GIF_DURATION=$1; shift ;;
			h ) usage; exit 0 ;;
			i ) VID2GIF_INPUT_FILE=$1; shift ;;
			o ) VID2GIF_OUTPUT_FILE=$1; shift ;;
			s ) VID2GIF_SCALE=$1; shift ;;
			* ) printf '%s\n' "${0##*/}: -$arg: invalid argument" 1>&2
			    usage 1>&2; exit 1 ;;
		esac

		flag=${flag#?}
	done
done

[ -z "$VID2GIF_INPUT_FILE" ] && {
	printf '%s\n' "${0##*/}: missing input video" 1>&2
	usage 1>&2; exit 1
}

start=
duration=
[ -n "$VID2GIF_START" ] && start="-ss"
[ -n "$VID2GIF_DURATION" ] && duration="-t"

: "${VID2GIF_SCALE:=1}"
: "${VID2GIF_OUTPUT_FILE:=out.gif}"

filters="scale=iw*${VID2GIF_SCALE}:-1:flags=lanczos"
palette_file=$(mktemp --tmpdir XXX.png)

ffmpeg -hide_banner -loglevel warning \
	"$start" "$VID2GIF_START" \
	"$duration" "$VID2GIF_DURATION" \
	-i "$VID2GIF_INPUT_FILE" -vf "$filters,palettegen" -update true \
	-y "$palette_file"
ffmpeg -hide_banner -loglevel warning \
	"$start" "$VID2GIF_START" \
	"$duration" "$VID2GIF_DURATION" \
	-i "$VID2GIF_INPUT_FILE" -i "$palette_file" -filter_complex "$filters,paletteuse" \
	"$VID2GIF_OUTPUT_FILE"

rm "$palette_file"
