]> Frank Brehm's Git Trees - my-stuff/tools.git/commitdiff
Beginn Refaktorierung
authorFrank Brehm <frank@brehm-online.com>
Sun, 23 Apr 2017 14:02:03 +0000 (16:02 +0200)
committerFrank Brehm <frank@brehm-online.com>
Sun, 23 Apr 2017 14:02:03 +0000 (16:02 +0200)
bin/convert_movie.sh

index 8289de61f60e8773d2015e52b118c79fd8645f16..0e9b52567f12df5881181073c78fd6aef63ef54f 100755 (executable)
@@ -1,8 +1,419 @@
 #!/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"
@@ -128,4 +539,4 @@ echo "[$(date)]: Ready."
 
 exit 0
 
-# vim: ts=4 expandtab
+# vim: ts=4 expandtab list