#!/bin/bash set -e # Command-line parameters IN="${1}" OUT="${2}" # Sanity check if [ ! -r "${IN}" ]; then echo "Usage: `basename "${0}"` in_file [out_file]" 1>&2 exit 1 fi if [ -e "${OUT}" ]; then echo "`basename "${0}"`: Output file exists: ${OUT}" 1>&2 exit 1 fi # Parameters # Allow environmental overrides # Provide looser default matching to TS, MPEG, and MPG sources if [ -z "${RECODE_SIZE_RATIO}" ]; then RECODE_SIZE_RATIO=20 if echo "${IN}" | grep -E -i -q "\.(ts|mpe?g)$"; then RECODE_SIZE_RATIO=10 fi fi if [ -z "${RECODE_LENGTH_RATIO}" ]; then RECODE_LENGTH_RATIO=90 if echo "${IN}" | grep -E -i -q "\.(ts|mpe?g)$"; then RECODE_LENGTH_RATIO=70 fi fi if [ -z "${RECODE_OVERSIZE}" ]; then # ~2 GB RECODE_OVERSIZE=$((2000 * 1024 * 1024)) fi # Delayed error indicator if [ -z "${KEEP_IN}" ]; then KEEP_IN=0 fi # Recode export RECODE_OUTFILE=1 OUT="`~/bin/video/encode.pl "${IN}" "${OUT}"`" # Ensure the output file exists if [ -z "${OUT}" ] || [ ! -r "${OUT}" ]; then echo "`basename "${0}"`: Output file not defined or does not exist. Aborting..." 1>&2 exit 1 fi # Bail if the original disappeared if [ ! -r "${IN}" ]; then echo "`basename "${0}"`: Input file does not exist. Aborting..." 1>&2 exit 1 fi # Check to be sure the output video has a minimum file size SIZE_RATIO=0 SIZE_IN="`stat -f %z "${IN}" 2>/dev/null`" SIZE_OUT="`stat -f %z "${OUT}" 2>/dev/null`" if [ -z "${SIZE_IN}" ] || [ -z "${SIZE_OUT}" ]; then KEEP_IN=1 echo "`basename "${0}"`: Unable to determine size_in or size_out." 1>&2 else SIZE_RATIO=$(( $SIZE_OUT * 100 / $SIZE_IN )) if [ $SIZE_RATIO -lt $RECODE_SIZE_RATIO ] && [ $SIZE_IN -lt $RECODE_OVERSIZE ]; then KEEP_IN=1 echo "`basename "${0}"`: Output file size (${SIZE_OUT}) is not at least ${RECODE_SIZE_RATIO}% of the input file size (${SIZE_IN}): ${IN}" 1>&2 fi fi # Check to be sure the videos are (about) the same duration LENGTH_RATIO=0 LENGTH_IN="`~/bin/video/movInfo.pl "${IN}" LENGTH | sed 's%\..*$%%'`" LENGTH_OUT="`~/bin/video/movInfo.pl "${OUT}" LENGTH | sed 's%\..*$%%'`" if [ -z "${LENGTH_IN}" ] || [ -z "${LENGTH_OUT}" ] || [ $LENGTH_IN == 0 ] || [ $LENGTH_OUT == 0 ]; then KEEP_IN=1 echo "`basename "${0}"`: Unable to determine length_in or length_out." 1>&2 else LENGTH_RATIO=$(( $LENGTH_OUT * 100 / LENGTH_IN )) if [ $LENGTH_RATIO -gt 100 ]; then LENGTH_RATIO=$(( $LENGTH_IN * 100 / LENGTH_OUT )) fi if [ $LENGTH_RATIO -lt $RECODE_LENGTH_RATIO ]; then KEEP_IN=1 echo "`basename "${0}"`: Output file duration (${LENGTH_OUT}) does not match input file duration (${LENGTH_IN}) to within ${RECODE_LENGTH_RATIO}%: ${IN}" 1>&2 fi fi # Re-label undefined audio tracks in files with no English tracks ~/bin/video/undToEng.pl "${OUT}" # Remove the input file(s) if all is well if [ $KEEP_IN -eq 0 ]; then rm -f "${IN}" SRT="`echo "${IN}" | sed 's%\.[^\.]*$%%'`.srt" if [ ! -e "${SRT}" ]; then SRT="`echo "${IN}" | sed 's%\.[^\.]*$%%'`.ssa" fi if [ -e "${SRT}" ]; then rm -f "${SRT}" fi RENAME="`echo "${OUT}" | sed 's%^\(.*\)-recode\(\.[^\.]*\)$%\1\2%'`" if [ "${RENAME}" == "${IN}" ] && [ ! -e "${IN}" ]; then mv "${OUT}" "${IN}" fi else echo -e "`basename "${0}"`: Delayed error: Refusing to delete input file.\n" 1>&2 fi