Cleanup tvdb

This commit is contained in:
Zoe Roux 2024-05-12 23:55:21 +02:00
parent d08a86a724
commit 497ba48f1b
No known key found for this signature in database

View File

@ -19,16 +19,18 @@ logger = getLogger(__name__)
class TVDB(Provider): class TVDB(Provider):
DEFAULT_API_KEY = "3732560f-08b7-41db-9d9a-2966b4d90c10"
def __init__( def __init__(
self, self,
client: ClientSession, client: ClientSession,
api_key: str, api_key: str,
pin: str, pin: Optional[str],
languages: list[str], languages: list[str],
) -> None: ) -> None:
super().__init__() super().__init__()
self._client = client self._client = client
self.base = "https://api4.thetvdb.com/v4/" self.base = "https://api4.thetvdb.com/v4"
self._api_key = api_key self._api_key = api_key
self._pin = pin self._pin = pin
self._languages = languages self._languages = languages
@ -80,7 +82,10 @@ class TVDB(Provider):
async def login(self) -> str: async def login(self) -> str:
async with self._client.post( async with self._client.post(
f"{self.base}/login", f"{self.base}/login",
json={"apikey": self._api_key, "pin": self._pin}, json={
"apikey": self._api_key,
}
| ({"pin": self._pin} if self._pin else {}),
) as r: ) as r:
r.raise_for_status() r.raise_for_status()
ret = await r.json() ret = await r.json()
@ -110,6 +115,7 @@ class TVDB(Provider):
def name(self) -> str: def name(self) -> str:
return "tvdb" return "tvdb"
@cache(ttl=timedelta(days=1))
async def search_show(self, name: str, year: Optional[int]) -> str: async def search_show(self, name: str, year: Optional[int]) -> str:
query = OrderedDict( query = OrderedDict(
query=name, query=name,
@ -125,7 +131,7 @@ class TVDB(Provider):
show_id: str, show_id: str,
language: Optional[str] = None, language: Optional[str] = None,
): ):
path = f"/series/{show_id}/episodes/default" path = f"series/{show_id}/episodes/default"
if language is not None: if language is not None:
path += f"/{language}" path += f"/{language}"
ret = await self.get( ret = await self.get(
@ -136,8 +142,8 @@ class TVDB(Provider):
while next != None: while next != None:
ret = await self.get(fullPath=next) ret = await self.get(fullPath=next)
next = ret["links"]["next"] next = ret["links"]["next"]
episodes += ret["data"] episodes += ret["data"]["episodes"]
return episodes return episodes, ret["data"]
async def search_episode( async def search_episode(
self, self,
@ -150,6 +156,7 @@ 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 identify_episode( async def identify_episode(
self, self,
show_id: str, show_id: str,
@ -158,8 +165,7 @@ class TVDB(Provider):
absolute: Optional[int], absolute: Optional[int],
) -> Episode: ) -> Episode:
flang, *olang = self._languages flang, *olang = self._languages
episodes = await self.get_episodes(show_id, language=flang) episodes, show = await self.get_episodes(show_id, language=flang)
show = episodes["data"]
ret = next( ret = next(
filter( filter(
(lambda x: x["seasonNumber"] == 1 and x["number"] == absolute) (lambda x: x["seasonNumber"] == 1 and x["number"] == absolute)
@ -167,7 +173,7 @@ class TVDB(Provider):
else ( else (
lambda x: x["seasonNumber"] == season and x["number"] == episode_nbr lambda x: x["seasonNumber"] == season and x["number"] == episode_nbr
), ),
episodes["episodes"], episodes,
), ),
None, None,
) )
@ -188,10 +194,7 @@ class TVDB(Provider):
self._languages, self._languages,
[ [
ret, ret,
*( *(next(x for x in e[0] if x["id"] == ret["id"]) for e in otrans),
next(x for x in e["episodes"] if x["id"] == ret["id"])
for e in otrans
),
], ],
) )
} }
@ -223,14 +226,17 @@ class TVDB(Provider):
translations=translations, translations=translations,
) )
@cache(ttl=timedelta(days=1))
async def identify_show(self, show_id: str) -> Show: async def identify_show(self, show_id: str) -> Show:
ret = await self.get( ret = await self.get(
f"series/{show_id}/extended", f"series/{show_id}/extended",
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)
ret = ret["data"]
translations = await asyncio.gather( translations = await asyncio.gather(
*( *(
self.get(f"/series/{show_id}/translations/{lang}") self.get(f"series/{show_id}/translations/{lang}")
for lang in self._languages for lang in self._languages
if lang != ret["originalLanguage"] if lang != ret["originalLanguage"]
) )
@ -326,6 +332,7 @@ class TVDB(Provider):
return {} return {}
return {name: MetadataID(id, link(id))} return {name: MetadataID(id, link(id))}
@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`