PMSCheck.sh 2.1 KB

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