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
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.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

View File

@ -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

View File

@ -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])}

View File

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

View File

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

View File

@ -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)

View File

@ -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()