{ config, lib, pkgs, ... }: let # Script that extracts API keys from all services and writes /etc/homepage-secrets extractSecrets = pkgs.writeShellScript "extract-homepage-secrets" '' set -euo pipefail SECRETS_FILE="/etc/homepage-secrets" # --- *arr apps: API keys live in config.xml as ... --- extract_arr_key() { local name="$1" path="$2" if [ -f "$path" ]; then ${pkgs.gnused}/bin/sed -n 's/.*\(.*\)<\/ApiKey>.*/\1/p' "$path" fi } SONARR_KEY=$(extract_arr_key "sonarr" "/var/lib/sonarr/config.xml") RADARR_KEY=$(extract_arr_key "radarr" "/var/lib/radarr/config.xml") PROWLARR_KEY=$(extract_arr_key "prowlarr" "/var/lib/prowlarr/config.xml") # --- Bazarr: API key in config.ini under [auth] section --- BAZARR_KEY="" if [ -f "/var/lib/bazarr/data/config/config.ini" ]; then BAZARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=apikey = ).*' /var/lib/bazarr/data/config/config.ini || true) fi # Fallback: Bazarr sometimes stores it in config.yaml if [ -z "$BAZARR_KEY" ] && [ -f "/var/lib/bazarr/config/config.yaml" ]; then BAZARR_KEY=$(${pkgs.gnugrep}/bin/grep -oP '(?<=apikey: ).*' /var/lib/bazarr/config/config.yaml || true) fi # --- Jellyfin: create an API key in the DB if one doesn't exist --- JELLYFIN_KEY="" JELLYFIN_DB="/var/lib/jellyfin/data/jellyfin.db" if [ -f "$JELLYFIN_DB" ]; then # Check if a "Homepage" key already exists JELLYFIN_KEY=$(${pkgs.sqlite}/bin/sqlite3 "$JELLYFIN_DB" \ "SELECT AccessToken FROM ApiKeys WHERE Name = 'Homepage' LIMIT 1;" 2>/dev/null || true) if [ -z "$JELLYFIN_KEY" ]; then # Generate a random 32-char hex token JELLYFIN_KEY=$(${pkgs.coreutils}/bin/head -c 16 /dev/urandom | ${pkgs.coreutils}/bin/od -An -tx1 | ${pkgs.gnused}/bin/sed 's/ //g' | ${pkgs.coreutils}/bin/head -c 32) NOW=$(${pkgs.coreutils}/bin/date -u '+%Y-%m-%d %H:%M:%S') ${pkgs.sqlite}/bin/sqlite3 "$JELLYFIN_DB" \ "INSERT INTO ApiKeys (DateCreated, DateLastActivity, Name, AccessToken) VALUES ('$NOW', '0001-01-01 00:01:00', 'Homepage', '$JELLYFIN_KEY');" fi fi # --- Write the secrets file --- cat > "$SECRETS_FILE" <