PMSCheck.sh 3.1 KB

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