mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Handle tvdb translations missing errors
This commit is contained in:
parent
7577d757f8
commit
fee6faceaa
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user