From a270edbde42c648289edc266def7cf3dfcabc750 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 5 Jan 2024 15:46:53 +0100 Subject: [PATCH] Extract show search in another cached function --- scanner/providers/idmapper.py | 3 ++ .../implementations/themoviedatabase.py | 47 +++++++++++-------- scanner/providers/types/episode.py | 1 + shell.nix | 3 +- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/scanner/providers/idmapper.py b/scanner/providers/idmapper.py index 6ce12d5c..9dc5328e 100644 --- a/scanner/providers/idmapper.py +++ b/scanner/providers/idmapper.py @@ -5,6 +5,8 @@ if TYPE_CHECKING: from providers.implementations.themoviedatabase import TheMovieDatabase from typing import List, Optional +from datetime import timedelta +from scanner.cache import cache from providers.types.metadataid import MetadataID @@ -13,6 +15,7 @@ class IdMapper: self.language = language self._tmdb = tmdb + @cache(ttl=timedelta(days=1)) async def get_show( self, show: dict[str, MetadataID], *, required: Optional[List[str]] = None ): diff --git a/scanner/providers/implementations/themoviedatabase.py b/scanner/providers/implementations/themoviedatabase.py index 9be5eeeb..02f87b53 100644 --- a/scanner/providers/implementations/themoviedatabase.py +++ b/scanner/providers/implementations/themoviedatabase.py @@ -1,12 +1,13 @@ import asyncio import logging from aiohttp import ClientSession -from datetime import datetime +from datetime import datetime, timedelta from typing import Awaitable, Callable, Dict, List, Optional, Any, TypeVar from providers.idmapper import IdMapper from providers.implementations.thexem import TheXem from providers.utils import ProviderError +from scanner.cache import cache from ..provider import Provider from ..types.movie import Movie, MovieTranslation, Status as MovieStatus @@ -373,6 +374,26 @@ class TheMovieDatabase(Provider): }, ) + @cache(ttl=timedelta(days=1)) + async def search_show(self, name: str, year: Optional[int]): + search_results = ( + await self.get("search/tv", params={"query": name, "year": year}) + )["results"] + if len(search_results) == 0: + raise ProviderError(f"No result for a tv show named: {name}") + search = self.get_best_result(search_results, name, year) + show_id = search["id"] + return PartialShow( + name=search["name"], + original_language=search["original_language"], + external_id={ + self.name: MetadataID( + show_id, f"https://www.themoviedb.org/tv/{show_id}" + ) + }, + ) + + async def identify_episode( self, name: str, @@ -383,23 +404,11 @@ class TheMovieDatabase(Provider): *, language: list[str], ) -> Episode: - search_results = ( - await self.get("search/tv", params={"query": name, "year": year}) - )["results"] - if len(search_results) == 0: - raise ProviderError(f"No result for a tv show named: {name}") - search = self.get_best_result(search_results, name, year) - show_id = search["id"] - show = PartialShow( - original_language=search["original_language"], - external_id={ - self.name: MetadataID( - show_id, f"https://www.themoviedb.org/tv/{show_id}" - ) - }, - ) - if search["original_language"] not in language: - language.append(search["original_language"]) + show = await self.search_show(name, year) + if show.original_language not in language: + language.append(show.original_language) + 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, @@ -461,7 +470,7 @@ class TheMovieDatabase(Provider): params={ "language": lng, }, - not_found_fail=f"Could not find episode {episode_nbr} of season {season} of serie {search['name']}", + not_found_fail=f"Could not find episode {episode_nbr} of season {season} of serie {name}", ) logging.debug("TMDb responded: %s", episode) diff --git a/scanner/providers/types/episode.py b/scanner/providers/types/episode.py index 078cbd9e..96243b69 100644 --- a/scanner/providers/types/episode.py +++ b/scanner/providers/types/episode.py @@ -9,6 +9,7 @@ from .metadataid import MetadataID @dataclass class PartialShow: + name: str original_language: str external_id: dict[str, MetadataID] diff --git a/shell.nix b/shell.nix index 5d2b83d3..341fa6c0 100644 --- a/shell.nix +++ b/shell.nix @@ -1,12 +1,12 @@ {pkgs ? import {}}: let venvDir = "./scanner/.venv"; + python = pkgs.python312; pythonPkgs = ./scanner/requirements.txt; dotnet = with pkgs.dotnetCorePackages; combinePackages [ sdk_7_0 aspnetcore_7_0 ]; - python = pkgs.python312; in pkgs.mkShell { packages = with pkgs; [ @@ -16,6 +16,7 @@ in nodePackages.expo-cli dotnet python + python312Packages.setuptools python312Packages.pip cargo cargo-watch