diff --git a/.github/workflows/coding-style.yml b/.github/workflows/coding-style.yml index c15f64f1..e27da2f0 100644 --- a/.github/workflows/coding-style.yml +++ b/.github/workflows/coding-style.yml @@ -41,3 +41,16 @@ jobs: - name: Lint run: yarn lint + scanner: + name: "Lint scanner" + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./scanner + steps: + - uses: actions/checkout@v1 + + - name: Run black + run: | + pip install black-with-tabs + black . --check diff --git a/scanner/providers/implementations/themoviedatabase.py b/scanner/providers/implementations/themoviedatabase.py index 34b3104f..52210113 100644 --- a/scanner/providers/implementations/themoviedatabase.py +++ b/scanner/providers/implementations/themoviedatabase.py @@ -15,41 +15,43 @@ class TheMovieDatabase(Provider): self.base = "https://api.themoviedb.org/3" self.api_key = api_key - async def get(self, path: str, *, params: dict[str, Any] = {}): - params = {k:v for k,v in params.items() if v is not None} - async with self._client.get(f"{self.base}/{path}", params={ "api_key": self.api_key, **params }) as r: + params = {k: v for k, v in params.items() if v is not None} + async with self._client.get( + f"{self.base}/{path}", params={"api_key": self.api_key, **params} + ) as r: r.raise_for_status() return await r.json() - - async def identify_movie(self, name: str, year: Optional[int], *, language: list[str]) -> Movie: - movie_id = (await self.get("search/movie", params={ "query": name, "year": year }))["results"][0]["id"] + async def identify_movie( + self, name: str, year: Optional[int], *, language: list[str] + ) -> Movie: + movie_id = ( + await self.get("search/movie", params={"query": name, "year": year}) + )["results"][0]["id"] async def for_language(lng: str) -> Movie: - movie = await self.get(f"/movie/{movie_id}", params={ "language": lng, "append_to_response": ""}) + movie = await self.get( + f"/movie/{movie_id}", params={"language": lng, "append_to_response": ""} + ) logging.debug("TMDb responded: %s", movie) - ret = ( - Movie( - aliases=[], - release_date=None, - status=Status.UNKNOWN, - studio=None, - genres=[], - poster=[], - thumbnails=[], - logo=[], - ) + ret = Movie( + aliases=[], + release_date=None, + status=Status.UNKNOWN, + studio=None, + genres=[], + poster=[], + thumbnails=[], + logo=[], ) - translation = ( - MovieTranslation( - name=movie["title"], - keywords=[], - overview=movie["overview"], - ) + translation = MovieTranslation( + name=movie["title"], + keywords=[], + overview=movie["overview"], ) - ret.translations = { lng: translation } + ret.translations = {lng: translation} return ret # TODO: make the folllowing generic @@ -58,4 +60,3 @@ class TheMovieDatabase(Provider): movie = movies[0] movie.translations = {k: v.translations[k] for k, v in zip(language, movies)} return movie - diff --git a/scanner/providers/provider.py b/scanner/providers/provider.py index 3fbfd429..20f2ad4d 100644 --- a/scanner/providers/provider.py +++ b/scanner/providers/provider.py @@ -8,18 +8,21 @@ from .types.movie import Movie Self = TypeVar("Self", bound="Provider") + class Provider: @classmethod def get_all(cls: type[Self], client: ClientSession) -> list[Self]: + from providers.implementations.themoviedatabase import TheMovieDatabase providers = [] - from providers.implementations.themoviedatabase import TheMovieDatabase - tmdb =os.environ.get("THEMOVIEDB_APIKEY") + tmdb = os.environ.get("THEMOVIEDB_APIKEY") if tmdb: providers.append(TheMovieDatabase(client, tmdb)) return providers @abstractmethod - async def identify_movie(self, name: str, year: Optional[int], *, language: list[str]) -> Movie: + async def identify_movie( + self, name: str, year: Optional[int], *, language: list[str] + ) -> Movie: raise NotImplementedError diff --git a/scanner/providers/types/movie.py b/scanner/providers/types/movie.py index e1ce1b37..4f27d8be 100644 --- a/scanner/providers/types/movie.py +++ b/scanner/providers/types/movie.py @@ -6,12 +6,14 @@ from typing import Optional from .genre import Genre from .status import Status + @dataclass class MovieTranslation: name: str keywords: list[str] = field(default_factory=list) overview: Optional[str] = None + @dataclass class Movie: aliases: list[str] = field(default_factory=list) @@ -30,9 +32,7 @@ class Movie: translations: dict[str, MovieTranslation] = field(default_factory=dict) - def to_kyoo(self): # For now, the API of kyoo only support one language so we remove the others. - default_language = os.environ["LIBRARY_LANGUAGES"].split(',')[0] - return { **asdict(self), **asdict(self.translations[default_language]) } - + default_language = os.environ["LIBRARY_LANGUAGES"].split(",")[0] + return {**asdict(self), **asdict(self.translations[default_language])} diff --git a/scanner/providers/types/status.py b/scanner/providers/types/status.py index e6a754e3..f065d3b3 100644 --- a/scanner/providers/types/status.py +++ b/scanner/providers/types/status.py @@ -1,5 +1,6 @@ from enum import Enum + class Status(Enum): UNKNOWN = "unknown" FINISHED = "finished" diff --git a/scanner/requirements.txt b/scanner/requirements.txt index 9f4dc104..94681b78 100644 --- a/scanner/requirements.txt +++ b/scanner/requirements.txt @@ -1,2 +1,3 @@ guessit aiohttp +black-with-tabs diff --git a/scanner/scanner/__init__.py b/scanner/scanner/__init__.py index 18ca072c..c39844d5 100644 --- a/scanner/scanner/__init__.py +++ b/scanner/scanner/__init__.py @@ -1,5 +1,6 @@ from .scanner import Scanner + async def main(): import os import logging @@ -17,4 +18,4 @@ async def main(): if len(sys.argv) > 1 and sys.argv[1] == "-v": logging.basicConfig(level=logging.DEBUG) async with ClientSession() as client: - await Scanner(client, languages.split(',')).scan(path) + await Scanner(client, languages.split(",")).scan(path) diff --git a/scanner/scanner/scanner.py b/scanner/scanner/scanner.py index 9d0e916b..b2895a15 100644 --- a/scanner/scanner/scanner.py +++ b/scanner/scanner/scanner.py @@ -5,6 +5,7 @@ from guessit import guessit from themoviedb.routes.base import ClientSession, os from providers.provider import Provider + class Scanner: def __init__(self, client: ClientSession, languages: list[str]) -> None: self._client = client @@ -23,7 +24,9 @@ class Scanner: # TODO: keep a list of processing shows to only fetch metadata once even if # multiples identify of the same show run on the same time if raw["type"] == "movie": - movie = await self.provider.identify_movie(raw["title"], raw.get("year"), language=self.languages) + movie = await self.provider.identify_movie( + raw["title"], raw.get("year"), language=self.languages + ) logging.debug("Got movie: %s", movie) await self.post("movies", data=movie.to_kyoo()) elif raw["type"] == "episode": @@ -32,5 +35,7 @@ class Scanner: logging.warn("Unknown video file type: %s", raw["type"]) async def post(self, path: str, *, data: object): - async with self._client.post(f"{os.environ['KYOO_URL']}/{path}", json=data) as r: + async with self._client.post( + f"{os.environ['KYOO_URL']}/{path}", json=data + ) as r: r.raise_for_status()