syncUnwatched.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #!/bin/bash
  2. # Parameters
  3. TARGET="Heady"
  4. BASE_DIR="`~/bin/video/mediaPath`/${TARGET}"
  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 TMPDIR
  24. if [ ! -d "${TMPDIR}" ]; then
  25. TMPDIR="`getconf DARWIN_USER_TEMP_DIR 2>/dev/null`"
  26. if [ ! -d "${TMPDIR}" ]; then
  27. TMPDIR="/var/tmp"
  28. fi
  29. if [ ! -d "${TMPDIR}" ]; then
  30. TMPDIR="/tmp"
  31. fi
  32. fi
  33. # Check and write the run file
  34. if [ -z "${NO_PID}" ]; then
  35. PID_FILE="${TMPDIR}/syncUnwatched.pid"
  36. if [ -f "${PID_FILE}" ]; then
  37. PID=`cat "${PID_FILE}"`
  38. if ps auwx | grep -v grep | grep "`basename "${0}"`" | grep -q "${PID}"; then
  39. if [ $DEBUG -gt 0 ]; then
  40. echo "Already running: ${PID}" 1>&2
  41. exit -1
  42. else
  43. exit 0
  44. fi
  45. fi
  46. fi
  47. echo $$ > "${PID_FILE}"
  48. fi
  49. # Construct directories
  50. DEST_DIR="${BASE_DIR}/${DIR}"
  51. # Figure out what we want
  52. FILES="`~/bin/video/sync/recentlyUnwatched.sh "${1}"`"
  53. # Ensure the input is sane
  54. if [ `echo "${FILES}" | wc -l` -lt 5 ]; then
  55. echo -e "Invalid sync file list:\n${FILE}" 1>&2
  56. exit -2
  57. fi
  58. # Figure out what we already have
  59. OLD_FILES="`find "${DEST_DIR}" -type f | sed "s%^${BASE_DIR}/%%"`"
  60. # Allow special files
  61. EXTRAS="`cat ~/.sync_extras`"
  62. IFS=$'\n'
  63. for i in $EXTRAS; do
  64. OLD_FILES="`echo "${OLD_FILES}" | grep -v "^${i}"`"
  65. done
  66. # Encode and allow any expected files
  67. IFS=$'\n'
  68. for i in $FILES; do
  69. if [ $DEBUG -gt 0 ]; then
  70. echo "Will encode: ${i}"
  71. fi
  72. if [ $NO_SYNC -eq 0 ]; then
  73. ~/bin/video/sync/sync.sh "${i}"
  74. fi
  75. nobase="`echo "${i}" | sed 's%\....$%%'`"
  76. OLD_FILES="`echo "${OLD_FILES}" | grep -v "${nobase}"`"
  77. done
  78. # Delete anything leftover
  79. IFS=$'\n'
  80. MIN_AGE="`date -v -1H +%s`"
  81. for i in $OLD_FILES; do
  82. # Skip files under 1H old to avoid churn and provide a no-delete signal for other conditions (e.g. filename encoding)
  83. STAT="`stat -f '%m' "${BASE_DIR}/${i}" 2>/dev/null`"
  84. if [ -z "${STAT}" ]; then
  85. STAT=1
  86. fi
  87. if [ $STAT -ge $MIN_AGE ]; then
  88. if [ $DEBUG -gt 0 ]; then
  89. echo "Will skip due to minimum age: ${BASE_DIR}/${i}"
  90. fi
  91. continue
  92. fi
  93. # Delete if set to sync
  94. if [ $DEBUG -gt 0 ]; then
  95. echo "Will delete: ${BASE_DIR}/${i}"
  96. fi
  97. if [ $NO_SYNC -eq 0 ]; then
  98. rm -f "${BASE_DIR}/${i}"
  99. fi
  100. done
  101. find "${DEST_DIR}" -type d -empty -delete
  102. # Cleanup
  103. if [ -n "${PID_FILE}" ]; then
  104. rm -f "${PID_FILE}"
  105. fi