diff --git a/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs index 14802bea..d12105f6 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs @@ -106,6 +106,8 @@ namespace Kyoo.Core.Controllers /// protected override async Task Validate(Show resource) { + resource.Slug ??= Utility.ToSlug(resource.Title); + await base.Validate(resource); if (resource.Studio != null) { diff --git a/scanner/providers/implementations/themoviedatabase.py b/scanner/providers/implementations/themoviedatabase.py index 52210113..ec8c4818 100644 --- a/scanner/providers/implementations/themoviedatabase.py +++ b/scanner/providers/implementations/themoviedatabase.py @@ -42,9 +42,10 @@ class TheMovieDatabase(Provider): status=Status.UNKNOWN, studio=None, genres=[], - poster=[], + posters=[], thumbnails=[], - logo=[], + logos=[], + trailers=[], ) translation = MovieTranslation( name=movie["title"], diff --git a/scanner/providers/types/movie.py b/scanner/providers/types/movie.py index 4f27d8be..819a544e 100644 --- a/scanner/providers/types/movie.py +++ b/scanner/providers/types/movie.py @@ -22,9 +22,10 @@ class Movie: studio: Optional[int | str] = None genres: list[Genre] = field(default_factory=list) - poster: list[str] = field(default_factory=list) + posters: list[str] = field(default_factory=list) thumbnails: list[str] = field(default_factory=list) - logo: list[str] = field(default_factory=list) + logos: list[str] = field(default_factory=list) + trailers: list[str] = field(default_factory=list) path: Optional[str] = None # TODO: handle staff @@ -35,4 +36,14 @@ class Movie: 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])} + return { + **asdict(self), + **asdict(self.translations[default_language]), + "poster": next(iter(self.posters), None), + "thumbnail": next(iter(self.thumbnails), None), + "logo": next(iter(self.logos), None), + "trailer": next(iter(self.trailers), None), + "start_air": self.release_date, + "title": self.translations[default_language].name, + "isMovie": True, + } diff --git a/scanner/scanner/__init__.py b/scanner/scanner/__init__.py index c39844d5..5d5929b7 100644 --- a/scanner/scanner/__init__.py +++ b/scanner/scanner/__init__.py @@ -15,7 +15,20 @@ async def main(): if not languages: print("Missing environment variable 'LIBRARY_LANGUAGES'.") exit(2) + api_key = os.environ.get("KYOO_APIKEY") + if not api_key: + api_key = os.environ.get("KYOO_APIKEYS") + if not api_key: + print("Missing environment variable 'KYOO_APIKEY'.") + exit(2) + api_key = api_key.split(",")[0] + if len(sys.argv) > 1 and sys.argv[1] == "-v": + logging.basicConfig(level=logging.INFO) + if len(sys.argv) > 1 and sys.argv[1] == "-vv": logging.basicConfig(level=logging.DEBUG) + async with ClientSession() as client: - await Scanner(client, languages.split(",")).scan(path) + await Scanner(client, languages=languages.split(","), api_key=api_key).scan( + path + ) diff --git a/scanner/scanner/scanner.py b/scanner/scanner/scanner.py index 23c7d70c..c682c0d5 100644 --- a/scanner/scanner/scanner.py +++ b/scanner/scanner/scanner.py @@ -1,4 +1,5 @@ from functools import wraps +import json import os import asyncio import logging @@ -7,6 +8,7 @@ from pathlib import Path from guessit import guessit from providers.provider import Provider + def log_errors(f): @wraps(f) async def internal(*args, **kwargs): @@ -14,12 +16,16 @@ def log_errors(f): await f(*args, **kwargs) except Exception as e: logging.exception("Unhandled error", exc_info=e) + return internal class Scanner: - def __init__(self, client: ClientSession, languages: list[str]) -> None: + def __init__( + self, client: ClientSession, *, languages: list[str], api_key: str + ) -> None: self._client = client + self._api_key = api_key self.provider = Provider.get_all(client)[0] self.languages = languages @@ -41,14 +47,18 @@ class Scanner: ) logging.debug("Got movie: %s", movie) await self.post("movies", data=movie.to_kyoo()) + movie.path = str(path) elif raw["type"] == "episode": pass else: logging.warn("Unknown video file type: %s", raw["type"]) async def post(self, path: str, *, data: object): - url = os.environ.get('KYOO_URL', "http://back:5000") + url = os.environ.get("KYOO_URL", "http://back:5000") + print(json.dumps(data, indent=4)) async with self._client.post( - f"{url}/{path}", json=data + f"{url}/{path}", json=data, headers={"X-API-Key": self._api_key} ) as r: + if not r.ok: + print(await r.text()) r.raise_for_status() diff --git a/shell.nix b/shell.nix index 5b997638..cafc06aa 100644 --- a/shell.nix +++ b/shell.nix @@ -16,13 +16,15 @@ in ]; shellHook = '' - # Install python modules - SOURCE_DATE_EPOCH=$(date +%s) - if [ ! -d "${venvDir}" ]; then - ${pkgs.python3}/bin/python3 -m venv "${venvDir}" - fi - source "${venvDir}/bin/activate" - export PIP_DISABLE_PIP_VERSION_CHECK=1 - pip install -r ${pythonPkgs} + # Install python modules + SOURCE_DATE_EPOCH=$(date +%s) + if [ ! -d "${venvDir}" ]; then + ${pkgs.python3}/bin/python3 -m venv ${venvDir} + source ${venvDir}/bin/activate + export PIP_DISABLE_PIP_VERSION_CHECK=1 + pip install -r ${pythonPkgs} >&2 + else + source ${venvDir}/bin/activate + fi ''; }