This commit is contained in:
jxxghp 2023-07-29 15:07:01 +08:00
parent 5d30921d2f
commit 891eaf2c12
4 changed files with 119 additions and 41 deletions

View File

@ -3,6 +3,7 @@ from typing import List, Any
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from app import schemas from app import schemas
from app.chain.douban import DoubanChain
from app.chain.tmdb import TmdbChain from app.chain.tmdb import TmdbChain
from app.core.context import MediaInfo from app.core.context import MediaInfo
from app.core.security import verify_token from app.core.security import verify_token
@ -11,10 +12,10 @@ from app.schemas.types import MediaType
router = APIRouter() router = APIRouter()
@router.get("/{tmdbid}/seasons", summary="TMDB所有季", response_model=List[schemas.TmdbSeason]) @router.get("/seasons/{tmdbid}", summary="TMDB所有季", response_model=List[schemas.TmdbSeason])
def tmdb_seasons(tmdbid: int, _: schemas.TokenPayload = Depends(verify_token)) -> Any: def tmdb_seasons(tmdbid: int, _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
根据TMDBID查询themoviedb所有季信息type_name: 电影/电视剧 根据TMDBID查询themoviedb所有季信息
""" """
seasons_info = TmdbChain().tmdb_seasons(tmdbid=tmdbid) seasons_info = TmdbChain().tmdb_seasons(tmdbid=tmdbid)
if not seasons_info: if not seasons_info:
@ -23,27 +24,14 @@ def tmdb_seasons(tmdbid: int, _: schemas.TokenPayload = Depends(verify_token)) -
return seasons_info return seasons_info
@router.get("/{tmdbid}/{season}", summary="TMDB季所有集", response_model=List[schemas.TmdbEpisode]) @router.get("/similar/{tmdbid}/{type_name}", summary="类似电影/电视剧", response_model=List[schemas.MediaInfo])
def tmdb_season_episodes(tmdbid: int, season: int, def similar(tmdbid: int,
type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
根据TMDBID查询某季的所有信信息 根据TMDBID查询类似电影/电视剧type_name: 电影/电视剧
""" """
episodes_info = TmdbChain().tmdb_episodes(tmdbid=tmdbid, season=season) mediatype = MediaType(type_name)
if not episodes_info:
return []
else:
return episodes_info
@router.get("/{tmdbid}/similar", summary="类似电影/电视剧", response_model=List[schemas.MediaInfo])
def movie_similar(tmdbid: int,
mtype: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
根据TMDBID查询类似电影
"""
mediatype = MediaType(mtype)
if mediatype == MediaType.MOVIE: if mediatype == MediaType.MOVIE:
tmdbinfos = TmdbChain().movie_similar(tmdbid=tmdbid) tmdbinfos = TmdbChain().movie_similar(tmdbid=tmdbid)
elif mediatype == MediaType.TV: elif mediatype == MediaType.TV:
@ -56,14 +44,34 @@ def movie_similar(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("/{tmdbid}/credits", summary="演员阵容", response_model=List[schemas.TmdbCast]) @router.get("/recommend/{tmdbid}/{type_name}", summary="推荐电影/电视剧", response_model=List[schemas.MediaInfo])
def movie_similar(tmdbid: int, def recommend(tmdbid: int,
mtype: str, type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
根据TMDBID查询演员阵容 根据TMDBID查询推荐电影/电视剧type_name: 电影/电视剧
""" """
mediatype = MediaType(mtype) mediatype = MediaType(type_name)
if mediatype == MediaType.MOVIE:
tmdbinfos = TmdbChain().movie_recommend(tmdbid=tmdbid)
elif mediatype == MediaType.TV:
tmdbinfos = TmdbChain().tv_recommend(tmdbid=tmdbid)
else:
return []
if not tmdbinfos:
return []
else:
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:
"""
根据TMDBID查询演员阵容type_name: 电影/电视剧
"""
mediatype = MediaType(type_name)
if mediatype == MediaType.MOVIE: if mediatype == MediaType.MOVIE:
tmdbinfos = TmdbChain().movie_credits(tmdbid=tmdbid) tmdbinfos = TmdbChain().movie_credits(tmdbid=tmdbid)
elif mediatype == MediaType.TV: elif mediatype == MediaType.TV:
@ -73,7 +81,7 @@ def movie_similar(tmdbid: int,
if not tmdbinfos: if not tmdbinfos:
return [] return []
else: else:
return tmdbinfos return [schemas.TmdbCast(**tmdbinfo) for tmdbinfo in tmdbinfos]
@router.get("/movies", summary="TMDB电影", response_model=List[schemas.MediaInfo]) @router.get("/movies", summary="TMDB电影", response_model=List[schemas.MediaInfo])
@ -126,15 +134,34 @@ def tmdb_trending(page: int = 1,
return [MediaInfo(tmdb_info=info).to_dict() for info in infos] return [MediaInfo(tmdb_info=info).to_dict() for info in infos]
@router.get("/{tmdbid}", summary="TMDB详情", response_model=schemas.MediaInfo) @router.get("/{tmdbid}/{season}", summary="TMDB季所有集", response_model=List[schemas.TmdbEpisode])
def tmdb_info(tmdbid: int, type_name: str, def tmdb_season_episodes(tmdbid: int, season: int,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
根据TMDBID查询themoviedb媒体信息type_name: 电影/电视剧 根据TMDBID查询某季的所有信信息
"""
episodes_info = TmdbChain().tmdb_episodes(tmdbid=tmdbid, season=season)
if not episodes_info:
return []
else:
return episodes_info
@router.get("/{mediaid}", summary="TMDB详情", response_model=schemas.MediaInfo)
def tmdb_info(mediaid: str, type_name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
根据媒体ID查询themoviedb媒体信息type_name: 电影/电视剧
""" """
mtype = MediaType(type_name) mtype = MediaType(type_name)
tmdbinfo = TmdbChain().tmdb_info(tmdbid=tmdbid, mtype=mtype) if mediaid.startswith("tmdb:"):
if not tmdbinfo: result = TmdbChain().tmdb_info(int(mediaid[5:]), mtype)
return MediaInfo(tmdb_info=result).to_dict()
elif mediaid.startswith("douban:"):
result = DoubanChain().recognize_by_doubanid(mediaid[7:])
if result:
return result.media_info.to_dict()
else:
return schemas.MediaInfo() return schemas.MediaInfo()
else: else:
return MediaInfo(tmdb_info=tmdbinfo).to_dict() return schemas.MediaInfo()

View File

@ -62,6 +62,20 @@ class TmdbChain(ChainBase):
""" """
return self.run_module("tv_similar", tmdbid=tmdbid) return self.run_module("tv_similar", tmdbid=tmdbid)
def movie_recommend(self, tmdbid: int) -> List[dict]:
"""
根据TMDBID查询推荐电影
:param tmdbid: TMDBID
"""
return self.run_module("movie_recommend", tmdbid=tmdbid)
def tv_recommend(self, tmdbid: int) -> List[dict]:
"""
根据TMDBID查询推荐电视剧
:param tmdbid: TMDBID
"""
return self.run_module("tv_recommend", tmdbid=tmdbid)
def movie_credits(self, tmdbid: int) -> List[dict]: def movie_credits(self, tmdbid: int) -> List[dict]:
""" """
根据TMDBID查询电影演职人员 根据TMDBID查询电影演职人员

View File

@ -272,8 +272,7 @@ class TheMovieDbModule(_ModuleBase):
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:
images = self.tmdb.get_movie_images(mediainfo.tmdb_id) images = self.tmdb.get_movie_images(mediainfo.tmdb_id)
else: else:
# FIXME tmdbv3api库没有tv.images接口只能取第1季的 images = self.tmdb.get_tv_images(mediainfo.tmdb_id)
images = self.tmdb.get_tv_images(mediainfo.tmdb_id, season=1)
if not images: if not images:
return mediainfo return mediainfo
if isinstance(images, list): if isinstance(images, list):
@ -346,6 +345,20 @@ class TheMovieDbModule(_ModuleBase):
""" """
return self.tmdb.get_tv_similar(tmdbid=tmdbid) return self.tmdb.get_tv_similar(tmdbid=tmdbid)
def movie_recommend(self, tmdbid: int) -> List[dict]:
"""
根据TMDBID查询推荐电影
:param tmdbid: TMDBID
"""
return self.tmdb.get_movie_recommend(tmdbid=tmdbid)
def tv_recommend(self, tmdbid: int) -> List[dict]:
"""
根据TMDBID查询推荐电视剧
:param tmdbid: TMDBID
"""
return self.tmdb.get_tv_recommend(tmdbid=tmdbid)
def movie_credits(self, tmdbid: int) -> List[dict]: def movie_credits(self, tmdbid: int) -> List[dict]:
""" """
根据TMDBID查询电影演职员表 根据TMDBID查询电影演职员表

View File

@ -1033,7 +1033,7 @@ class TmdbHelper:
print(str(e)) print(str(e))
return {} return {}
def get_tv_images(self, tmdbid: int, season: int) -> dict: def get_tv_images(self, tmdbid: int) -> dict:
""" """
获取电视剧的图片 获取电视剧的图片
""" """
@ -1041,7 +1041,7 @@ class TmdbHelper:
return {} return {}
try: try:
logger.info(f"正在获取电视剧图片:{tmdbid}...") logger.info(f"正在获取电视剧图片:{tmdbid}...")
return self.season.images(tv_id=tmdbid, season_num=season) or {} return self.tv.images(tv_id=tmdbid) or {}
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
return {} return {}
@ -1054,8 +1054,7 @@ class TmdbHelper:
return [] return []
try: try:
logger.info(f"正在获取相似电影:{tmdbid}...") logger.info(f"正在获取相似电影:{tmdbid}...")
info = self.movie.similar(tmdbid) or {} info = self.movie.similar(tmdbid) or []
return info.get('results') or []
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
return [] return []
@ -1068,8 +1067,33 @@ class TmdbHelper:
return [] return []
try: try:
logger.info(f"正在获取相似电视剧:{tmdbid}...") logger.info(f"正在获取相似电视剧:{tmdbid}...")
info = self.tv.similar(tmdbid) or {} info = self.tv.similar(tmdbid) or []
return info.get('results') or [] except Exception as e:
print(str(e))
return []
def get_movie_recommend(self, tmdbid: int) -> List[dict]:
"""
获取电影的推荐电影
"""
if not self.movie:
return []
try:
logger.info(f"正在获取推荐电影:{tmdbid}...")
info = self.movie.recommendations(tmdbid) or []
except Exception as e:
print(str(e))
return []
def get_tv_recommend(self, tmdbid: int) -> List[dict]:
"""
获取电视剧的推荐电视剧
"""
if not self.tv:
return []
try:
logger.info(f"正在获取推荐电视剧:{tmdbid}...")
info = self.tv.recommendations(tmdbid) or []
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
return [] return []