findRecode 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/bin/bash
  2. # Parameters
  3. FOLDER="`~/bin/video/mediaPath`"
  4. MIN_RATE=275000
  5. MIN_SIZE="425M"
  6. MIN_HEIGHT=500
  7. NAME_REGEX="\.(mov|avi|mkv|mp4|ts|mpg|mpeg)$"
  8. # Command-line overrides
  9. if [ -n "${1}" ]; then
  10. FOLDER="${1}"
  11. fi
  12. if [ -n "${2}" ]; then
  13. MIN_SIZE="${2}"
  14. fi
  15. if [ -n "${3}" ]; then
  16. MIN_RATE="${3}"
  17. fi
  18. if [ -n "${4}" ]; then
  19. MIN_HEIGHT="${4}"
  20. fi
  21. if [ -n "${5}" ]; then
  22. NAME_REGEX="${5}"
  23. fi
  24. # Name-based paramters
  25. ZERO=0
  26. if basename "${0}" | grep -q '0'; then
  27. ZERO=1
  28. fi
  29. # Sanity check
  30. if [ ! -d "${FOLDER}" ]; then
  31. echo "Usage: `basename "${0}"` [folder] [min_size] [min_rate] [min_height] [name_regex]" 1>&2
  32. exit 1
  33. fi
  34. # Find large video files
  35. # Later tests exclude Handbrake-encoded files
  36. FILES="`find "${FOLDER}" -type f -maxdepth 1 -size "+${MIN_SIZE}" | grep -iE "${NAME_REGEX}"`"
  37. # Loop with newline-as-IFS
  38. OLDIFS="${IFS}"
  39. IFS=$'\n'
  40. for i in ${FILES}; do
  41. # Bail if the load is high
  42. if ! ~/bin/video/checkLoad.sh; then
  43. continue
  44. fi
  45. # Skip invalid files
  46. if [ -z "${i}" ] || [ ! -r "${i}" ] || basename "${i}" | grep -q '^\._'; then
  47. continue
  48. fi
  49. # We do not want to recode videos that we already encoded
  50. HANDBRAKE=0
  51. STRINGS="`head -c 10000000 "${i}" | strings -n 100`"
  52. if echo "${STRINGS}" | grep -q HandBrake; then
  53. HANDBRAKE=1
  54. elif echo "${STRINGS}" | grep -E '^x264 - core (79|112|120|125|129|130)' | grep -E 'threads=(12|24)' | grep -Eq 'crf=2[0-5]\.[0-9]'; then
  55. HANDBRAKE=1
  56. fi
  57. if [ $HANDBRAKE -eq 1 ]; then
  58. continue
  59. fi
  60. # We only care about "big" videos
  61. # Movies with no known height should be left alone
  62. # Movies with a "0" height can be assumed to be tall enough
  63. HEIGHT="`~/bin/video/movInfo.pl "${i}" VIDEO_HEIGHT 2>/dev/null`"
  64. if [ -z "${HEIGHT}" ]; then
  65. HEIGHT=1
  66. fi
  67. if [ $HEIGHT -eq 0 ]; then
  68. HEIGHT=$MIN_HEIGHT
  69. fi
  70. if [ $HEIGHT -lt $MIN_HEIGHT ]; then
  71. continue
  72. fi
  73. # Skip files is low bitrates
  74. SIZE="`stat -f %z "${i}" 2>/dev/null`"
  75. if [ -z "${SIZE}" ]; then
  76. SIZE=1
  77. fi
  78. LENGTH="`~/bin/video/movInfo.pl "${i}" LENGTH 2>/dev/null | sed 's%\..*$%%'`"
  79. if [ -z "${LENGTH}" ] || [ $LENGTH -eq 0 ]; then
  80. LENGTH=1
  81. fi
  82. RATE=$(( $SIZE / $LENGTH ))
  83. if [ $RATE -le $MIN_RATE ]; then
  84. continue
  85. fi
  86. # If we're still around, the file matched all criteria
  87. if [ $ZERO -gt 0 ]; then
  88. echo -en "${i}\0"
  89. else
  90. echo "${i}"
  91. fi
  92. done
  93. IFS="${OLDIFS}"