76 lines
3.4 KiB
Bash
76 lines
3.4 KiB
Bash
#!/bin/bash
|
|
|
|
# Configuration
|
|
TAUTULLI_API_KEY="dad9bbb78bde43249754b630b58fbf7c" # Tautulli API Key
|
|
TAUTULLI_URL="http://10.0.0.10:8181/api/v2" # Tautulli URL
|
|
WAIT_SECONDS=180 # Wait time (in seconds) after killing the tdarr node
|
|
BASIC_CHECK=3 # Seconds check interval to check on Plex Transcode Status
|
|
CONTAINER_NAME="N4" # Exact name of your tdarr node container
|
|
|
|
# The total number of transcodes (local + remote) required to trigger Tdarr shutdown
|
|
TRANSCODE_THRESHOLD=3
|
|
|
|
# Function to check if Plex is transcoding via Tautulli
|
|
# Returns 0 (true) if total transcodes >= threshold, else returns 1 (false).
|
|
is_plex_transcoding_over_threshold() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking Plex activity via Tautulli API"
|
|
response=$(curl -s "${TAUTULLI_URL}?apikey=${TAUTULLI_API_KEY}&cmd=get_activity")
|
|
|
|
# Count local and remote transcoding sessions
|
|
local_count=$(echo "$response" | jq '[.response.data.sessions[]? | select(.transcode_decision == "transcode" and (.ip_address | startswith("10.0.0.")))] | length')
|
|
remote_count=$(echo "$response" | jq '[.response.data.sessions[]? | select(.transcode_decision == "transcode" and (.ip_address | startswith("10.0.0.") | not))] | length')
|
|
total_count=$(( local_count + remote_count ))
|
|
|
|
# Log counts
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Detected ${local_count} local and ${remote_count} remote transcoding session(s)."
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Total transcodes: ${total_count}, Threshold: ${TRANSCODE_THRESHOLD}"
|
|
|
|
# If total_count >= threshold, signal that we should kill Tdarr
|
|
if [ "$total_count" -ge "$TRANSCODE_THRESHOLD" ]; then
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Total transcodes >= threshold (${TRANSCODE_THRESHOLD})."
|
|
return 0
|
|
else
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Total transcodes below threshold. No kill."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to check if the container is running
|
|
is_container_running() {
|
|
state=$(docker inspect -f '{{.State.Running}}' "${CONTAINER_NAME}" 2>/dev/null)
|
|
if [ "$state" = "true" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
while true; do
|
|
# Check if total transcodes >= threshold
|
|
if is_plex_transcoding_over_threshold; then
|
|
# Ensure the container is not running
|
|
if is_container_running; then
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Killing Docker container ${CONTAINER_NAME} due to Plex transcode threshold."
|
|
docker kill "${CONTAINER_NAME}"
|
|
else
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - ${CONTAINER_NAME} is already stopped."
|
|
fi
|
|
|
|
# Wait before checking again
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Sleeping for ${WAIT_SECONDS} seconds..."
|
|
sleep "${WAIT_SECONDS}"
|
|
else
|
|
# If below threshold, ensure the container is running
|
|
if ! is_container_running; then
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting Docker container ${CONTAINER_NAME} since transcodes are below threshold."
|
|
docker start "${CONTAINER_NAME}"
|
|
else
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - ${CONTAINER_NAME} is already running, no action needed."
|
|
fi
|
|
|
|
# Sleep before next check
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Sleeping for ${BASIC_CHECK} seconds..."
|
|
sleep "${BASIC_CHECK}"
|
|
fi
|
|
done
|