mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-30 19:54:16 -04:00
wip: Add tvdb as a provider
This commit is contained in:
parent
465562b563
commit
1c483fa14f
88
scanner/providers/implementations/thetvdb.py
Normal file
88
scanner/providers/implementations/thetvdb.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
from datetime import timedelta
|
||||||
|
from aiohttp import ClientSession
|
||||||
|
from logging import getLogger
|
||||||
|
from typing import Optional, Any
|
||||||
|
|
||||||
|
from matcher.cache import cache
|
||||||
|
|
||||||
|
from ..provider import Provider, ProviderError
|
||||||
|
from ..types.movie import Movie, MovieTranslation, Status as MovieStatus
|
||||||
|
from ..types.season import Season, SeasonTranslation
|
||||||
|
from ..types.episode import Episode, EpisodeTranslation, PartialShow, EpisodeID
|
||||||
|
from ..types.studio import Studio
|
||||||
|
from ..types.genre import Genre
|
||||||
|
from ..types.metadataid import MetadataID
|
||||||
|
from ..types.show import Show, ShowTranslation, Status as ShowStatus
|
||||||
|
from ..types.collection import Collection, CollectionTranslation
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TVDB(Provider):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
client: ClientSession,
|
||||||
|
api_key: str,
|
||||||
|
pin: str,
|
||||||
|
languages: list[str],
|
||||||
|
) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self._client = client
|
||||||
|
self.base = "https://api4.thetvdb.com/v4/"
|
||||||
|
self._api_key = api_key
|
||||||
|
self._pin = pin
|
||||||
|
self._languages = languages
|
||||||
|
|
||||||
|
@cache(ttl=timedelta(days=30))
|
||||||
|
async def login(self) -> str:
|
||||||
|
async with self._client.post(
|
||||||
|
f"{self.base}/login",
|
||||||
|
json={"apikey": self._api_key, "pin": self._pin},
|
||||||
|
) as r:
|
||||||
|
r.raise_for_status()
|
||||||
|
ret = await r.json()
|
||||||
|
return ret["data"]["token"]
|
||||||
|
|
||||||
|
async def get(
|
||||||
|
self,
|
||||||
|
path: str,
|
||||||
|
*,
|
||||||
|
params: dict[str, Any] = {},
|
||||||
|
not_found_fail: Optional[str] = None,
|
||||||
|
):
|
||||||
|
token = await self.login()
|
||||||
|
params = {k: v for k, v in params.items() if v is not None}
|
||||||
|
async with self._client.get(
|
||||||
|
f"{self.base}/{path}",
|
||||||
|
params={"api_key": self._api_key, **params},
|
||||||
|
headers={"Authorization": f"Bearer {token}"},
|
||||||
|
) as r:
|
||||||
|
if not_found_fail and r.status == 404:
|
||||||
|
raise ProviderError(not_found_fail)
|
||||||
|
r.raise_for_status()
|
||||||
|
return await r.json()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self) -> str:
|
||||||
|
return "tvdb"
|
||||||
|
|
||||||
|
async def search_episode(
|
||||||
|
self,
|
||||||
|
name: str,
|
||||||
|
season: Optional[int],
|
||||||
|
episode_nbr: Optional[int],
|
||||||
|
absolute: Optional[int],
|
||||||
|
year: Optional[int],
|
||||||
|
) -> Episode:
|
||||||
|
show = await self.search_show(name, year)
|
||||||
|
show_id = show.external_id[self.name].data_id
|
||||||
|
return await self.identify_episode(show_id, season, episode_nbr, absolute)
|
||||||
|
|
||||||
|
async def identify_episode(
|
||||||
|
self,
|
||||||
|
show_id: str,
|
||||||
|
season: Optional[int],
|
||||||
|
episode_nbr: Optional[int],
|
||||||
|
absolute: Optional[int],
|
||||||
|
) -> Episode:
|
||||||
|
return await self.get(f"")
|
Loading…
x
Reference in New Issue
Block a user