Extract show search in another cached function

This commit is contained in:
Zoe Roux 2024-01-05 15:46:53 +01:00
parent e034d51ae0
commit a270edbde4
4 changed files with 34 additions and 20 deletions

View File

@ -5,6 +5,8 @@ if TYPE_CHECKING:
from providers.implementations.themoviedatabase import TheMovieDatabase from providers.implementations.themoviedatabase import TheMovieDatabase
from typing import List, Optional from typing import List, Optional
from datetime import timedelta
from scanner.cache import cache
from providers.types.metadataid import MetadataID from providers.types.metadataid import MetadataID
@ -13,6 +15,7 @@ class IdMapper:
self.language = language self.language = language
self._tmdb = tmdb self._tmdb = tmdb
@cache(ttl=timedelta(days=1))
async def get_show( async def get_show(
self, show: dict[str, MetadataID], *, required: Optional[List[str]] = None self, show: dict[str, MetadataID], *, required: Optional[List[str]] = None
): ):

View File

@ -1,12 +1,13 @@
import asyncio import asyncio
import logging import logging
from aiohttp import ClientSession from aiohttp import ClientSession
from datetime import datetime from datetime import datetime, timedelta
from typing import Awaitable, Callable, Dict, List, Optional, Any, TypeVar from typing import Awaitable, Callable, Dict, List, Optional, Any, TypeVar
from providers.idmapper import IdMapper from providers.idmapper import IdMapper
from providers.implementations.thexem import TheXem from providers.implementations.thexem import TheXem
from providers.utils import ProviderError from providers.utils import ProviderError
from scanner.cache import cache
from ..provider import Provider from ..provider import Provider
from ..types.movie import Movie, MovieTranslation, Status as MovieStatus 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( async def identify_episode(
self, self,
name: str, name: str,
@ -383,23 +404,11 @@ class TheMovieDatabase(Provider):
*, *,
language: list[str], language: list[str],
) -> Episode: ) -> Episode:
search_results = ( show = await self.search_show(name, year)
await self.get("search/tv", params={"query": name, "year": year}) if show.original_language not in language:
)["results"] language.append(show.original_language)
if len(search_results) == 0: name = show.name
raise ProviderError(f"No result for a tv show named: {name}") show_id = show.external_id[self.name].data_id
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"])
# Handle weird season names overrides from thexem. # Handle weird season names overrides from thexem.
# For example when name is "Jojo's bizzare adventure - Stone Ocean", with season None, # For example when name is "Jojo's bizzare adventure - Stone Ocean", with season None,
@ -461,7 +470,7 @@ class TheMovieDatabase(Provider):
params={ params={
"language": lng, "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) logging.debug("TMDb responded: %s", episode)

View File

@ -9,6 +9,7 @@ from .metadataid import MetadataID
@dataclass @dataclass
class PartialShow: class PartialShow:
name: str
original_language: str original_language: str
external_id: dict[str, MetadataID] external_id: dict[str, MetadataID]

View File

@ -1,12 +1,12 @@
{pkgs ? import <nixpkgs> {}}: let {pkgs ? import <nixpkgs> {}}: let
venvDir = "./scanner/.venv"; venvDir = "./scanner/.venv";
python = pkgs.python312;
pythonPkgs = ./scanner/requirements.txt; pythonPkgs = ./scanner/requirements.txt;
dotnet = with pkgs.dotnetCorePackages; dotnet = with pkgs.dotnetCorePackages;
combinePackages [ combinePackages [
sdk_7_0 sdk_7_0
aspnetcore_7_0 aspnetcore_7_0
]; ];
python = pkgs.python312;
in in
pkgs.mkShell { pkgs.mkShell {
packages = with pkgs; [ packages = with pkgs; [
@ -16,6 +16,7 @@ in
nodePackages.expo-cli nodePackages.expo-cli
dotnet dotnet
python python
python312Packages.setuptools
python312Packages.pip python312Packages.pip
cargo cargo
cargo-watch cargo-watch