From f6978b916b9b4de7e461559343bf483c1f9556dc Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 30 Jul 2023 08:26:06 +0800 Subject: [PATCH] add tmdb person api --- app/api/endpoints/tmdb.py | 48 +++++++++++++++++++++++------- app/chain/tmdb.py | 14 +++++++++ app/modules/themoviedb/__init__.py | 14 +++++++++ app/modules/themoviedb/tmdbapi.py | 37 +++++++++++++++++++---- app/schemas/tmdb.py | 10 ++++++- 5 files changed, 105 insertions(+), 18 deletions(-) diff --git a/app/api/endpoints/tmdb.py b/app/api/endpoints/tmdb.py index 2ac8abef..c6da92fe 100644 --- a/app/api/endpoints/tmdb.py +++ b/app/api/endpoints/tmdb.py @@ -25,9 +25,9 @@ def tmdb_seasons(tmdbid: int, _: schemas.TokenPayload = Depends(verify_token)) - @router.get("/similar/{tmdbid}/{type_name}", summary="类似电影/电视剧", response_model=List[schemas.MediaInfo]) -def similar(tmdbid: int, - type_name: str, - _: schemas.TokenPayload = Depends(verify_token)) -> Any: +def tmdb_similar(tmdbid: int, + type_name: str, + _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 根据TMDBID查询类似电影/电视剧,type_name: 电影/电视剧 """ @@ -45,9 +45,9 @@ def similar(tmdbid: int, @router.get("/recommend/{tmdbid}/{type_name}", summary="推荐电影/电视剧", response_model=List[schemas.MediaInfo]) -def recommend(tmdbid: int, - type_name: str, - _: schemas.TokenPayload = Depends(verify_token)) -> Any: +def tmdb_recommend(tmdbid: int, + type_name: str, + _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 根据TMDBID查询推荐电影/电视剧,type_name: 电影/电视剧 """ @@ -64,10 +64,10 @@ def recommend(tmdbid: int, return [MediaInfo(tmdb_info=tmdbinfo).to_dict() for tmdbinfo in tmdbinfos] -@router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.TmdbCast]) -def movie_similar(tmdbid: int, - type_name: str, - _: schemas.TokenPayload = Depends(verify_token)) -> Any: +@router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.TmdbPerson]) +def tmdb_credits(tmdbid: int, + type_name: str, + _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 根据TMDBID查询演员阵容,type_name: 电影/电视剧 """ @@ -81,7 +81,33 @@ def movie_similar(tmdbid: int, if not tmdbinfos: return [] else: - return [schemas.TmdbCast(**tmdbinfo) for tmdbinfo in tmdbinfos] + return [schemas.TmdbPerson(**tmdbinfo) for tmdbinfo in tmdbinfos] + + +@router.get("/credit/details/{credit_id}", summary="演员参演作品", response_model=List[schemas.MediaInfo]) +def tmdb_credit_details(credit_id: str, + _: schemas.TokenPayload = Depends(verify_token)) -> Any: + """ + 根据演员ID查询演员参演作品 + """ + tmdbinfos = TmdbChain().credit_details(credit_id=credit_id) + if not tmdbinfos: + return [] + else: + return [MediaInfo(tmdb_info=tmdbinfo).to_dict() for tmdbinfo in tmdbinfos] + + +@router.get("/person/{person_id}", summary="人物详情", response_model=schemas.TmdbPerson) +def tmdb_person(person_id: int, + _: schemas.TokenPayload = Depends(verify_token)) -> Any: + """ + 根据人物ID查询人物详情 + """ + tmdbinfo = TmdbChain().person_detail(person_id=person_id) + if not tmdbinfo: + return schemas.TmdbPerson() + else: + return schemas.TmdbPerson(**tmdbinfo) @router.get("/movies", summary="TMDB电影", response_model=List[schemas.MediaInfo]) diff --git a/app/chain/tmdb.py b/app/chain/tmdb.py index 809dcef0..636ad550 100644 --- a/app/chain/tmdb.py +++ b/app/chain/tmdb.py @@ -89,3 +89,17 @@ class TmdbChain(ChainBase): :param tmdbid: TMDBID """ return self.run_module("tv_credits", tmdbid=tmdbid) + + def credit_details(self, credit_id: str) -> List[dict]: + """ + 根据TMDBID查询演职员详情 + :param credit_id: 人物ID + """ + return self.run_module("credit_details", credit_id=credit_id) + + def person_detail(self, person_id: int) -> dict: + """ + 根据TMDBID查询演职员详情 + :param person_id: 人物ID + """ + return self.run_module("person_detail", person_id=person_id) diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index 3f7a2267..712089cc 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -372,3 +372,17 @@ class TheMovieDbModule(_ModuleBase): :param tmdbid: TMDBID """ return self.tmdb.get_tv_credits(tmdbid=tmdbid) + + def credit_details(self, credit_id: str) -> List[dict]: + """ + 根据TMDBID查询演职员详情 + :param credit_id: 人物ID + """ + return self.tmdb.get_credit_details(credit_id=credit_id) + + def person_detail(self, person_id: int) -> dict: + """ + 根据TMDBID查询人物详情 + :param person_id: 人物ID + """ + return self.tmdb.get_person_detail(person_id=person_id) diff --git a/app/modules/themoviedb/tmdbapi.py b/app/modules/themoviedb/tmdbapi.py index 24f252f4..77bf98ea 100644 --- a/app/modules/themoviedb/tmdbapi.py +++ b/app/modules/themoviedb/tmdbapi.py @@ -5,7 +5,7 @@ from urllib.parse import quote import zhconv from lxml import etree -from .tmdbv3api import TMDb, Search, Movie, TV, Season, Episode, Discover, Trending +from .tmdbv3api import TMDb, Search, Movie, TV, Season, Episode, Discover, Trending, Credit, Person from .tmdbv3api.exceptions import TMDbException from app.core.config import settings @@ -20,11 +20,6 @@ class TmdbHelper: TMDB识别匹配 """ - tmdb: TMDb = None - search: Search = None - movie: Movie = None - tv: TV = None - def __init__(self): # TMDB主体 self.tmdb = TMDb() @@ -50,6 +45,8 @@ class TmdbHelper: self.episode = Episode() self.discover = Discover() self.trending = Trending() + self.credit = Credit() + self.person = Person() def search_multiis(self, title: str) -> List[dict]: """ @@ -1125,3 +1122,31 @@ class TmdbHelper: except Exception as e: print(str(e)) return [] + + def get_credit_details(self, credit_id: str) -> List[dict]: + """ + 获取演职员的详情 + """ + if not self.credit: + return [] + try: + logger.info(f"正在获取演职员参演作品:{credit_id}...") + info = self.credit.details(credit_id=credit_id) or {} + return info + except Exception as e: + print(str(e)) + return [] + + def get_person_detail(self, person_id: int) -> dict: + """ + 获取人物详情 + """ + if not self.person: + return {} + try: + logger.info(f"正在获取人物详情:{person_id}...") + info = self.person.details(person_id=person_id) or {} + return info + except Exception as e: + print(str(e)) + return {} diff --git a/app/schemas/tmdb.py b/app/schemas/tmdb.py index efb7878e..7c401ce5 100644 --- a/app/schemas/tmdb.py +++ b/app/schemas/tmdb.py @@ -32,10 +32,18 @@ class TmdbEpisode(BaseModel): guest_stars: Optional[list] = [] -class TmdbCast(BaseModel): +class TmdbPerson(BaseModel): id: Optional[int] = None name: Optional[str] = None character: Optional[str] = None profile_path: Optional[str] = None gender: Optional[int] = None original_name: Optional[str] = None + credit_id: Optional[str] = None + also_known_as: Optional[list] = [] + birthday: Optional[str] = None + deathday: Optional[str] = None + imdb_id: Optional[str] = None + known_for_department: Optional[str] = None + place_of_birth: Optional[str] = None + popularity: Optional[float] = None