PMSCheck.sh 1.9 KB

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