"""Paramètres persistés en DB (activation des sources, réglages UI…).""" import json import logging import secrets from app.db import db logger = logging.getLogger(__name__) async def get_setting(key: str, default: object = None) -> object: row = await db.fetchone("SELECT value FROM settings WHERE key = ?", (key,)) if row is None: return default try: return json.loads(row["value"]) except json.JSONDecodeError: logger.warning("Paramètre %r corrompu, valeur par défaut utilisée", key) return default async def set_setting(key: str, value: object) -> None: await db.execute( "INSERT INTO settings (key, value) VALUES (?, ?) " "ON CONFLICT(key) DO UPDATE SET value = excluded.value", (key, json.dumps(value, ensure_ascii=False)), ) async def is_source_enabled(name: str) -> bool: return bool(await get_setting(f"source:{name}:enabled", True)) async def set_source_enabled(name: str, enabled: bool) -> None: await set_setting(f"source:{name}:enabled", enabled) logger.info("Source %s %s", name, "activée" if enabled else "désactivée") # ---------------------------------------------------------------- intégrations *arr TORZNAB_APIKEY_KEY = "torznab:apikey" SONARR_URL_KEY = "sonarr:url" SONARR_APIKEY_KEY = "sonarr:apikey" async def get_torznab_apikey() -> str: """Clé API Torznab (générée au premier appel, persistée en DB).""" key = await get_setting(TORZNAB_APIKEY_KEY) if not isinstance(key, str) or not key: key = secrets.token_hex(16) await set_setting(TORZNAB_APIKEY_KEY, key) logger.info("Clé API Torznab générée") return key async def reset_torznab_apikey() -> str: key = secrets.token_hex(16) await set_setting(TORZNAB_APIKEY_KEY, key) logger.info("Clé API Torznab régénérée") return key async def get_sonarr_config() -> dict[str, str]: return { "url": await get_setting(SONARR_URL_KEY, ""), "apikey": await get_setting(SONARR_APIKEY_KEY, ""), } async def set_sonarr_config(url: str, apikey: str) -> None: await set_setting(SONARR_URL_KEY, url.rstrip("/")) await set_setting(SONARR_APIKEY_KEY, apikey.strip()) logger.info("Configuration Sonarr enregistrée (%s)", url)