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 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
):

View File

@ -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)

View File

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

View File

@ -1,12 +1,12 @@
{pkgs ? import <nixpkgs> {}}: 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