| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #!/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
- # 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
- else
- echo -e "`basename "${0}"`: Delayed error: Refusing to delete input file.\n" 1>&2
- fi
|