Phase 2: Docker and OIDC auth

This commit is contained in:
2026-05-04 13:50:53 +02:00
parent 47baee854b
commit 4226628d5a
71 changed files with 9722 additions and 1347 deletions
@@ -6,24 +6,53 @@ dependency system. Uses lru_cache so connections are reused across requests.
from __future__ import annotations
import logging
from functools import lru_cache
from media_library_viewer_api.clients.jellyfin import JellyfinClient
from media_library_viewer_api.clients.jellyseerr import JellyseerrClient
from media_library_viewer_api.clients.ssh import RemoteSSHClient
from media_library_viewer_api.config import get_settings
from media_library_viewer_api.services.mail_queue import MailQueue, get_mail_queue as _get_mail_queue
logger = logging.getLogger(__name__)
@lru_cache
def get_jellyfin_client() -> JellyfinClient:
"""Return a cached Jellyfin client."""
settings = get_settings()
logger.info("Creating Jellyfin client for %s", settings.jellyfin_url.rstrip("/") or "<unset>")
return JellyfinClient(settings.jellyfin_url, settings.jellyfin_api_key)
@lru_cache
def get_jellyseerr_client() -> JellyseerrClient | None:
"""Return a cached Jellyseerr client when configured, otherwise None."""
settings = get_settings()
if not settings.jellyseerr_url or not settings.jellyseerr_api_key:
logger.info(
"Jellyseerr client not configured (url=%s, api_key=%s)",
"set" if settings.jellyseerr_url else "missing",
"set" if settings.jellyseerr_api_key else "missing",
)
return None
logger.info("Creating Jellyseerr client for %s", settings.jellyseerr_url.rstrip("/") or "<unset>")
return JellyseerrClient(settings.jellyseerr_url, settings.jellyseerr_api_key)
@lru_cache
def get_ssh_client() -> RemoteSSHClient:
"""Return a cached SSH client (connects on first use)."""
settings = get_settings()
logger.info(
"Creating SSH client host=%s user=%s port=%s key=%s password=%s",
settings.ssh_host or "<unset>",
settings.ssh_username or "<unset>",
settings.ssh_port,
settings.ssh_key_filename or "<unset>",
"set" if settings.ssh_password else "missing",
)
client = RemoteSSHClient(
host=settings.ssh_host,
username=settings.ssh_username,
@@ -31,10 +60,19 @@ def get_ssh_client() -> RemoteSSHClient:
key_filename=settings.ssh_key_filename or None,
password=settings.ssh_password or None,
)
client.connect()
try:
client.connect()
except Exception:
logger.exception("Failed to establish SSH connection to %s", settings.ssh_host or "<unset>")
raise
return client
def get_mail_queue() -> MailQueue:
"""Return the singleton background email queue."""
return _get_mail_queue()
def get_user_id() -> str:
"""Return the configured Jellyfin user ID, or discover the first available user."""
settings = get_settings()