#!/bin/sh

#===============================================================================
# scene-images
# szene-bilder
# Thumbnails von ffmpeg-Szenen
#===============================================================================

# Abhängigkeiten:
# ffmpeg

#===============================================================================
# Verwendung von Skripten
#===============================================================================

usage () {
# Wenn das Argument an die Funktion übergeben wird, echo es
[ -z "${1}" ] || echo "! ${1}"
# Hilfe anzeigen
echo "\
$(basename "$0") -i eingang -c datei schneiden -t (png|jpg) -x breite -y höhe

-i eingang.(mp4|mov|mkv|m4v)
-c datei schneiden
-t (png|jpg)       : optionales Argument # Wenn Option nicht Standardeinstellungen für PNG bereitgestellt wird
-x breite          : optionales Argument #
-y höhe            : optionales Argument #"
exit 2
}


#===============================================================================
# Fehlermeldungen
#===============================================================================

INVALID_OPT_ERR='Ungültige Option:'
REQ_ARG_ERR='erfordert eine Argumentation'
WRONG_ARGS_ERR='falsche Anzahl von Argumenten an Skript übergeben'


#===============================================================================
# Überprüfen Sie die Anzahl der an das Skript übergebenen Argumente
#===============================================================================

[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"


#===============================================================================
# getopts überprüft die an das Skript übergebenen Optionen
#===============================================================================

while getopts ':i:c:t:x:y:h' opt
do
  case ${opt} in
     i) input="${OPTARG}";;
     c) cutfile="${OPTARG}";;
     t) image="${OPTARG}";;
     x) width="${OPTARG}";;
     y) height="${OPTARG}";;
     h) usage;;
     \?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
     :) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
  esac
done
shift $((OPTIND-1))


#===============================================================================
# variablen
#===============================================================================

# Holen Sie sich den Namen der Eingabedatei
input_nopath="${input##*/}"
input_name="${input_nopath%.*}"

# Bildstandard
image_default="png"


#===============================================================================
# ffmpeg-Bild extrahieren
#===============================================================================

# Bildfunktion
extract () {
  output="${input_name}-[${seconds}].${image:=${image_default}}"
  ffmpeg \
  -nostdin \
  -hide_banner \
  -stats -v panic \
  -ss "${seconds}" \
  -i "${input}" \
  -q:v 2 -f image2 \
  -vframes 1 \
  "${output}"
}


# Bild- und Skalierungsfunktion
extract_scale () {
  output="${input_name}-[${seconds}].${image:=${image_default}}"
  ffmpeg \
  -nostdin \
  -hide_banner \
  -stats -v panic \
  -ss "${seconds}" \
  -i "${input}" \
  -q:v 2 -f image2 \
  -vframes 1 \
  -vf scale="${width:=-1}:${height:=-1}" \
  "${output}"
}


#===============================================================================
# Datei lesen und ffmpeg ausführen
#===============================================================================

if [ -n "${width}" ] || [ -n "${height}" ]; then
  count=1
  while IFS= read -r seconds; do
     extract_scale
  done < "${cutfile}"
else
  count=1
  while IFS= read -r seconds; do
     extract
  done < "${cutfile}"
fi