recode 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/bin/bash
  2. set -e
  3. # Command-line parameters
  4. IN="${1}"
  5. OUT="${2}"
  6. # Sanity check
  7. if [ ! -r "${IN}" ]; then
  8. echo "Usage: `basename "${0}"` in_file [out_file]" 1>&2
  9. exit 1
  10. fi
  11. if [ -e "${OUT}" ]; then
  12. echo "`basename "${0}"`: Output file exists: ${OUT}" 1>&2
  13. exit 1
  14. fi
  15. # Parameters
  16. # Allow environmental overrides
  17. # Provide looser default matching to TS, MPEG, and MPG sources
  18. if [ -z "${RECODE_SIZE_RATIO}" ]; then
  19. RECODE_SIZE_RATIO=40
  20. if echo "${IN}" | grep -E -i -q "\.(ts|mpe?g)$"; then
  21. RECODE_SIZE_RATIO=10
  22. fi
  23. fi
  24. if [ -z "${RECODE_LENGTH_RATIO}" ]; then
  25. RECODE_LENGTH_RATIO=90
  26. if echo "${IN}" | grep -E -i -q "\.(ts|mpe?g)$"; then
  27. RECODE_LENGTH_RATIO=70
  28. fi
  29. fi
  30. if [ -z "${RECODE_OVERSIZE}" ]; then
  31. # ~2 GB
  32. RECODE_OVERSIZE=$((2000 * 1024 * 1024))
  33. fi
  34. # Delayed error indicator
  35. if [ -z "${KEEP_IN}" ]; then
  36. KEEP_IN=0
  37. fi
  38. # Recode
  39. export RECODE_OUTFILE=1
  40. OUT="`~/bin/video/encode.pl "${IN}" "${OUT}"`"
  41. # Ensure the output file exists
  42. if [ -z "${OUT}" ] || [ ! -r "${OUT}" ]; then
  43. echo "`basename "${0}"`: Output file not defined or does not exist. Aborting..." 1>&2
  44. exit 1
  45. fi
  46. # Bail if the original disappeared
  47. if [ ! -r "${IN}" ]; then
  48. echo "`basename "${0}"`: Input file does not exist. Aborting..." 1>&2
  49. exit 1
  50. fi
  51. # Check to be sure the output video has a minimum file size
  52. SIZE_RATIO=0
  53. SIZE_IN="`stat -f %z "${IN}" 2>/dev/null`"
  54. SIZE_OUT="`stat -f %z "${OUT}" 2>/dev/null`"
  55. if [ -z "${SIZE_IN}" ] || [ -z "${SIZE_OUT}" ]; then
  56. KEEP_IN=1
  57. echo "`basename "${0}"`: Unable to determine size_in or size_out." 1>&2
  58. else
  59. SIZE_RATIO=$(( $SIZE_OUT * 100 / $SIZE_IN ))
  60. if [ $SIZE_RATIO -lt $RECODE_SIZE_RATIO ] && [ $SIZE_IN -lt $RECODE_OVERSIZE ]; then
  61. KEEP_IN=1
  62. 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
  63. fi
  64. fi
  65. # Check to be sure the videos are (about) the same duration
  66. LENGTH_RATIO=0
  67. LENGTH_IN="`~/bin/video/movInfo.pl "${IN}" LENGTH | sed 's%\..*$%%'`"
  68. LENGTH_OUT="`~/bin/video/movInfo.pl "${OUT}" LENGTH | sed 's%\..*$%%'`"
  69. if [ -z "${LENGTH_IN}" ] || [ -z "${LENGTH_OUT}" ] || [ $LENGTH_IN == 0 ] || [ $LENGTH_OUT == 0 ]; then
  70. KEEP_IN=1
  71. echo "`basename "${0}"`: Unable to determine length_in or length_out." 1>&2
  72. else
  73. LENGTH_RATIO=$(( $LENGTH_OUT * 100 / LENGTH_IN ))
  74. if [ $LENGTH_RATIO -gt 100 ]; then
  75. LENGTH_RATIO=$(( $LENGTH_IN * 100 / LENGTH_OUT ))
  76. fi
  77. if [ $LENGTH_RATIO -lt $RECODE_LENGTH_RATIO ]; then
  78. KEEP_IN=1
  79. echo "`basename "${0}"`: Output file duration (${LENGTH_OUT}) does not match input file duration (${LENGTH_IN}) to within ${RECODE_LENGTH_RATIO}%: ${IN}" 1>&2
  80. fi
  81. fi
  82. # Remove the input file(s) if all is well
  83. if [ $KEEP_IN -eq 0 ]; then
  84. rm -f "${IN}"
  85. SRT="`echo "${IN}" | sed 's%\.[^\.]*$%%'`.srt"
  86. if [ ! -e "${SRT}" ]; then
  87. SRT="`echo "${IN}" | sed 's%\.[^\.]*$%%'`.ssa"
  88. fi
  89. if [ -e "${SRT}" ]; then
  90. rm -f "${SRT}"
  91. fi
  92. else
  93. echo -e "`basename "${0}"`: Delayed error: Refusing to delete input file.\n" 1>&2
  94. fi