diff --git a/scanner/matcher/matcher.py b/scanner/matcher/matcher.py index d09a4b80..790d3cd4 100644 --- a/scanner/matcher/matcher.py +++ b/scanner/matcher/matcher.py @@ -68,7 +68,7 @@ class Matcher: logger.info("Identied %s: %s", path, raw) if raw["type"] == "movie": - movie = await self._provider.identify_movie(raw["title"], raw.get("year")) + movie = await self._provider.search_movie(raw["title"], raw.get("year")) movie.path = str(path) logger.debug("Got movie: %s", movie) movie_id = await self._client.post("movies", data=movie.to_kyoo()) @@ -81,7 +81,7 @@ class Matcher: *(self._client.link_collection(x, "movie", movie_id) for x in ids) ) elif raw["type"] == "episode": - episode = await self._provider.identify_episode( + episode = await self._provider.search_episode( raw["title"], season=raw.get("season"), episode_nbr=raw.get("episode"), diff --git a/scanner/providers/implementations/themoviedatabase.py b/scanner/providers/implementations/themoviedatabase.py index 3f1c861e..5506b7bf 100644 --- a/scanner/providers/implementations/themoviedatabase.py +++ b/scanner/providers/implementations/themoviedatabase.py @@ -142,7 +142,7 @@ class TheMovieDatabase(Provider): }, ) - async def identify_movie(self, name: str, year: Optional[int]) -> Movie: + async def search_movie(self, name: str, year: Optional[int]) -> Movie: search_results = ( await self.get("search/movie", params={"query": name, "year": year}) )["results"] @@ -150,6 +150,9 @@ class TheMovieDatabase(Provider): raise ProviderError(f"No result for a movie named: {name}") search = self.get_best_result(search_results, name, year) movie_id = search["id"] + return await self.identify_movie(search["id"]) + + async def identify_movie(self, movie_id: str) -> Movie: languages = self.get_languages(search["original_language"]) async def for_language(lng: str) -> Movie: @@ -449,7 +452,7 @@ class TheMovieDatabase(Provider): }, ) - async def identify_episode( + async def search_episode( self, name: str, season: Optional[int], @@ -458,11 +461,9 @@ class TheMovieDatabase(Provider): year: Optional[int], ) -> Episode: show = await self.search_show(name, year) - languages = self.get_languages(show.original_language) # Keep it for xem overrides of season/episode old_name = name name = show.name - show_id = show.external_id[self.name].data_id # Handle weird season names overrides from thexem. # For example when name is "Jojo's bizzare adventure - Stone Ocean", with season None, @@ -503,6 +504,15 @@ class TheMovieDatabase(Provider): if absolute is None: absolute = await self.get_absolute_number(show_id, season, episode_nbr) + return await self._identify_episode(show, season, episode_nbr) + + + async def identify_episode(self, show_id: str, season_number: int, episode_number: int) -> Episode: + ... + + + async def _identify_episode(self, show: PartialShow, season: int, episode_nbr: int, absolute: int) -> Episode: + show_id = show.external_id[self.name].data_id async def for_language(lng: str) -> Episode: try: @@ -518,7 +528,7 @@ class TheMovieDatabase(Provider): params={ "language": lng, }, - not_found_fail=f"Could not find episode {episode_nbr} of season {season} of serie {name} (absolute: {absolute})", + not_found_fail=f"Could not find episode {episode_nbr} of season {season} of serie {show.name} (absolute: {absolute})", ) logger.debug("TMDb responded: %s", episode) @@ -550,8 +560,10 @@ class TheMovieDatabase(Provider): ret.translations = {lng: translation} return ret + languages = self.get_languages(show.original_language) return await self.process_translations(for_language, languages) + def get_best_result( self, search_results: List[Any], name: str, year: Optional[int] ) -> Any: diff --git a/scanner/providers/provider.py b/scanner/providers/provider.py index 5f5e7f53..4656361b 100644 --- a/scanner/providers/provider.py +++ b/scanner/providers/provider.py @@ -51,7 +51,22 @@ class Provider: raise NotImplementedError @abstractmethod - async def identify_movie(self, name: str, year: Optional[int]) -> Movie: + async def search_movie(self, name: str, year: Optional[int]) -> Movie: + raise NotImplementedError + + @abstractmethod + async def search_episode( + self, + name: str, + season: Optional[int], + episode_nbr: Optional[int], + absolute: Optional[int], + year: Optional[int], + ) -> Episode: + raise NotImplementedError + + @abstractmethod + async def identify_movie(self, movie_id: str) -> Movie: raise NotImplementedError @abstractmethod @@ -63,14 +78,11 @@ class Provider: raise NotImplementedError @abstractmethod - async def identify_episode( - self, - name: str, - season: Optional[int], - episode_nbr: Optional[int], - absolute: Optional[int], - year: Optional[int], - ) -> Episode: + async def identify_episode(self, show_id: str, season_number: int, episode_number: int) -> Episode: + raise NotImplementedError + + @abstractmethod + async def identify_absolute(self, show_id: str, absolute_number: int) -> Episode: raise NotImplementedError @abstractmethod