From 4cdd1ef457fd8fc589a4760301be0ba5b8daa468 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 26 Dec 2024 15:06:12 +0800 Subject: [PATCH] ppp --- plexshowcleanup.py | 144 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 plexshowcleanup.py diff --git a/plexshowcleanup.py b/plexshowcleanup.py new file mode 100644 index 0000000..9d332d4 --- /dev/null +++ b/plexshowcleanup.py @@ -0,0 +1,144 @@ +#!/bin/bash +# Plex TV Shows Cleanup Script with Sonarr Integration for Unraid + +# Configuration +PLEX_TOKEN="uZn42JMVkQpyb_duFsvT" # Replace with your Plex API token +PLEX_SERVER_URL="https://192.168.50.111:32400" # Replace with your Plex server URL +TV_SHOWS_PATH="/mnt/user/stuff/videos/tvshows" # Replace with your TV shows directory path +SONARR_API_KEY="2537de37fded4874ae83da9cf3c14f34" # Replace with your Sonarr API key +SONARR_URL="http://192.168.50.111:8989" # Replace with your Sonarr server URL +SHOWS_LIST=("Agatha All Along" "Arcane") # Replace with your TV show names + +# Log File Configuration +LOG_DIR="/mnt/user/appdata/customlog" # Directory for log files +LOG_FILE="$LOG_DIR/plex_cleanup_$(date '+%Y-%m-%d').log" # Daily log file + +# Ensure dependencies +# command -v curl >/dev/null 2>&1 || { echo "curl is not installed. Exiting."; exit 1; } +# command -v jq >/dev/null 2>&1 || { echo "jq is not installed. Exiting."; exit 1; } + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Function to log messages +log() { + local message="$1" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a "$LOG_FILE" +} + +# Function to fetch the Plex library section ID for TV Shows +get_tv_shows_section_id() { + log "Fetching TV Shows section ID" + local plex_section_id + plex_section_id=$(curl -s -X GET "$PLEX_SERVER_URL/library/sections" -H "X-Plex-Token: $PLEX_TOKEN" | \ + jq -r '.MediaContainer.Directory[] | select(.type == "show") | .key') + + + if [[ -z "$plex_section_id" ]]; then + log "Could not find TV Shows section ID. Exiting." + exit 1 + fi + + echo "$plex_section_id" +} + +# Function to fetch watched status for a show +fetch_watched_episodes() { + local show_name="$1" + local plex_section_id="$2" + local show_id + local watched_episodes + + log "Fetching watched episodes for: $show_name" + + # Get the show ID for the specific show + show_id=$(curl -s -X GET "$PLEX_SERVER_URL/library/sections/$plex_section_id/all" -H "X-Plex-Token: $PLEX_TOKEN" | \ + jq -r ".MediaContainer.Metadata[] | select(.title == \"$show_name\") | .ratingKey") + + if [[ -z "$show_id" ]]; then + log "Could not find show ID for $show_name. Skipping." + return + fi + + # Fetch watched episodes for the specific show + watched_episodes=$(curl -s -X GET "$PLEX_SERVER_URL/library/metadata/$show_id/allLeaves" -H "X-Plex-Token: $PLEX_TOKEN" | \ + jq '.MediaContainer.Metadata[] | select(.viewCount != null) | .title') + + echo "$watched_episodes" +} + +# Function to delete old seasons and mark unmonitored in Sonarr +delete_and_unmonitor_seasons() { + local show_name="$1" + local show_path="$2" + + log "Processing directory: $show_path" + + for season_dir in "$show_path"/*; do + if [[ -d "$season_dir" ]]; then + season_name=$(basename "$season_dir") + + if [[ "$season_name" =~ ^Season[[:space:]][[:digit:]]+$ ]]; then + log "Deleting watched season: $season_name" + rm -rf "$season_dir" + + # Mark as unmonitored in Sonarr + season_number=$(echo "$season_name" | grep -oE '[0-9]+') + mark_unmonitored_in_sonarr "$show_name" "$season_number" + fi + fi + done +} + +# Function to mark a season as unmonitored in Sonarr +mark_unmonitored_in_sonarr() { + local show_name="$1" + local season_number="$2" + local series_id + local seasons_data + + log "Marking $show_name - Season $season_number as unmonitored in Sonarr." + + # Get the series ID + series_id=$(curl -s "$SONARR_URL/api/v3/series" -H "X-Api-Key: $SONARR_API_KEY" | \ + jq -r ".[] | select(.title==\"$show_name\") | .id") + + if [[ -z "$series_id" ]]; then + log "Could not find series ID for $show_name in Sonarr. Skipping." + return + fi + + # Fetch seasons data + seasons_data=$(curl -s "$SONARR_URL/api/v3/series/$series_id" -H "X-Api-Key: $SONARR_API_KEY") + + # Update the monitored status for the specific season + updated_seasons=$(echo "$seasons_data" | jq ".seasons | map(if .seasonNumber == $season_number then .monitored = false else . end)") + + # Send the updated data back to Sonarr + curl -s -X PUT "$SONARR_URL/api/v3/series/$series_id" \ + -H "X-Api-Key: $SONARR_API_KEY" \ + -H "Content-Type: application/json" \ + --data "$(echo "$seasons_data" | jq ".seasons = $updated_seasons")" > /dev/null + + log "Marked $show_name - Season $season_number as unmonitored in Sonarr." +} + +# Main Script Execution +log "Starting Plex TV Shows Cleanup with Sonarr Integration" + +plex_section_id=$(get_tv_shows_section_id) + +for show in "${SHOWS_LIST[@]}"; do + log "Checking show: $show" + watched=$(fetch_watched_episodes "$show" "$plex_section_id") + + if [[ "$watched" -gt 0 ]]; then + log "Show '$show' has watched episodes. Cleaning up..." + show_path="$TV_SHOWS_PATH/$show" + delete_and_unmonitor_seasons "$show" "$show_path" + else + log "No watched episodes for '$show'. Skipping cleanup." + fi +done + +log "Plex TV Shows Cleanup with Sonarr Integration completed"