From 9c05692a24ee927299e61822a416e8a8f610274a Mon Sep 17 00:00:00 2001 From: Gmer4Lfe Date: Fri, 17 Jul 2026 12:20:23 -0400 Subject: [PATCH] =?UTF-8?q?Include=20reverse-kids-leak=20in=20--move=20?= =?UTF-8?q?=E2=80=94=20it's=20not=20actually=20a=20judgment=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unlike reverse-anime-leak (deliberate style placements like Castlevania are common and valid there), reverse-kids-leak's signal is specifically "adult certification with zero Family/Animation genre" — confirmed live the 4 titles it catches (Addams Family, Saving Mr. Banks, Dark Shadows, The DUFF) are all genuinely non-kids content. Moves them to the new RADARR_GENERAL_ROOT config var (container-path literal for the general Movies root, needed since RADARR_MOVIES_ROOT is a filesystem path). --- Arrs_Stack/radarr_classification_scan.sh | 31 +++++++++++++++++++----- Deployment/host.conf.template | 1 + common.sh | 1 + 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Arrs_Stack/radarr_classification_scan.sh b/Arrs_Stack/radarr_classification_scan.sh index dfc656b..c2ee486 100755 --- a/Arrs_Stack/radarr_classification_scan.sh +++ b/Arrs_Stack/radarr_classification_scan.sh @@ -149,6 +149,7 @@ if [[ "$SHOW_STATUS" == true ]]; then echo "$ICON_HOST Identity: $MY_ID ($LOCAL_SERVER_NAME)" echo "$ICON_GEAR Radarr URL: $RADARR_URL" echo "$ICON_GEAR Movies root: $RADARR_MOVIES_ROOT" + echo "$ICON_GEAR General root: ${RADARR_GENERAL_ROOT:-}" echo "$ICON_GEAR Kids root: ${RADARR_KIDS_ROOT:-}" echo "$ICON_GEAR Anime root: ${RADARR_ANIME_ROOT:-}" echo "$ICON_GEAR Anime studios: ${#RADARR_ANIME_STUDIOS[@]} curated" @@ -335,10 +336,12 @@ fi # ============================================================================================== # ━━━ Move Mode ━━━ # ============================================================================================== -# Acts only on FORWARD misplacements (clear-cut: classified anime/kids, sitting in the wrong -# root) and never on REVERSE leaks (those are judgment calls — deliberate style placements -# like Castlevania/Legend of Korra live there, so they're report-only) or JUNK (those need -# removal from Radarr, not a file move — nothing to move for a hasFile=false entry). +# Acts on FORWARD misplacements (clear-cut: classified anime/kids, sitting in the wrong root) +# and on REVERSE-KIDS leaks (adult certification with zero Family/Animation genre sitting in +# the kids root — also clear-cut, moved back to RADARR_GENERAL_ROOT). Does NOT act on +# REVERSE-ANIME leaks — those are genuine judgment calls, since deliberate style placements +# like Castlevania/Legend of Korra legitimately live in the anime root without matching the +# anime signal — or on JUNK (those need removal from Radarr, not a file move). # # One movie at a time, verified after each, matching the lesson learned doing this by hand # for Sonarr earlier: a rapid-fire batch of moves raced Radarr's own file-move worker and @@ -361,7 +364,14 @@ if [[ "$MOVE_MODE" == true ]]; then # whenever it does find a release) and kick off an immediate search rather than waiting # for the next scheduled one. Junk entries are still excluded entirely — nothing to # search for there, they need removal instead. - MOVE_TARGETS=$(echo "$RESULTS" | jq -c '[.[] | select((.forward_anime_miss or .forward_kids_miss) and (.is_junk | not))]') + # + # reverse_kids_leak is included here (unlike reverse_anime_leak) because its signal is + # specifically "adult certification with zero Family/Animation genre" — there's no + # legitimate stylistic reason for that combination to sit in a curated kids library, unlike + # the anime side where deliberate style placements (Castlevania, Legend of Korra) are + # common and valid. Confirmed live: the 4 titles this caught (The Addams Family, Saving + # Mr. Banks, Dark Shadows, The DUFF) are all genuinely non-kids content, not judgment calls. + MOVE_TARGETS=$(echo "$RESULTS" | jq -c '[.[] | select((.forward_anime_miss or .forward_kids_miss or .reverse_kids_leak) and (.is_junk | not))]') MOVE_COUNT=$(echo "$MOVE_TARGETS" | jq 'length') if [[ "$MOVE_COUNT" -eq 0 ]]; then @@ -379,11 +389,20 @@ if [[ "$MOVE_MODE" == true ]]; then id=$(echo "$item" | jq -r '.id') title=$(echo "$item" | jq -r '.title') is_anime_flag=$(echo "$item" | jq -r '.is_anime') + is_forward_kids=$(echo "$item" | jq -r '.forward_kids_miss') had_file=$(echo "$item" | jq -r '.hasFile') if [[ "$is_anime_flag" == "true" ]]; then target_root="$RADARR_ANIME_ROOT" - else + elif [[ "$is_forward_kids" == "true" ]]; then target_root="$RADARR_KIDS_ROOT" + else + target_root="$RADARR_GENERAL_ROOT" + fi + + if [[ -z "$target_root" ]]; then + error " ✗ $title — target root not configured (RADARR_GENERAL_ROOT blank), skipping" + (( FAILED++ )) + continue fi # RESULTS only carries the reduced report fields — Radarr's PUT expects the complete diff --git a/Deployment/host.conf.template b/Deployment/host.conf.template index 0ac0c18..b9680a0 100644 --- a/Deployment/host.conf.template +++ b/Deployment/host.conf.template @@ -448,6 +448,7 @@ HOSTN_RADARR_API_KEY="" HOSTN_TMDB_API_KEY="" HOSTN_RADARR_MOVIES_ROOT="/mnt/user/Movies" + HOSTN_RADARR_GENERAL_ROOT="" # rootFolderPath literal for the general root (e.g. "/movies") — target for reverse-kids-leak moves; leave blank to disable HOSTN_RADARR_KIDS_ROOT="" # rootFolderPath literal, as reported by Radarr API — leave blank if no dedicated kids root HOSTN_RADARR_ANIME_ROOT="" # rootFolderPath literal, as reported by Radarr API — leave blank if no dedicated anime root diff --git a/common.sh b/common.sh index 7c09e76..1534b37 100755 --- a/common.sh +++ b/common.sh @@ -593,6 +593,7 @@ detect_hosts() { RADARR_URL_VAR="${MY_ID}_RADARR_URL"; RADARR_URL="${!RADARR_URL_VAR:-}" RADARR_API_KEY_VAR="${MY_ID}_RADARR_API_KEY"; RADARR_API_KEY="${!RADARR_API_KEY_VAR:-}" RADARR_MOVIES_ROOT_VAR="${MY_ID}_RADARR_MOVIES_ROOT"; RADARR_MOVIES_ROOT="${!RADARR_MOVIES_ROOT_VAR:-}" + RADARR_GENERAL_ROOT_VAR="${MY_ID}_RADARR_GENERAL_ROOT"; RADARR_GENERAL_ROOT="${!RADARR_GENERAL_ROOT_VAR:-}" RADARR_KIDS_ROOT_VAR="${MY_ID}_RADARR_KIDS_ROOT"; RADARR_KIDS_ROOT="${!RADARR_KIDS_ROOT_VAR:-}" RADARR_ANIME_ROOT_VAR="${MY_ID}_RADARR_ANIME_ROOT"; RADARR_ANIME_ROOT="${!RADARR_ANIME_ROOT_VAR:-}" RADARR_RECOVERY_VAR="${MY_ID}_RADARR_RECOVERY"; RADARR_RECOVERY="${!RADARR_RECOVERY_VAR:-true}"