From f2ac2e5c530ee2d32d2c942277f034bcfd40c49e Mon Sep 17 00:00:00 2001 From: poprhythm Date: Tue, 8 Sep 2026 03:07:51 +0000 Subject: [PATCH] Add sonarr.sh monitor command for shows still actively airing Migrated shows default to unmonitored/no-search since they're back-catalog imports. For a show still marked "continuing" on TVDB (e.g. 3 Body Problem), this flips it (and all its seasons) to monitored so new episodes flow through the automated tv-sonarr pipeline instead of needing a manual scan/import each time one drops. --search optionally triggers an immediate missing-episode search. Claude-Session: https://claude.ai/code/session_01HZQK6jHmdTpFjFZM8FUnqA --- sonarr.sh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/sonarr.sh b/sonarr.sh index c9ad783..242b85f 100755 --- a/sonarr.sh +++ b/sonarr.sh @@ -138,6 +138,55 @@ for r in json.load(sys.stdin): " } +cmd_monitor() { + local series_id="${1:-}" + local do_search="${2:-}" + if [[ -z "$series_id" ]]; then + echo "Usage: $0 monitor [--search]" >&2 + echo " Flips a show from unmonitored (migration-only) to monitored - Sonarr will" >&2 + echo " pick up new episodes via the tv-sonarr qBittorrent category going forward." >&2 + echo " --search also triggers an immediate search for any missing episodes." >&2 + exit 1 + fi + + local series_json + series_json=$(api_get "series/$series_id") + local not_found + not_found=$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print('yes' if 'title' not in d else 'no')" "$series_json") + if [[ "$not_found" == "yes" ]]; then + echo "Error: no series with id $series_id (see: ./sonarr.sh list)" >&2 + exit 1 + fi + + local payload + payload=$(python3 -c " +import json, sys +s = json.loads(sys.argv[1]) +s['monitored'] = True +# Also monitor all seasons - a series-level monitored flag alone won't pull +# individual season/episode monitoring along with it. +for season in s.get('seasons', []): + season['monitored'] = True +print(json.dumps(s)) +" "$series_json") + + local response + response=$(api_put "series/$series_id" "$payload") + python3 -c " +import json, sys +d = json.loads(sys.argv[1]) +if 'message' in d and 'id' not in d: + print('Error:', d.get('message')) + sys.exit(1) +print(f\"Monitoring: {d['title']} ({d['year']}) - new episodes will auto-import via the tv-sonarr download client category.\") +" "$response" + + if [[ "$do_search" == "--search" ]]; then + api_post "command" "{\"name\": \"SeriesSearch\", \"seriesId\": $series_id}" > /dev/null + echo "Triggered a search for missing/upcoming episodes." + fi +} + cmd_scan() { local folder="${1:-}" if [[ -z "$folder" ]]; then @@ -302,6 +351,7 @@ case "$command" in add) cmd_add "${2:-}" "${3:-}" ;; list) cmd_list ;; rootfolders) cmd_rootfolders ;; + monitor) cmd_monitor "${2:-}" "${3:-}" ;; scan) cmd_scan "${2:-}" ;; import) cmd_import "${2:-}" ;; queue) cmd_queue ;; @@ -314,6 +364,9 @@ case "$command" in echo " add [root] Add show to Sonarr (unmonitored, no search)" echo " list List series already in Sonarr" echo " rootfolders List root folders + unmapped folder counts" + echo " monitor [--search] Switch a show to monitored (auto-import new" + echo " episodes via tv-sonarr going forward); --search" + echo " also searches now for anything missing" echo " scan Preview manual-import mapping for a raw folder" echo " import Scan + apply import (aborts if any file is unmatched)" echo " queue Show current download queue"