Add black to lint the scannre

This commit is contained in:
Zoe Roux 2023-03-18 23:37:38 +09:00
parent 89fbb3a3cf
commit e2387158dc
8 changed files with 61 additions and 36 deletions

View File

@ -41,3 +41,16 @@ jobs:
- name: Lint - name: Lint
run: yarn 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

View File

@ -15,41 +15,43 @@ class TheMovieDatabase(Provider):
self.base = "https://api.themoviedb.org/3" self.base = "https://api.themoviedb.org/3"
self.api_key = api_key self.api_key = api_key
async def get(self, path: str, *, params: dict[str, Any] = {}): async def get(self, path: str, *, params: dict[str, Any] = {}):
params = {k:v for k,v in params.items() if v is not None} 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: async with self._client.get(
f"{self.base}/{path}", params={"api_key": self.api_key, **params}
) as r:
r.raise_for_status() r.raise_for_status()
return await r.json() return await r.json()
async def identify_movie(
async def identify_movie(self, name: str, year: Optional[int], *, language: list[str]) -> Movie: self, name: str, year: Optional[int], *, language: list[str]
movie_id = (await self.get("search/movie", params={ "query": name, "year": year }))["results"][0]["id"] ) -> Movie:
movie_id = (
await self.get("search/movie", params={"query": name, "year": year})
)["results"][0]["id"]
async def for_language(lng: str) -> Movie: 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) logging.debug("TMDb responded: %s", movie)
ret = ( ret = Movie(
Movie( aliases=[],
aliases=[], release_date=None,
release_date=None, status=Status.UNKNOWN,
status=Status.UNKNOWN, studio=None,
studio=None, genres=[],
genres=[], poster=[],
poster=[], thumbnails=[],
thumbnails=[], logo=[],
logo=[],
)
) )
translation = ( translation = MovieTranslation(
MovieTranslation( name=movie["title"],
name=movie["title"], keywords=[],
keywords=[], overview=movie["overview"],
overview=movie["overview"],
)
) )
ret.translations = { lng: translation } ret.translations = {lng: translation}
return ret return ret
# TODO: make the folllowing generic # TODO: make the folllowing generic
@ -58,4 +60,3 @@ class TheMovieDatabase(Provider):
movie = movies[0] movie = movies[0]
movie.translations = {k: v.translations[k] for k, v in zip(language, movies)} movie.translations = {k: v.translations[k] for k, v in zip(language, movies)}
return movie return movie

View File

@ -8,18 +8,21 @@ from .types.movie import Movie
Self = TypeVar("Self", bound="Provider") Self = TypeVar("Self", bound="Provider")
class Provider: class Provider:
@classmethod @classmethod
def get_all(cls: type[Self], client: ClientSession) -> list[Self]: def get_all(cls: type[Self], client: ClientSession) -> list[Self]:
from providers.implementations.themoviedatabase import TheMovieDatabase
providers = [] providers = []
from providers.implementations.themoviedatabase import TheMovieDatabase tmdb = os.environ.get("THEMOVIEDB_APIKEY")
tmdb =os.environ.get("THEMOVIEDB_APIKEY")
if tmdb: if tmdb:
providers.append(TheMovieDatabase(client, tmdb)) providers.append(TheMovieDatabase(client, tmdb))
return providers return providers
@abstractmethod @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 raise NotImplementedError

View File

@ -6,12 +6,14 @@ from typing import Optional
from .genre import Genre from .genre import Genre
from .status import Status from .status import Status
@dataclass @dataclass
class MovieTranslation: class MovieTranslation:
name: str name: str
keywords: list[str] = field(default_factory=list) keywords: list[str] = field(default_factory=list)
overview: Optional[str] = None overview: Optional[str] = None
@dataclass @dataclass
class Movie: class Movie:
aliases: list[str] = field(default_factory=list) aliases: list[str] = field(default_factory=list)
@ -30,9 +32,7 @@ class Movie:
translations: dict[str, MovieTranslation] = field(default_factory=dict) translations: dict[str, MovieTranslation] = field(default_factory=dict)
def to_kyoo(self): def to_kyoo(self):
# For now, the API of kyoo only support one language so we remove the others. # For now, the API of kyoo only support one language so we remove the others.
default_language = os.environ["LIBRARY_LANGUAGES"].split(',')[0] default_language = os.environ["LIBRARY_LANGUAGES"].split(",")[0]
return { **asdict(self), **asdict(self.translations[default_language]) } return {**asdict(self), **asdict(self.translations[default_language])}

View File

@ -1,5 +1,6 @@
from enum import Enum from enum import Enum
class Status(Enum): class Status(Enum):
UNKNOWN = "unknown" UNKNOWN = "unknown"
FINISHED = "finished" FINISHED = "finished"

View File

@ -1,2 +1,3 @@
guessit guessit
aiohttp aiohttp
black-with-tabs

View File

@ -1,5 +1,6 @@
from .scanner import Scanner from .scanner import Scanner
async def main(): async def main():
import os import os
import logging import logging
@ -17,4 +18,4 @@ async def main():
if len(sys.argv) > 1 and sys.argv[1] == "-v": if len(sys.argv) > 1 and sys.argv[1] == "-v":
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
async with ClientSession() as client: async with ClientSession() as client:
await Scanner(client, languages.split(',')).scan(path) await Scanner(client, languages.split(",")).scan(path)

View File

@ -5,6 +5,7 @@ from guessit import guessit
from themoviedb.routes.base import ClientSession, os from themoviedb.routes.base import ClientSession, os
from providers.provider import Provider from providers.provider import Provider
class Scanner: class Scanner:
def __init__(self, client: ClientSession, languages: list[str]) -> None: def __init__(self, client: ClientSession, languages: list[str]) -> None:
self._client = client self._client = client
@ -23,7 +24,9 @@ class Scanner:
# TODO: keep a list of processing shows to only fetch metadata once even if # 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 # multiples identify of the same show run on the same time
if raw["type"] == "movie": 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) logging.debug("Got movie: %s", movie)
await self.post("movies", data=movie.to_kyoo()) await self.post("movies", data=movie.to_kyoo())
elif raw["type"] == "episode": elif raw["type"] == "episode":
@ -32,5 +35,7 @@ class Scanner:
logging.warn("Unknown video file type: %s", raw["type"]) logging.warn("Unknown video file type: %s", raw["type"])
async def post(self, path: str, *, data: object): 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() r.raise_for_status()