#!/bin/bash -e # TODO doc # # Reencodes DVD structures to mkv using a local scratchdir # # All audio streams and subtitles are copied # Video is reencoded with x264 -profile slow -crf 22 # TODO: # - multiple video streams # - refining encoding process # - try to find subtitle language # in case one wants to use avconv.... FFMPEG=ffmpeg function usage { echo "Usage: $0 Moviefolder" exit 1 } [ "$#" == "1" ] || usage export TMP_VID_DIR=/mnt/tmp VIDEO_DIR=$(readlink -f "$1") function is_dvd { if [ -d "$VIDEO_DIR/VIDEO_TS" ]; then return 0 else return 1 fi } # function print { echo $@ > /dev/null } function finish { print "exit code $? [$@]" [ -f "$TMPVOB" ] && rm "$TMPVOB" print . } trap finish EXIT function _process_dvd { echo "Working on VIDEO_DIR $VIDEO_DIR" echo "Folder recognized as $DIRNAME" is_dvd || return 2 pushd "$VIDEO_DIR/VIDEO_TS/" local d_path="$TMP_VID_DIR/$1" mkdir -p "$d_path" [ -L "$d_path/src" ] || ln -s "$VIDEO_DIR" "$d_path/src" local vobs=$(ls *.VOB | sort) TMPVOB="$d_path/movie.vob" local destfile="$d_path/movie.mkv" cat $vobs > "$TMPVOB" $FFMPEG \ -analyzeduration 2G -probesize 2G \ -i "$d_path/movie.vob" \ -map 0 -dn \ -c:v libx264 -preset slow -crf 22 \ -c:a copy \ -c:s copy \ "$destfile" || rm "$destfile" mv "$destfile" "$VIDEO_DIR" popd } if [ ! -d "$VIDEO_DIR" ] || ! is_dvd ; then # "no (dvd) directory given" exit 1 fi DIRNAME="$(basename "$VIDEO_DIR")" [ ! -f "$VIDEO_DIR/movie.mkv" ] && is_dvd && _process_dvd "$DIRNAME"