#!/bin/bash
#set -x
-#set -e
-#set -n
+set -e
+set -u
+
+VERSION="0.3.1"
+
+#------------------------------------------------------------------------------
+DEBUG="n"
+VERBOSE="n"
+SIMULATE="n"
+YES="n"
+
+# console colors:
+RED=""
+YELLOW=""
+GREEN=""
+BLUE=""
+NORMAL=""
+
+HAS_TTY='y'
+BASEDIR="${0%/*}"
+BASENAME="$(basename ${0})"
+
+SRC_MOVIE=""
+TGT_MOVIE=""
+TMP_MOVIE=""
+
+START_TIME=""
+END_TIME=""
+
+detect_color() {
+
+ local safe_term="${TERM//[^[:alnum:]]/?}"
+ local match_lhs=""
+ local use_color="false"
+ [[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
+ [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
+ [[ -z ${match_lhs} ]] \
+ && type -P dircolors >/dev/null \
+ && match_lhs=$(dircolors --print-database)
+ [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color="true"
+
+ # console colors:
+ if [ "${use_color}" = "true" ] ; then
+ RED="\033[38;5;196m"
+ YELLOW="\033[38;5;226m"
+ GREEN="\033[38;5;46m"
+ BLUE="\033[38;5;27m"
+ NORMAL="\033[39m"
+ else
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ NORMAL=""
+ fi
+
+ local my_tty=$(tty)
+ if [[ "${my_tty}" =~ 'not a tty' ]] ; then
+ my_tty='-'
+ fi
+
+ if [[ "${my_tty}" = '-' || "${safe_term}" = "dump" ]] ; then
+ HAS_TTY='n'
+ fi
+
+}
+detect_color
+
+#------------------------------------------------------------------------------
+my_date() {
+ date +'%F %T'
+}
+
+#------------------------------------------------------------------------------
+debug() {
+ if [[ "${VERBOSE}" != "y" ]] ; then
+ return
+ fi
+ echo -e " * [$(my_date)] [${BASENAME}:DEBUG]: $@"
+}
+
+#------------------------------------------------------------------------------
+do_cmd() {
+
+ local cmd="$1"
+
+ if [[ "${VERBOSE}" == "y" || "${SIMULATE}" == "y" ]] ; then
+ info "Ausführen: ${cmd}"
+ echo
+ fi
+
+ if [[ "${SIMULATE}" != "y" ]] ; then
+ eval ${cmd}
+ fi
+
+}
+
+#------------------------------------------------------------------------------
+info() {
+ echo -e " ${GREEN}*${NORMAL} [$(my_date)] [${BASENAME}:${GREEN}INFO${NORMAL}] : $@"
+}
+
+#------------------------------------------------------------------------------
+warn() {
+ echo -e " ${YELLOW}*${NORMAL} [$(my_date)] [${BASENAME}:${YELLOW}WARN${NORMAL}] : $@" >&2
+}
+
+#------------------------------------------------------------------------------
+error() {
+ echo -e " ${RED}*${NORMAL} [$(my_date)] [${BASENAME}:${RED}ERROR${NORMAL}]: $@" >&2
+}
+
+#------------------------------------------------------------------------------
+remove() {
+ if [[ "${VERBOSE}" == "y" ]] ; then
+ rm -v "$@"
+ else
+ rm "$@"
+ fi
+}
+
+#------------------------------------------------------------------------------
+description() {
+ cat <<-EOF
+ Diese Script konvertiert das übergebene Video. Dabei wird es grundsätzlich
+ in eine AVI-Datei konvertiert.
+ Dabei kann die Video-Auflösung, eine Rotation des Videos sowie ein
+ Titel des Videas übergeben werden.
+ Wenn kein Dateiname für das Ziel-Video angegeben wird, wird
+ ein neuer Dateiname, der noch nicht vorhanden ist, generiert.
+
+ EOF
+
+}
+
+#------------------------------------------------------------------------------
+usage() {
+ cat <<-EOF
+ Verwendung: ${BASENAME} [options ...] SOURCE_VIDEO [TARGET_VIDEO]
+ ${BASENAME} [-h|--help]
+ ${BASENAME} [-V|--version]
+
+ Options:
+ -S|--scale PIXEL
+ Skalierung des Ziel-Videos in Pixeln. Dabei wird die größere
+ Dimension angegeben (meistens die Breite). Übliche Werte dafür
+ sind 480, 800 oder 1280. Bitte beachten, dass es meistens
+ keinen Sinn macht, ein Video zu vergrößern. Wenn nicht angegeben,
+ wird der Wert 800 angenommen.
+ -R|--rotate-right
+ Rotiert das Ziel-Video um 90° nach rechts (im Uhrzeigersinn).
+ -L|--rotate-left
+ Rotiert das Ziel-Video um 90° nach links (entgegen Uhrzeigersinn).
+ -B|--bitrate KBYTE_PER_SECOND
+ Definiert die Bitrate des Ziel-Videos in KBytes je Sekunde. Wenn
+ nicht angegeben, wird bei einer Skalierung bis 800 eine Bitrate von
+ 800, und darüber von 1600 verwendet. Wenn eine Bitrate von 0 (Null)
+ angegeben wird, wird kein Bitraten-Management verwendet.
+ -T|--title TITLE
+ Titel des Videos (wird in den Metadaten gespeichert).
+ -d|--debug Debug Ausgabe (bash -x)
+ -v|--verbose Schaltet ausführlichere Ausgaben an.
+ -s|--simulate Simulations-Modus, es erfolgt keine Konvertierung.
+ --nocolor Keine farbigen Ausgaben.
+ -h|--help Zeigt diese Hilfe-Ausgabe und beendet sich.
+ -V|--version Gibt die Versions-Nummer desScripts aus und beendet sich.
+ EOF
+}
+
+GIVEN_SCALE=""
+BITRATE=""
+ROTATE=""
+TITLE=""
+
+#------------------------------------------------------------------------------
+get_cmd_options() {
+
+ set +e
+ local temp=$( getopt -o S:RLB:T:ydvshV \
+ --long scale:,rotate-right,rotate-left,bitrate:,title:,yes,debug,verbose,simulate,nocolor,help,version \
+ -n "${BASENAME}" -- "$@" )
+ if [[ $? != 0 ]] ; then
+ echo "" >&2
+ usage >&2
+ exit 1
+ fi
+ set -e
+
+ eval set -- "${temp}"
+
+ while true; do
+ case "$1" in
+ -S|--scale)
+ GIVEN_SCALE=$( echo "${2}" | sed -e 's/[^0-9]//g' )
+ shift
+ shift
+ ;;
+ -R|--rotate-right)
+ ROTATE="1"
+ shift
+ ;;
+ -L|--rotate-left)
+ ROTATE="2"
+ shift
+ ;;
+ -B|--bitrate)
+ BITRATE=$( echo "${2}" | sed -e 's/[^0-9]//g' )
+ shift
+ shift
+ ;;
+ -T|--title)
+ TITLE=$( echo "${2}" | sed -e 's/^[ ]*//' -e 's/[ ]*$//' )
+ shift
+ shift
+ ;;
+ -y|--yes)
+ YES="y"
+ shift
+ ;;
+ -d|--debug)
+ DEBUG="y"
+ shift
+ ;;
+ -v|--verbose)
+ VERBOSE="y"
+ shift
+ ;;
+ -s|--simulate)
+ SIMULATE="y"
+ shift
+ ;;
+ --nocolor)
+ RED=""
+ YELLOW=""
+ GREEN=""
+ BLUE=""
+ NORMAL=""
+ shift
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -V|--version)
+ echo "${BASENAME} version: ${VERSION}"
+ exit 0
+ ;;
+ --) shift
+ break
+ ;;
+ *) echo "Wrong parameter '${1}' found."
+ echo >&2
+ usage >&2
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ "${DEBUG}" = "y" ]] ; then
+ set -x
+ fi
+
+ if [[ "$#" -lt 1 ]] ; then
+ error "Keine Ausgangsfilmdatei angegeben."
+ echo
+ usage >&2
+ exit 1
+ fi
+
+ SRC_MOVIE="$1"
+
+ if [[ "$#" -gt 2 ]] ; then
+ error "Zu viele Argumente."
+ echo
+ usage >&2
+ exit 1
+ fi
+
+ if [[ "$#" -eq 2 ]] ; then
+ TGT_MOVIE="$2"
+ fi
+
+ if [[ -n "${GIVEN_SCALE}" ]] ; then
+ GIVEN_SCALE=$(( ${GIVEN_SCALE} + 0 ))
+ if [[ "${GIVEN_SCALE}" -lt 80 ]] ; then
+ error "Die minimale Skalierung beträgt ${RED}80${NORMAL}."
+ echo
+ exit 1
+ fi
+ if [[ "${GIVEN_SCALE}" -gt 4000 ]] ; then
+ error "Die maximale Skalierung beträgt ${RED}4000${NORMAL}."
+ echo
+ exit 1
+ fi
+ else
+ GIVEN_SCALE="800"
+ fi
+ SCALE="${GIVEN_SCALE}:-3"
+
+ if [[ -n "${BITRATE}" ]] ; then
+ BITRATE=$(( ${BITRATE} + 0 ))
+ else
+ if [[ "${GIVEN_SCALE}" -gt 800 ]] ; then
+ BITRATE=1600
+ else
+ BITRATE=800
+ fi
+ fi
+
+ if [[ -z "${TGT_MOVIE}" ]]; then
+ local old_stem=$( echo "${SRC_MOVIE}" | sed -e 's/\.\(mov\|avi\|mp4\|mkv\)$//i' )
+ if [[ "${SRC_MOVIE}" == "${old_stem}" ]] ; then
+ error "Die Datei '${RED}${SRC_MOVIE}${NORMAL}' scheint kein Quicktime, Mpeg, Matroska oder AVI Film zu sein." >&2
+ exit 1
+ fi
+ local new_ext="avi"
+ TGT_MOVIE="${old_stem}.${new_ext}"
+ local i=0
+ while [[ -e "${TGT_MOVIE}" ]] ; do
+ new_ext="new.${i}.avi"
+ TGT_MOVIE="${old_stem}.${new_ext}"
+ i=$(( $i + 1 ))
+ done
+ else
+ if [[ -e "${TGT_MOVIE}" ]]; then
+ error "Zieldatei '${RED}${TGT_MOVIE}${NORMAL}' existiert bereits." >&2
+ echo
+ exit 1
+ fi
+ fi
+
+
+
+}
+
+#------------------------------------------------------------------------------
+countdown() {
+
+ echo
+ echo -e "${GREEN}Beginn der Konvertierung (Abbruch mit Strg-C).${NORMAL}"
+ echo
+ sleep 1
+
+ local i=
+
+ if [ "${YES}" != "y" ] ; then
+ echo -en "Start in:"
+ for (( i = 5; i > 0; i-- )); do
+ echo -en " ${YELLOW}${i}${NORMAL}"
+ sleep 1
+ done
+ echo
+ fi
+
+ echo
+ echo -e " ${GREEN}Go go go ...${NORMAL}"
+
+}
+
+#------------------------------------------------------------------------------
+show_movie_info() {
+
+ local movie="$1"
+ echo
+ echo "#-------------------------------------------------------------------"
+ info "Informationen über das Video '${movie}':"
+ echo
+ ffmpeg -i "${movie}" -hide_banner || true
+
+}
+
+#------------------------------------------------------------------------------
+
+main() {
+
+ get_cmd_options "$@"
+
+ echo
+ echo "####################################################################"
+ echo "Konvertierung von:"
+ echo -e " - Ausgangsdatei: '${GREEN}${SRC_MOVIE}${NORMAL}'"
+ echo -e " - Zieldatei: '${GREEN}${TGT_MOVIE}${NORMAL}'"
+ echo
+ echo " - Skalierung: ${GIVEN_SCALE}"
+ if [[ -n "${ROTATE}" ]] ; then
+ if [[ "${ROTATE}" == "1" ]] ; then
+ echo " - Rotation 90° nach rechts (im Uhrzeigersinn)"
+ else
+ echo " - Rotation 90° nach links (entgegen Uhrzeigersinn)"
+ fi
+ else
+ echo " - keine Rotation"
+ fi
+ if [[ "${BITRATE}" -eq 0 ]] ; then
+ echo " - kein Bitratenmanagement"
+ else
+ echo " - Bitrate: ${BITRATE} kByte/sec"
+ fi
+ if [[ -n "${TITLE}" ]] ; then
+ echo " - Titel: '${TITLE}'"
+ else
+ echo " - kein Titel"
+ fi
+
+ show_movie_info "${SRC_MOVIE}"
+
+ countdown
+
+}
+
+main "$@"
+exit 0
+
SCALE="1280:-3"
exit 0
-# vim: ts=4 expandtab
+# vim: ts=4 expandtab list