From fb2a9cf9f10b614f38777003361432b8b496a3b6 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 8 May 2025 01:02:39 +0200 Subject: [PATCH] Remake provider interface --- scanner/providers/provider.py | 97 --------------------------- scanner/scanner/providers/provider.py | 41 +++++++++++ 2 files changed, 41 insertions(+), 97 deletions(-) delete mode 100644 scanner/providers/provider.py create mode 100644 scanner/scanner/providers/provider.py diff --git a/scanner/providers/provider.py b/scanner/providers/provider.py deleted file mode 100644 index 535de39a..00000000 --- a/scanner/providers/provider.py +++ /dev/null @@ -1,97 +0,0 @@ -from logging import getLogger -import os -from aiohttp import ClientSession -from abc import abstractmethod, abstractproperty -from typing import Optional - -from providers.utils import ProviderError - -from .types.show import Show -from .types.season import Season -from .types.episode import Episode -from .types.movie import Movie -from .types.collection import Collection - -logger = getLogger(__name__) - - -class Provider: - @classmethod - def get_default(cls, client: ClientSession): - languages = os.environ.get("LIBRARY_LANGUAGES") - if not languages: - print("Missing environment variable 'LIBRARY_LANGUAGES'.") - exit(2) - languages = languages.split(",") - providers = [] - - from providers.implementations.themoviedatabase import TheMovieDatabase - - tmdb = os.environ.get("THEMOVIEDB_APIKEY") or TheMovieDatabase.DEFAULT_API_KEY - if tmdb != "disabled": - tmdb = TheMovieDatabase(languages, client, tmdb) - providers.append(tmdb) - - from providers.implementations.thetvdb import TVDB - - tvdb = os.environ.get("TVDB_APIKEY") or TVDB.DEFAULT_API_KEY - if tvdb != "disabled": - pin = os.environ.get("TVDB_PIN") or None - tvdb = TVDB(client, tvdb, pin, languages) - providers.append(tvdb) - - if not any(providers): - raise ProviderError( - "No provider configured. You probably forgot to specify an API Key" - ) - - from providers.implementations.thexem import TheXem - - provider = next(iter(providers)) - logger.info(f"Starting with provider: {provider.name}") - return TheXem(client, provider) - - @abstractproperty - def name(self) -> str: - raise NotImplementedError - - @abstractmethod - async def search_movie(self, name: str, year: Optional[int]) -> Movie: - raise NotImplementedError - - @abstractmethod - async def search_episode( - self, - name: str, - season: Optional[int], - episode_nbr: Optional[int], - absolute: Optional[int], - year: Optional[int], - ) -> Episode: - raise NotImplementedError - - @abstractmethod - async def identify_movie(self, movie_id: str) -> Movie: - raise NotImplementedError - - @abstractmethod - async def identify_show(self, show_id: str) -> Show: - raise NotImplementedError - - @abstractmethod - async def identify_season(self, show_id: str, season: int) -> Season: - raise NotImplementedError - - @abstractmethod - async def identify_episode( - self, show_id: str, season: Optional[int], episode_nbr: int, absolute: int - ) -> Episode: - raise NotImplementedError - - @abstractmethod - async def identify_collection(self, provider_id: str) -> Collection: - raise NotImplementedError - - @abstractmethod - async def get_expected_titles(self) -> list[str]: - return [] diff --git a/scanner/scanner/providers/provider.py b/scanner/scanner/providers/provider.py new file mode 100644 index 00000000..59ed7858 --- /dev/null +++ b/scanner/scanner/providers/provider.py @@ -0,0 +1,41 @@ +from abc import ABC, abstractmethod +from logging import getLogger + +from langcodes import Language + +from ..models.movie import Movie, SearchMovie +from ..models.serie import SearchSerie, Serie + +logger = getLogger(__name__) + + +class Provider(ABC): + @property + @abstractmethod + def name(self) -> str: + raise NotImplementedError + + @abstractmethod + async def search_movies( + self, title: str, year: int | None, *, language: list[Language] + ) -> list[SearchMovie]: + raise NotImplementedError + + @abstractmethod + async def search_series( + self, title: str, year: int | None, *, language: list[Language] + ) -> list[SearchSerie]: + raise NotImplementedError + + @abstractmethod + async def get_movie(self, external_id: dict[str, str]) -> Movie | None: + raise NotImplementedError + + @abstractmethod + async def get_serie(self, external_id: dict[str, str]) -> Serie | None: + raise NotImplementedError + + +class ProviderError(RuntimeError): + def __init__(self, *args: object) -> None: + super().__init__(*args)