mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-31 12:14:46 -04:00
Add black to lint the scannre
This commit is contained in:
parent
89fbb3a3cf
commit
e2387158dc
13
.github/workflows/coding-style.yml
vendored
13
.github/workflows/coding-style.yml
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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])}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
guessit
|
guessit
|
||||||
aiohttp
|
aiohttp
|
||||||
|
black-with-tabs
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user