"""Provider construction and history-source selection.""" from __future__ import annotations import logging from .base import ( # noqa: F401 Account, AuthError, Coverage, HistoryProvider, Item, Library, MediaProvider, Part, ProviderError, ServerInfo, WatchEvent, ) from .plex import PlexClient, PlexHistoryProvider, PlexProvider from .tautulli import TautulliClient, TautulliHistoryProvider log = logging.getLogger(__name__) def build_media_provider(cfg) -> PlexProvider: client = PlexClient( cfg.plex_base_url, cfg.plex_token, timeout=cfg.plex_timeout_s, verify_ssl=cfg.plex_verify_ssl, page_size=cfg.plex_page_size, request_delay_ms=cfg.plex_request_delay_ms, ) return PlexProvider(client) def build_history_provider(cfg, media: PlexProvider): """Pick a history source per HISTORY_SOURCE (§4.11). 'auto' prefers Tautulli and falls back to Plex, reporting the reason rather than degrading silently — a silently degraded score is one that gets trusted when it shouldn't be. Returns (provider, degraded_reason_or_None). """ mode = (cfg.history_source or "auto").lower() if mode == "plex": return PlexHistoryProvider(media.client), None if mode in ("auto", "tautulli"): if not cfg.tautulli_configured: if mode == "tautulli": raise ProviderError("HISTORY_SOURCE=tautulli but Tautulli is not configured") return PlexHistoryProvider(media.client), "Tautulli is not configured" client = TautulliClient( cfg.tautulli_base_url, cfg.tautulli_api_key, timeout=cfg.tautulli_timeout_s, page_size=cfg.tautulli_page_size, ) provider = TautulliHistoryProvider(client) try: provider.server_info() return provider, None except ProviderError as e: if mode == "tautulli": raise log.warning("Tautulli unreachable, falling back to Plex history: %s", e) return PlexHistoryProvider(media.client), "Tautulli unreachable: %s" % e raise ProviderError("unknown HISTORY_SOURCE %r" % cfg.history_source)