add tmdb person api

This commit is contained in:
jxxghp 2023-07-30 08:26:06 +08:00
parent d308a3d9de
commit f6978b916b
5 changed files with 105 additions and 18 deletions

View File

@ -25,7 +25,7 @@ def tmdb_seasons(tmdbid: int, _: schemas.TokenPayload = Depends(verify_token)) -
@router.get("/similar/{tmdbid}/{type_name}", summary="类似电影/电视剧", response_model=List[schemas.MediaInfo]) @router.get("/similar/{tmdbid}/{type_name}", summary="类似电影/电视剧", response_model=List[schemas.MediaInfo])
def similar(tmdbid: int, def tmdb_similar(tmdbid: int,
type_name: str, type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
@ -45,7 +45,7 @@ def similar(tmdbid: int,
@router.get("/recommend/{tmdbid}/{type_name}", summary="推荐电影/电视剧", response_model=List[schemas.MediaInfo]) @router.get("/recommend/{tmdbid}/{type_name}", summary="推荐电影/电视剧", response_model=List[schemas.MediaInfo])
def recommend(tmdbid: int, def tmdb_recommend(tmdbid: int,
type_name: str, type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
@ -64,8 +64,8 @@ def recommend(tmdbid: int,
return [MediaInfo(tmdb_info=tmdbinfo).to_dict() for tmdbinfo in tmdbinfos] return [MediaInfo(tmdb_info=tmdbinfo).to_dict() for tmdbinfo in tmdbinfos]
@router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.TmdbCast]) @router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.TmdbPerson])
def movie_similar(tmdbid: int, def tmdb_credits(tmdbid: int,
type_name: str, type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
@ -81,7 +81,33 @@ def movie_similar(tmdbid: int,
if not tmdbinfos: if not tmdbinfos:
return [] return []
else: 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]) @router.get("/movies", summary="TMDB电影", response_model=List[schemas.MediaInfo])

View File

@ -89,3 +89,17 @@ class TmdbChain(ChainBase):
:param tmdbid: TMDBID :param tmdbid: TMDBID
""" """
return self.run_module("tv_credits", 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)

View File

@ -372,3 +372,17 @@ class TheMovieDbModule(_ModuleBase):
:param tmdbid: TMDBID :param tmdbid: TMDBID
""" """
return self.tmdb.get_tv_credits(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)

View File

@ -5,7 +5,7 @@ from urllib.parse import quote
import zhconv import zhconv
from lxml import etree 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 .tmdbv3api.exceptions import TMDbException
from app.core.config import settings from app.core.config import settings
@ -20,11 +20,6 @@ class TmdbHelper:
TMDB识别匹配 TMDB识别匹配
""" """
tmdb: TMDb = None
search: Search = None
movie: Movie = None
tv: TV = None
def __init__(self): def __init__(self):
# TMDB主体 # TMDB主体
self.tmdb = TMDb() self.tmdb = TMDb()
@ -50,6 +45,8 @@ class TmdbHelper:
self.episode = Episode() self.episode = Episode()
self.discover = Discover() self.discover = Discover()
self.trending = Trending() self.trending = Trending()
self.credit = Credit()
self.person = Person()
def search_multiis(self, title: str) -> List[dict]: def search_multiis(self, title: str) -> List[dict]:
""" """
@ -1125,3 +1122,31 @@ class TmdbHelper:
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
return [] 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 {}

View File

@ -32,10 +32,18 @@ class TmdbEpisode(BaseModel):
guest_stars: Optional[list] = [] guest_stars: Optional[list] = []
class TmdbCast(BaseModel): class TmdbPerson(BaseModel):
id: Optional[int] = None id: Optional[int] = None
name: Optional[str] = None name: Optional[str] = None
character: Optional[str] = None character: Optional[str] = None
profile_path: Optional[str] = None profile_path: Optional[str] = None
gender: Optional[int] = None gender: Optional[int] = None
original_name: Optional[str] = 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