PMSCheck.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/bin/bash
  2. # Config
  3. CURL_TIMEOUT=15
  4. RESTART_DELAY=300
  5. PMS_URL="http://localhost:32400/"
  6. UNWATCHED_SECTION="2"
  7. UNWATCHED_SLEEP=60
  8. UNWATCHED_RETRIES=5
  9. UNWATCHED_TIMEOUT_FACTOR=2
  10. MIN_UNWATCHED_COUNT=10
  11. ADMIN_EMAIL="zach@kotlarek.com"
  12. # Heady allows 0 unwatched
  13. if hostname | grep -qi heady; then
  14. MIN_UNWATCHED_COUNT=0
  15. fi
  16. # Command-line config
  17. LOOP=-1
  18. if [ "${1}" ]; then
  19. LOOP="${1}"
  20. fi
  21. # Run at least once, loop if requested
  22. while [ $LOOP -ne 0 ]; do
  23. # State tracking
  24. FAILED=""
  25. # Ensure the media share is mounted
  26. if [ -z "${FAILED}" ]; then
  27. if ! ~/bin/video/isMediaMounted; then
  28. FAILED="Media share not mounted"
  29. fi
  30. fi
  31. # Ask Plex for the top-level status page
  32. if [ -z "${FAILED}" ]; then
  33. PAGE="`curl --silent --max-time "${CURL_TIMEOUT}" "${PMS_URL}"`"
  34. if [ -z "${PAGE}" ]; then
  35. FAILED="HTTP timeout"
  36. else
  37. UPDATE="`echo "${PAGE}" | grep 'updatedAt=' | sed 's%^.*updatedAt="\([0-9]*\)".*$%\1%'`"
  38. if [ -z "${UPDATE}" ]; then
  39. FAILED="Invalid update timestamp on status page"
  40. fi
  41. fi
  42. fi
  43. # Ask Plex for a list of unwatched TV series
  44. UNWATCHED_TIMEOUT=$(( $CURL_TIMEOUT * $UNWATCHED_TIMEOUT_FACTOR ))
  45. if [ -z "${FAILED}" ]; then
  46. UNWATCHED_URL="${PMS_URL}library/sections/${UNWATCHED_SECTION}/unwatched"
  47. TRY=1
  48. FAILED="Too few unwatched series"
  49. while [ $TRY -le $UNWATCHED_RETRIES ] && [ -n "${FAILED}" ]; do
  50. TRY=$(( $TRY + 1 ))
  51. PAGE="`curl --silent --max-time "${UNWATCHED_TIMEOUT}" "${UNWATCHED_URL}"`"
  52. COUNT="`echo "${PAGE}" | grep '</Directory>' | wc -l`"
  53. if [ $COUNT -ge $MIN_UNWATCHED_COUNT ]; then
  54. FAILED=""
  55. else
  56. sleep $UNWATCHED_SLEEP
  57. FAILED="${FAILED} ${COUNT}"
  58. UNWATCHED_TIMEOUT=$(( $UNWATCHED_TIMEOUT + $(( $CURL_TIMEOUT * $UNWATCHED_TIMEOUT_FACTOR )) ))
  59. fi
  60. done
  61. fi
  62. # If Plex has failed kill it
  63. if [ -n "${FAILED}" ]; then
  64. ERR_MSG="PMS is non-responsive (${FAILED}). Killing..."
  65. echo "${ERR_MSG}" 1>&2
  66. ~/bin/video/pms/killPMS.sh
  67. if [ $LOOP -lt 1 ]; then
  68. exit 1
  69. elif [ -n "${ADMIN_EMAIL}" ]; then
  70. echo -e "Subject: PMS Restart\n\n${ERR_MSG}" | sendmail "${ADMIN_EMAIL}"
  71. fi
  72. # Give plex a breather to get restarted before we check again
  73. sleep "${RESTART_DELAY}"
  74. # Re-index (in the background)
  75. ~/bin/video/pms/optimize.sh &
  76. # If Plex was super slow, optimize it
  77. elif [ $UNWATCHED_TIMEOUT -gt $(( $CURL_TIMEOUT * $UNWATCHED_TIMEOUT_FACTOR * $(( $UNWATCHED_RETRIES / 2 )) )) ]; then
  78. ERR_MSG="PMS is slow (${UNWATCHED_TIMEOUT}). Optimizing..."
  79. echo "${ERR_MSG}" 1>&2
  80. # Re-index (in the background)
  81. ~/bin/video/pms/optimize.sh &
  82. fi
  83. # Sleep for the next loop or exit
  84. if [ $LOOP -gt 0 ]; then
  85. sleep $LOOP
  86. else
  87. exit 0
  88. fi
  89. done