Add episodes for themoviedb

This commit is contained in:
Zoe Roux 2023-03-24 18:38:52 +09:00
parent ce9dc48d81
commit 2334afb3eb
2 changed files with 35 additions and 46 deletions

View File

@ -2,12 +2,12 @@ import asyncio
from datetime import datetime from datetime import datetime
import logging import logging
from aiohttp import ClientSession from aiohttp import ClientSession
from typing import Awaitable, Callable, Coroutine, Dict, Optional, Any, TypeVar from typing import Awaitable, Callable, Dict, Optional, Any, TypeVar
from ..provider import Provider from ..provider import Provider
from ..types.movie import Movie, MovieTranslation, Status as MovieStatus from ..types.movie import Movie, MovieTranslation, Status as MovieStatus
from ..types.season import Season, SeasonTranslation from ..types.season import Season, SeasonTranslation
from ..types.episode import Episode, PartialShow from ..types.episode import Episode, EpisodeTranslation, PartialShow
from ..types.studio import Studio from ..types.studio import Studio
from ..types.genre import Genre from ..types.genre import Genre
from ..types.metadataid import MetadataID from ..types.metadataid import MetadataID
@ -279,7 +279,7 @@ class TheMovieDatabase(Provider):
self, self,
name: str, name: str,
season: Optional[int], season: Optional[int],
episode: Optional[int], episode_nbr: Optional[int],
absolute: Optional[int], absolute: Optional[int],
*, *,
language: list[str], language: list[str],
@ -289,58 +289,47 @@ class TheMovieDatabase(Provider):
if search["original_language"] not in language: if search["original_language"] not in language:
language.append(search["original_language"]) language.append(search["original_language"])
# TODO: Handle absolute episodes
async def for_language(lng: str) -> Episode: async def for_language(lng: str) -> Episode:
movie = await self.get( episode = await self.get(
f"/movie/{show_id}", f"/tv/{show_id}/season/{season}/episode/{episode_nbr}",
params={ params={
"language": lng, "language": lng,
"append_to_response": "alternative_titles,videos,credits,keywords,images",
}, },
) )
logging.debug("TMDb responded: %s", movie) logging.debug("TMDb responded: %s", episode)
# TODO: Use collection data
ret = Movie( ret = Episode(
original_language=movie["original_language"], show=PartialShow(
aliases=[x["title"] for x in movie["alternative_titles"]["titles"]], name=search["name"],
release_date=datetime.strptime( original_language=search["original_language"],
movie["release_date"], "%Y-%m-%d" external_id={
).date(), "themoviedatabase": MetadataID(
status=MovieStatus.FINISHED show_id, f"https://www.themoviedb.org/tv/{show_id}"
if movie["status"] == "Released" )
else MovieStatus.PLANNED, },
studios=[self.to_studio(x) for x in movie["production_companies"]], ),
genres=[ season_number=episode["season_number"],
self.genre_map[x["id"]] episode_number=episode["episode_number"],
for x in movie["genres"] # TODO: absolute numbers
if x["id"] in self.genre_map absolute_number=None,
], release_date=datetime.strptime(episode["air_date"], "%Y-%m-%d").date(),
thumbnail=f"https://image.tmdb.org/t/p/original{episode['poster_path']}"
if "poster_path" in episode
else None,
external_id={ external_id={
"themoviedatabase": MetadataID( "themoviedatabase": MetadataID(
movie["id"], f"https://www.themoviedb.org/movie/{movie['id']}" episode["id"],
f"https://www.themoviedb.org/movie/{episode['id']}",
), ),
"imdb": MetadataID( },
movie["imdb_id"],
f"https://www.imdb.com/title/{movie['imdb_id']}",
),
}
# TODO: Add cast information
) )
translation = MovieTranslation( translation = EpisodeTranslation(
name=movie["title"], name=episode["name"],
tagline=movie["tagline"], overview=episode["overview"],
keywords=list(map(lambda x: x["name"], movie["keywords"]["keywords"])),
overview=movie["overview"],
posters=self.get_image(movie["images"]["posters"]),
logos=self.get_image(movie["images"]["logos"]),
thumbnails=self.get_image(movie["images"]["backdrops"]),
trailers=[
f"https://www.youtube.com/watch?v{x['key']}"
for x in movie["videos"]["results"]
if x["type"] == "Trailer" and x["site"] == "YouTube"
],
) )
ret.translations = {lng: translation} ret.translations = {lng: translation}
return ret return ret
return self.process_translations(for_language, language) return await self.process_translations(for_language, language)

View File

@ -18,7 +18,6 @@ class PartialShow:
class EpisodeTranslation: class EpisodeTranslation:
name: str name: str
overview: Optional[str] overview: Optional[str]
thumbnails: list[str]
@dataclass @dataclass
@ -28,7 +27,8 @@ class Episode:
episode_number: Optional[int] episode_number: Optional[int]
absolute_number: Optional[int] absolute_number: Optional[int]
release_date: Optional[date | int] release_date: Optional[date | int]
path: Optional[str] thumbnail: Optional[str]
external_id: dict[str, MetadataID] external_id: dict[str, MetadataID]
path: Optional[str] = None
translations: dict[str, EpisodeTranslation] = field(default_factory=dict) translations: dict[str, EpisodeTranslation] = field(default_factory=dict)