#!/bin/bash # ============================================================================================== # ================================= Arr Cache Prefill =========================================== # ============================================================================================== # # PURPOSE # ───────────────────────────────────────────────────────────────────────────── # Populates the shared tracked-data cache (see arr_get_tracked_data() in common.sh) for # Lidarr, Sonarr, and Radarr once at array start, before any other script needs it. Without # this, each arr's cache stays cold from boot until whichever script happens to touch that # arr first writes through — which could be hours, depending on the daily schedule. One-shot: # runs and exits. Originally Lidarr-only (lidarr_cache_prefill.sh, 2026-07-16), generalized # the same day to cover all three arrs once the cache mechanism itself was generalized. # # ============================================================================================== # OPERATIONAL MODEL # ============================================================================================== # # Each arr's container may still be starting when this fires (array just started) — retries # reaching that arr's API for up to ARR_PREFILL_WAIT_MINUTES before giving up on it and moving # to the next. Not fatal if one never comes up in time; that arr's cache just stays cold until # the next script writes through naturally, exactly as it would without this script existing. # An arr not configured on this host (e.g. Lidarr is HOST1-only) is skipped cleanly. # # ============================================================================================== # CONFIGURATION # ============================================================================================== # # host*.conf # HOST1_LIDARR_URL / HOST1_LIDARR_API_KEY # HOST*_SONARR_URL / HOST*_SONARR_API_KEY # HOST*_RADARR_URL / HOST*_RADARR_API_KEY # All aliased by detect_hosts() # # master.conf # ARR_PREFILL_WAIT_MINUTES — how long to retry reaching each arr before giving up on it (default 10) # # ============================================================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../load_config.sh" parse_args "$@" if [[ "$EUID" -ne 0 ]]; then error "Must be run as root" exit 1 fi if ! command -v jq >/dev/null 2>&1; then warn "jq not found — skipping arr cache prefill" exit 0 fi acquire_lock detect_hosts WAIT_MINUTES="${ARR_PREFILL_WAIT_MINUTES:-10}" # Args: arr_type, url, api_key, api_version _prefill_one() { local arr_type="$1" url="$2" api_key="$3" api_version="$4" if [[ -z "$url" ]] || [[ -z "$api_key" ]]; then info "${arr_type^} not configured on $MY_ID ($LOCAL_SERVER_NAME) — nothing to prefill" return 0 fi local waited=0 until check_api "$url" "${arr_type^}" 5 >/dev/null 2>&1; do if [[ "$waited" -ge $(( WAIT_MINUTES * 60 )) ]]; then warn "${arr_type^} not reachable after ${WAIT_MINUTES}m — leaving cache cold, next script will write through" return 0 fi sleep 15 (( waited += 15 )) done local endpoint="${ARR_LIBRARY_ENDPOINT[$arr_type]:-}" if [[ -z "$endpoint" ]]; then warn "No library endpoint known for ${arr_type} — skipping" return 0 fi local items items=$(arr_api "$url" "$api_key" "$api_version" "$endpoint" "${arr_type^}") || { warn "Could not fetch ${arr_type} library for cache prefill — leaving cache cold" return 0 } if arr_cache_write "$arr_type" "$items"; then log "$ICON_DONE ${arr_type^} cache prefilled ($(echo "$items" | jq 'length') items)" else warn "Failed to write ${arr_type} cache prefill" fi } _prefill_one "lidarr" "${LIDARR_URL:-}" "${LIDARR_API_KEY:-}" "v1" _prefill_one "sonarr" "${SONARR_URL:-}" "${SONARR_API_KEY:-}" "v3" _prefill_one "radarr" "${RADARR_URL:-}" "${RADARR_API_KEY:-}" "v3" exit 0