PMSCheck.sh 2.0 KB

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