From e6a6bfd5e9de466f9ef2f3b0ed7d33d7ce45bb01 Mon Sep 17 00:00:00 2001 From: FailedProxy Date: Sun, 26 Apr 2026 01:19:32 -0400 Subject: [PATCH] update radar and sonarr enpoints --- Master.conf | 7 +++++-- Media/radarr_cleanup.sh | 36 ++++++++++++++++++++++++++++++------ Media/sonarr_cleanup.sh | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/Master.conf b/Master.conf index 68502fa..34fda31 100644 --- a/Master.conf +++ b/Master.conf @@ -895,8 +895,11 @@ MEDIA_FILE_PATTERNS=( # Protected patterns are NEVER deleted — cover art, metadata, subtitles generated by the arr # are not included in the tracked file API response but must not be deleted. # -# API versions: Sonarr v4 → /api/v3/ Radarr v6 → /api/v3/ Lidarr v3 → /api/v1/ -# Lidarr runs on HOST1 only. +# API versions and endpoint patterns: +# Sonarr v4 → /api/v3/series (get IDs) → /api/v3/episodefile?seriesId=X per series +# Radarr v5 → /api/v3/movie (get IDs) → /api/v3/moviefile?movieId=X per movie +# Lidarr v3 → /api/v1/artist (get IDs) → /api/v1/trackFile?artistId=X per artist +# All require per-ID loops — bulk endpoints removed in newer versions # ── Lidarr ──────────────────────────────────────────────────────────────────────────────────── HOST1_LIDARR_URL="http://192.168.50.2:8686" diff --git a/Media/radarr_cleanup.sh b/Media/radarr_cleanup.sh index 2390ac1..a04f7a5 100644 --- a/Media/radarr_cleanup.sh +++ b/Media/radarr_cleanup.sh @@ -212,21 +212,45 @@ check_api "$RADARR_URL" "Radarr" || { info "Querying Radarr API: $RADARR_URL" -MOVIEFILE_RESPONSE=$(radarr_api "moviefile") || { - error "Failed to fetch movie files from Radarr — check URL and API key" +# Step 1 — get all movies to extract IDs +MOVIES_RESPONSE=$(radarr_api "movie") || { + error "Failed to fetch movies from Radarr — check URL and API key" notify "Radarr cleanup failed on $(hostname) — API unreachable" "Radarr Cleanup" "warning" exit 1 } +MOVIE_IDS=$(echo "$MOVIES_RESPONSE" | jq -r '.[].id' 2>/dev/null) +MOVIE_COUNT=$(echo "$MOVIE_IDS" | grep -c . 2>/dev/null || echo 0) +info "Movies in Radarr: $MOVIE_COUNT" + +if [[ "$MOVIE_COUNT" -eq 0 ]]; then + warn "No movies returned from Radarr — aborting to prevent mass deletion" + notify "Radarr cleanup aborted on $(hostname) — no movies returned from API" "Radarr Cleanup" "warning" + exit 1 +fi + TMP_DIR="/tmp/radarr_cleanup_$$" mkdir -p "$TMP_DIR" trap "rm -rf $TMP_DIR" EXIT TRACKED_FILE="$TMP_DIR/tracked_paths.txt" -while IFS= read -r api_path; do - [[ -z "$api_path" ]] && continue - translate_path "$api_path" >> "$TRACKED_FILE" -done < <(echo "$MOVIEFILE_RESPONSE" | jq -r '.[].path' 2>/dev/null) +> "$TRACKED_FILE" + +# Step 2 — get movie files per movie ID +MOVIE_INDEX=0 +while IFS= read -r movie_id; do + [[ -z "$movie_id" ]] && continue + ((MOVIE_INDEX++)) + [[ $(( MOVIE_INDEX % 100 )) -eq 0 ]] && info "Fetching files: $MOVIE_INDEX/$MOVIE_COUNT movies..." + MOVIE_FILES=$(radarr_api "moviefile?movieId=${movie_id}" 2>/dev/null) + if [[ -n "$MOVIE_FILES" ]]; then + while IFS= read -r api_path; do + [[ -z "$api_path" ]] && continue + translate_path "$api_path" >> "$TRACKED_FILE" + done < <(echo "$MOVIE_FILES" | jq -r '.[].path // .path' 2>/dev/null) + fi +done <<< "$MOVIE_IDS" + sort -u "$TRACKED_FILE" -o "$TRACKED_FILE" TRACKED_COUNT=$(wc -l < "$TRACKED_FILE") diff --git a/Media/sonarr_cleanup.sh b/Media/sonarr_cleanup.sh index 90b4bcd..f722cbd 100644 --- a/Media/sonarr_cleanup.sh +++ b/Media/sonarr_cleanup.sh @@ -212,21 +212,45 @@ check_api "$SONARR_URL" "Sonarr" || { info "Querying Sonarr API: $SONARR_URL" -EPISODEFILE_RESPONSE=$(sonarr_api "episodefile") || { - error "Failed to fetch episode files from Sonarr — check URL and API key" +# Step 1 — get all series to extract IDs +SERIES_RESPONSE=$(sonarr_api "series") || { + error "Failed to fetch series from Sonarr — check URL and API key" notify "Sonarr cleanup failed on $(hostname) — API unreachable" "Sonarr Cleanup" "warning" exit 1 } +SERIES_IDS=$(echo "$SERIES_RESPONSE" | jq -r '.[].id' 2>/dev/null) +SERIES_COUNT=$(echo "$SERIES_IDS" | grep -c . 2>/dev/null || echo 0) +info "Series in Sonarr: $SERIES_COUNT" + +if [[ "$SERIES_COUNT" -eq 0 ]]; then + warn "No series returned from Sonarr — aborting to prevent mass deletion" + notify "Sonarr cleanup aborted on $(hostname) — no series returned from API" "Sonarr Cleanup" "warning" + exit 1 +fi + TMP_DIR="/tmp/sonarr_cleanup_$$" mkdir -p "$TMP_DIR" trap "rm -rf $TMP_DIR" EXIT TRACKED_FILE="$TMP_DIR/tracked_paths.txt" -while IFS= read -r api_path; do - [[ -z "$api_path" ]] && continue - translate_path "$api_path" >> "$TRACKED_FILE" -done < <(echo "$EPISODEFILE_RESPONSE" | jq -r '.[].path' 2>/dev/null) +> "$TRACKED_FILE" + +# Step 2 — get episode files per series ID +SERIES_INDEX=0 +while IFS= read -r series_id; do + [[ -z "$series_id" ]] && continue + ((SERIES_INDEX++)) + [[ $(( SERIES_INDEX % 50 )) -eq 0 ]] && info "Fetching files: $SERIES_INDEX/$SERIES_COUNT series..." + SERIES_FILES=$(sonarr_api "episodefile?seriesId=${series_id}" 2>/dev/null) + if [[ -n "$SERIES_FILES" ]]; then + while IFS= read -r api_path; do + [[ -z "$api_path" ]] && continue + translate_path "$api_path" >> "$TRACKED_FILE" + done < <(echo "$SERIES_FILES" | jq -r '.[].path' 2>/dev/null) + fi +done <<< "$SERIES_IDS" + sort -u "$TRACKED_FILE" -o "$TRACKED_FILE" TRACKED_COUNT=$(wc -l < "$TRACKED_FILE")