Handle tvdb translations missing errors

This commit is contained in:
Zoe Roux 2024-05-14 01:01:18 +02:00
parent 7577d757f8
commit fee6faceaa
No known key found for this signature in database

View File

@ -129,26 +129,6 @@ class TVDB(Provider):
) )
return ret["data"][0]["tvdb_id"] return ret["data"][0]["tvdb_id"]
@cache(ttl=timedelta(days=1))
async def get_episodes(
self,
show_id: str,
language: Optional[str] = None,
):
path = f"series/{show_id}/episodes/default"
if language is not None:
path += f"/{language}"
ret = await self.get(
path, not_found_fail=f"Could not find show with id {show_id}"
)
episodes = ret["data"]["episodes"]
next = ret["links"]["next"]
while next != None:
ret = await self.get(fullPath=next)
next = ret["links"]["next"]
episodes += ret["data"]["episodes"]
return episodes, ret["data"]
async def search_episode( async def search_episode(
self, self,
name: str, name: str,
@ -160,6 +140,27 @@ class TVDB(Provider):
show_id = await self.search_show(name, year) show_id = await self.search_show(name, year)
return await self.identify_episode(show_id, season, episode_nbr, absolute) return await self.identify_episode(show_id, season, episode_nbr, absolute)
@cache(ttl=timedelta(days=1))
async def get_episodes(
self,
show_id: str,
language: str,
):
try:
ret = await self.get(
f"series/{show_id}/episodes/default/{language}",
not_found_fail=f"Could not find show with id {show_id}",
)
episodes = ret["data"]["episodes"]
next = ret["links"]["next"]
while next != None:
ret = await self.get(fullPath=next)
next = ret["links"]["next"]
episodes += ret["data"]["episodes"]
return episodes, ret["data"]
except ProviderError:
return None
@cache(ttl=timedelta(days=1)) @cache(ttl=timedelta(days=1))
async def identify_episode( async def identify_episode(
self, self,
@ -168,8 +169,13 @@ class TVDB(Provider):
episode_nbr: Optional[int], episode_nbr: Optional[int],
absolute: Optional[int], absolute: Optional[int],
) -> Episode: ) -> Episode:
flang, *olang = self._languages translations = await asyncio.gather(
episodes, show = await self.get_episodes(show_id, language=flang) *(self.get_episodes(show_id, language=lang) for lang in self._languages)
)
episodes, show = next((x for x in translations if x is not None), (None, None))
if episodes is None or show is None:
raise ProviderError(f"Could not get episodes for show with id {show_id}")
ret = next( ret = next(
filter( filter(
(lambda x: x["seasonNumber"] == 1 and x["number"] == absolute) (lambda x: x["seasonNumber"] == 1 and x["number"] == absolute)
@ -186,21 +192,22 @@ class TVDB(Provider):
f"Could not retrive episode {show['name']} s{season}e{episode_nbr}, absolute {absolute}" f"Could not retrive episode {show['name']} s{season}e{episode_nbr}, absolute {absolute}"
) )
otrans = await asyncio.gather( trans = [
*(self.get_episodes(show_id, language=lang) for lang in olang) (
next((ep for ep in el[0] if ep["id"] == ret["id"]), None)
if el is not None
else None
) )
for el in translations
]
translations = { translations = {
self.normalize_lang(lang): EpisodeTranslation( self.normalize_lang(lang): EpisodeTranslation(
name=val["name"], name=val["name"],
overview=val["overview"], overview=val["overview"],
) )
for (lang, val) in zip( for lang, val in zip(self._languages, trans)
self._languages, if val is not None
[
ret,
*(next(x for x in e[0] if x["id"] == ret["id"]) for e in otrans),
],
)
} }
return Episode( return Episode(
@ -237,19 +244,14 @@ class TVDB(Provider):
not_found_fail=f"Could not find show with id {show_id}", not_found_fail=f"Could not find show with id {show_id}",
) )
logger.debug("TVDB responded: %s", ret) logger.debug("TVDB responded: %s", ret)
translations = await asyncio.gather(
*( async def process_translation(lang: str) -> Optional[ShowTranslation]:
self.get(f"series/{show_id}/translations/{lang}") data = await self.get(f"series/{show_id}/translations/{lang}")
for lang in self._languages return ShowTranslation(
if lang != ret["data"]["originalLanguage"] name=data["data"]["name"],
)
)
trans = {
self.normalize_lang(lang): ShowTranslation(
name=x["data"]["name"],
tagline=None, tagline=None,
tags=[], tags=[],
overview=x["data"]["overview"], overview=data["data"]["overview"],
posters=[ posters=[
i["image"] i["image"]
for i in ret["data"]["artworks"] for i in ret["data"]["artworks"]
@ -272,10 +274,14 @@ class TVDB(Provider):
t["url"] for t in ret["data"]["trailers"] if t["language"] == lang t["url"] for t in ret["data"]["trailers"] if t["language"] == lang
], ],
) )
for (lang, x) in [
(ret["data"]["originalLanguage"], ret), translations = await asyncio.gather(
*zip(self._languages, translations), *(process_translation(lang) for lang in self._languages)
] )
trans = {
self.normalize_lang(lang): ts
for (lang, ts) in zip(self._languages, translations)
if ts is not None
} }
ret = ret["data"] ret = ret["data"]
return Show( return Show(
@ -340,9 +346,7 @@ class TVDB(Provider):
@cache(ttl=timedelta(days=1)) @cache(ttl=timedelta(days=1))
async def identify_season(self, show_id: str, season: int) -> Season: async def identify_season(self, show_id: str, season: int) -> Season:
""" # for tvdb, we don't save show_id but the season_id so we don't need to read `season`
for tvdb, we don't save show_id but the season_id so we don't need to read `season`
"""
season_id = show_id season_id = show_id
info = await self.get( info = await self.get(
f"seasons/{season_id}/extended", f"seasons/{season_id}/extended",
@ -350,9 +354,18 @@ class TVDB(Provider):
) )
logger.debug("TVDB send season (%s) data %s", season_id, info) logger.debug("TVDB send season (%s) data %s", season_id, info)
async def process_translation(lang: str) -> SeasonTranslation: async def process_translation(lang: str) -> Optional[SeasonTranslation]:
data = await self.get(f"seasons/{season_id}/translations/{lang}") try:
logger.debug("TVDB send season (%s) translations (%s) data %s", season_id, lang, data) data = await self.get(
f"seasons/{season_id}/translations/{lang}",
not_found_fail="Season translation not found",
)
logger.debug(
"TVDB send season (%s) translations (%s) data %s",
season_id,
lang,
data,
)
return SeasonTranslation( return SeasonTranslation(
name=data["data"]["name"], name=data["data"]["name"],
overview=data["data"]["overview"], overview=data["data"]["overview"],
@ -369,10 +382,14 @@ class TVDB(Provider):
and (i["language"] == lang or i["language"] is None) and (i["language"] == lang or i["language"] is None)
], ],
) )
except ProviderError:
return None
trans = await asyncio.gather(*(process_translation(x) for x in self._languages)) trans = await asyncio.gather(*(process_translation(x) for x in self._languages))
translations = { translations = {
self.normalize_lang(lang): tl for lang, tl in zip(self._languages, trans) self.normalize_lang(lang): tl
for lang, tl in zip(self._languages, trans)
if tl is not None
} }
return Season( return Season(