syncUnwatched.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/bin/bash
  2. # Parameters
  3. MEDIA_PATH="`~/bin/video/mediaPath`"
  4. BASE_DIR="${MEDIA_PATH}/Sync"
  5. # Environmental parameters
  6. if [ "${DEBUG}" ]; then
  7. DEBUG=1
  8. else
  9. DEBUG=0
  10. fi
  11. if [ "${NO_SYNC}" ]; then
  12. NO_SYNC=1
  13. else
  14. NO_SYNC=0
  15. fi
  16. # Command-line options
  17. DIR="TV"
  18. if echo "${1}" | grep -qi "Movie"; then
  19. DIR="Movies"
  20. elif echo "${1}" | grep -qi "YouTube"; then
  21. DIR="YouTube"
  22. fi
  23. # Ensure we have a valid MEDIA_PATH
  24. if ! ~/bin/video/isMediaMounted && [ -z "${MEDIA_PATH}" ]; then
  25. if [ $DEBUG -gt 0 ]; then
  26. echo "Media path not available" 1>&2
  27. fi
  28. exit 0
  29. fi
  30. # Ensure we have a valid TMPDIR
  31. if [ ! -d "${TMPDIR}" ]; then
  32. TMPDIR="`getconf DARWIN_USER_TEMP_DIR 2>/dev/null`"
  33. if [ ! -d "${TMPDIR}" ]; then
  34. TMPDIR="/var/tmp"
  35. fi
  36. if [ ! -d "${TMPDIR}" ]; then
  37. TMPDIR="/tmp"
  38. fi
  39. fi
  40. # Check and write the run file
  41. if [ -z "${NO_PID}" ]; then
  42. PID_FILE="${TMPDIR}/syncUnwatched.pid"
  43. if [ -f "${PID_FILE}" ]; then
  44. PID=`cat "${PID_FILE}"`
  45. if ps auwx | grep -v grep | grep "`basename "${0}"`" | grep -q "${PID}"; then
  46. if [ $DEBUG -gt 0 ]; then
  47. echo "Already running: ${PID}" 1>&2
  48. exit -1
  49. else
  50. exit 0
  51. fi
  52. fi
  53. fi
  54. echo $$ > "${PID_FILE}"
  55. fi
  56. # Construct directories
  57. DEST_DIR="${BASE_DIR}/${DIR}"
  58. # Figure out what we want
  59. FILES="`~/bin/video/sync/recentlyUnwatched.sh "${1}"`"
  60. # Ensure the input is sane
  61. if [ `echo "${FILES}" | wc -l` -lt 5 ]; then
  62. echo -e "Invalid sync file list:\n${FILE}" 1>&2
  63. exit -2
  64. fi
  65. # Figure out what we already have
  66. OLD_FILES="`find "${DEST_DIR}" -type f | sed "s%^${BASE_DIR}/%%"`"
  67. # Always include special files
  68. IFS=$'\n'
  69. for i in `cat ~/.sync_extras`; do
  70. # Skip comments and empty lines
  71. if [[ "${i}" =~ ^# ]] || [[ "${i}" =~ ^$ ]]; then
  72. continue
  73. fi
  74. # Skip files not inside $DIR
  75. if ! [[ "${i}" =~ ^${DIR} ]]; then
  76. if [ $DEBUG -gt 0 ]; then
  77. echo "Skipping sync_extra from alternate path: ${i}" 1>&2
  78. fi
  79. continue
  80. fi
  81. # Sync anything else that matches
  82. ~/bin/video/sync/sync.sh "${MEDIA_PATH}/${i}"*
  83. OLD_FILES="`echo "${OLD_FILES}" | grep -v "^${i}"`"
  84. done
  85. # Encode and allow any expected files
  86. IFS=$'\n'
  87. for i in $FILES; do
  88. FILE="${MEDIA_PATH}/${i}"
  89. # Give up if the media path goes away
  90. if ! ~/bin/video/isMediaMounted; then
  91. exit
  92. fi
  93. # Skip if the input file does not exist
  94. if [ ! -r "${FILE}" ]; then
  95. if [ $DEBUG -gt 0 ]; then
  96. echo "Missing input path: ${FILE}" 1>&2
  97. fi
  98. continue
  99. fi
  100. # Recode
  101. if [ $DEBUG -gt 0 ]; then
  102. echo "Will encode: ${i}" 1>&2
  103. fi
  104. if [ $NO_SYNC -eq 0 ]; then
  105. ~/bin/video/sync/sync.sh "${i}"
  106. fi
  107. # Drop from our delete files list
  108. nobase="`echo "${i}" | sed 's%\....$%%'`"
  109. OLD_FILES="`echo "${OLD_FILES}" | grep -v "${nobase}"`"
  110. done
  111. # Delete anything leftover
  112. IFS=$'\n'
  113. MIN_AGE="`date -v -1H +%s`"
  114. for i in $OLD_FILES; do
  115. FILE="${BASE_DIR}/${i}"
  116. # Skip if the input file does not exist
  117. if [ ! -r "${FILE}" ]; then
  118. if [ $DEBUG -gt 0 ]; then
  119. echo "Missing delete path: ${i}" 1>&2
  120. fi
  121. continue
  122. fi
  123. # Skip tvshow.nfo and poster.* if other files exist in the directory
  124. NOEXT="`basename "${FILE}" | sed 's%\....$%%'`"
  125. if [ "${NOEXT}" == "tvshow" ] || [ "${NOEXT}" == "poster" ]; then
  126. DIRNAME="`dirname "${FILE}"`"
  127. if ls "${DIRNAME}" | grep -v 'tvshow\.nfo$' | grep -qv 'poster\....$'; then
  128. if [ $DEBUG -gt 0 ]; then
  129. echo "Skipping active metadata file: ${FILE}" 1>&2
  130. fi
  131. continue
  132. else
  133. if [ $DEBUG -gt 0 ]; then
  134. echo "Inactive metadata file: ${FILE}" 1>&2
  135. fi
  136. fi
  137. fi
  138. # Skip files under 1H old to avoid churn and provide a no-delete signal for other conditions (e.g. filename encoding)
  139. STAT="`stat -f '%m' "${FILE}" 2>/dev/null`"
  140. if [ -z "${STAT}" ]; then
  141. STAT=1
  142. fi
  143. if [ $STAT -ge $MIN_AGE ]; then
  144. if [ $DEBUG -gt 0 ]; then
  145. echo "Will skip due to minimum age: ${FILE}" 1>&2
  146. fi
  147. continue
  148. fi
  149. # Delete, unless set NOT to sync
  150. if [ $DEBUG -gt 0 ]; then
  151. echo "Will delete: ${BASE_DIR}/${i}" 1>&2
  152. fi
  153. if [ $NO_SYNC -eq 0 ]; then
  154. rm -f "${FILE}"
  155. fi
  156. done
  157. find "${DEST_DIR}" -type d -empty -delete
  158. # Cleanup
  159. if [ -n "${PID_FILE}" ]; then
  160. rm -f "${PID_FILE}"
  161. fi