v0.1.0 — Réécriture complète de OhmStreaming
Nouvelle version réécrite de zéro : recherche multi-sources (Vostfree, French-Manga), extraction 2 niveaux, proxy vidéo intégré, streaming/téléchargement HLS, métadonnées Kitsu, bibliothèque locale, comptes JWT + administration, découverte fusionnée, indexeur Torznab (Sonarr/Prowlarr).
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user