findRecode.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #!/bin/bash
  2. # Parameters
  3. FOLDER="`~/bin/video/mediaPath`"
  4. if [ -z "${MIN_RATE}" ]; then
  5. MIN_RATE=275000
  6. fi
  7. if [ -z "${MIN_SIZE}" ]; then
  8. MIN_SIZE="425M"
  9. fi
  10. if [ -z "${MIN_HEIGHT}" ]; then
  11. MIN_HEIGHT=500
  12. fi
  13. if [ -z "${NAME_REGEX}" ]; then
  14. NAME_REGEX="\.(mov|avi|mkv|mp4|ts|mpg|mpeg|m4v)$"
  15. fi
  16. if [ -z "${CODEC_REGEX}" ]; then
  17. CODEC_REGEX='^(x264|Nx265)'
  18. fi
  19. if [ -z "${CODEC_BUILD_REGEX}" ]; then
  20. CODEC_BUILD_REGEX='^(x264 - core (79|112|120|125|129|130|142|148)|Nx265 \(build 95\))'
  21. fi
  22. SCAN_DEPTH_FAST=10
  23. SCAN_DEPTH_SLOW=100
  24. # Standard overrides for the current official archive format
  25. if [ -n "${FULL_ARCHIVE}" ]; then
  26. MIN_SIZE=50M
  27. MIN_RATE=100
  28. MIN_HEIGHT=100
  29. CODEC_BUILD_REGEX='Nx265 \(build 95\)'
  30. # Don't set the codec regex so we get faster scans against
  31. # things that we did encode but aren't in the archive format
  32. #CODEC_REGEX='^Nx265'
  33. fi
  34. # Command-line overrides
  35. if [ -n "${1}" ]; then
  36. FOLDER="${1}"
  37. fi
  38. if [ -n "${2}" ]; then
  39. MIN_SIZE="${2}"
  40. echo "Deprecated: MIN_SIZE" 1>&2
  41. fi
  42. if [ -n "${3}" ]; then
  43. MIN_RATE="${3}"
  44. echo "Deprecated: MIN_RATE" 1>&2
  45. fi
  46. if [ -n "${4}" ]; then
  47. MIN_HEIGHT="${4}"
  48. echo "Deprecated: MIN_HEIGHT" 1>&2
  49. fi
  50. if [ -n "${5}" ]; then
  51. NAME_REGEX="${5}"
  52. echo "Deprecated: NAME_REGEX" 1>&2
  53. fi
  54. # Name-based paramters
  55. ZERO=0
  56. if basename "${0}" | grep -q '0'; then
  57. ZERO=1
  58. fi
  59. # Sanity check
  60. if [ ! -d "${FOLDER}" ]; then
  61. echo "Usage: `basename "${0}"` [folder]" 1>&2
  62. exit 1
  63. fi
  64. # Derived parameters
  65. LAST_RECODE_FILE="`(cd "${FOLDER}" && pwd)`/.lastFindRecode"
  66. # Environmental parameters
  67. if [ -n "${NO_LAST_RECODE_FILE}" ]; then
  68. LAST_RECODE_FILE=""
  69. fi
  70. # Find large video files that match the regex filter
  71. FILES="`find "${FOLDER}" -maxdepth 1 -type f -size "+${MIN_SIZE}" | grep -iE "${NAME_REGEX}"`"
  72. # Record the last scan start time, in a temp file
  73. LAST_RECODE_TMP=""
  74. if [ -n "${LAST_RECODE_FILE}" ]; then
  75. LAST_RECODE_TMP="`mktemp "${LAST_RECODE_FILE}.XXXXXX" 2>/dev/null`"
  76. fi
  77. # Loop with newline-as-IFS
  78. OLDIFS="${IFS}"
  79. IFS=$'\n'
  80. for i in ${FILES}; do
  81. # Skip invalid files
  82. if [ -z "${i}" ] || [ ! -r "${i}" ] || basename "${i}" | grep -q '^\._'; then
  83. continue
  84. fi
  85. # Skip files older than the LAST_RECODE_FILE mtime
  86. if [ -n "${LAST_RECODE_FILE}" ] && [ -f "${LAST_RECODE_FILE}" ] && [ "${i}" -ot "${LAST_RECODE_FILE}" ]; then
  87. continue
  88. fi
  89. # Find the x264/Nx265 header, if present. Scan deeper if the fast scan fails.
  90. STRINGS="`head -c $(( $SCAN_DEPTH_FAST * 1024 * 1024 )) "${i}" | strings -n 100`"
  91. if ! echo "${STRINGS}" | grep -Eq "${CODEC_REGEX}"; then
  92. STRINGS="`head -c $(( $SCAN_DEPTH_SLOW * 1024 * 1024 )) "${i}" | strings -n 100`"
  93. fi
  94. # Check for our particular HandBrake parameters
  95. HANDBRAKE=0
  96. if echo "${STRINGS}" | grep -Eq 'crf=2[0-5]\.[0-9]'; then
  97. if echo "${STRINGS}" | grep -Eq "${CODEC_BUILD_REGEX}"; then
  98. HANDBRAKE=1
  99. fi
  100. elif echo "${STRINGS}" | grep -q HandBrake; then
  101. echo "Matched literal 'HandBrake': ${i}" 1>&2
  102. HANDBRAKE=1
  103. fi
  104. # We do not want to recode videos that we already encoded
  105. if [ $HANDBRAKE -eq 1 ]; then
  106. continue
  107. fi
  108. # We only care about "big" videos
  109. # Movies with no known height should be left alone
  110. # Movies with a "0" height can be assumed to be tall enough
  111. HEIGHT="`~/bin/video/movInfo.pl "${i}" VIDEO_HEIGHT 2>/dev/null`"
  112. if [ -z "${HEIGHT}" ]; then
  113. HEIGHT=1
  114. fi
  115. if [ $HEIGHT -eq 0 ]; then
  116. HEIGHT=$MIN_HEIGHT
  117. fi
  118. if [ $HEIGHT -lt $MIN_HEIGHT ]; then
  119. continue
  120. fi
  121. # Skip files with low bitrates
  122. SIZE="`stat -f %z "${i}" 2>/dev/null`"
  123. if [ -z "${SIZE}" ]; then
  124. SIZE=1
  125. fi
  126. LENGTH="`~/bin/video/movInfo.pl "${i}" LENGTH 2>/dev/null | sed 's%\..*$%%'`"
  127. if [ -z "${LENGTH}" ] || [ $LENGTH -eq 0 ]; then
  128. LENGTH=1
  129. fi
  130. RATE=$(( $SIZE / $LENGTH ))
  131. if [ $RATE -le $MIN_RATE ]; then
  132. continue
  133. fi
  134. # If we're still around, the file matched all criteria
  135. if [ $ZERO -gt 0 ]; then
  136. echo -en "${i}\0"
  137. else
  138. echo "${i}"
  139. fi
  140. done
  141. IFS="${OLDIFS}"
  142. # Move the temporary timestamp file into place
  143. if [ -n "${LAST_RECODE_TMP}" ]; then
  144. mv "${LAST_RECODE_TMP}" "${LAST_RECODE_FILE}"
  145. fi