feat:支持搜索系列合集

This commit is contained in:
jxxghp
2025-01-16 17:51:47 +08:00
parent bd6e43c41d
commit adeb5361ab
9 changed files with 88 additions and 3 deletions
+3 -1
View File
@@ -72,7 +72,7 @@ def search(title: str,
""" """
模糊搜索媒体/人物信息列表 media:媒体信息,person:人物信息 模糊搜索媒体/人物信息列表 media:媒体信息,person:人物信息
""" """
def __get_source(obj: Union[dict, schemas.MediaPerson]): def __get_source(obj: Union[schemas.MediaInfo, schemas.MediaPerson, dict]):
""" """
获取对象属性 获取对象属性
""" """
@@ -85,6 +85,8 @@ def search(title: str,
_, medias = MediaChain().search(title=title) _, medias = MediaChain().search(title=title)
if medias: if medias:
result = [media.to_dict() for media in medias] result = [media.to_dict() for media in medias]
elif type == "collection":
result = MediaChain().search_collections(name=title)
else: else:
result = MediaChain().search_persons(name=title) result = MediaChain().search_persons(name=title)
if result: if result:
+14
View File
@@ -60,6 +60,20 @@ def tmdb_recommend(tmdbid: int,
return [] return []
@router.get("/collection/{collection_id}", summary="系列合集详情", response_model=List[schemas.MediaInfo])
def tmdb_collection(collection_id: int,
page: int = 1,
count: int = 20,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
根据合集ID查询合集详情
"""
medias = TmdbChain().tmdb_collection(collection_id=collection_id)
if medias:
return [media.to_dict() for media in medias][(page - 1) * count:page * count]
return []
@router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.MediaPerson]) @router.get("/credits/{tmdbid}/{type_name}", summary="演员阵容", response_model=List[schemas.MediaPerson])
def tmdb_credits(tmdbid: int, def tmdb_credits(tmdbid: int,
type_name: str, type_name: str,
+7
View File
@@ -301,6 +301,13 @@ class ChainBase(metaclass=ABCMeta):
""" """
return self.run_module("search_persons", name=name) return self.run_module("search_persons", name=name)
def search_collections(self, name: str) -> Optional[List[MediaInfo]]:
"""
搜索集合信息
:param name: 集合名称
"""
return self.run_module("search_collections", name=name)
def search_torrents(self, site: CommentedMap, def search_torrents(self, site: CommentedMap,
keywords: List[str], keywords: List[str],
mtype: MediaType = None, mtype: MediaType = None,
+7
View File
@@ -38,6 +38,13 @@ class TmdbChain(ChainBase, metaclass=Singleton):
""" """
return self.run_module("tmdb_trending", page=page) return self.run_module("tmdb_trending", page=page)
def tmdb_collection(self, collection_id: int) -> Optional[List[MediaInfo]]:
"""
根据合集ID查询集合
:param collection_id: 合集ID
"""
return self.run_module("tmdb_collection", collection_id=collection_id)
def tmdb_seasons(self, tmdbid: int) -> List[schemas.TmdbSeason]: def tmdb_seasons(self, tmdbid: int) -> List[schemas.TmdbSeason]:
""" """
根据TMDBID查询themoviedb所有季信息 根据TMDBID查询themoviedb所有季信息
+4
View File
@@ -178,6 +178,8 @@ class MediaInfo:
douban_id: str = None douban_id: str = None
# Bangumi ID # Bangumi ID
bangumi_id: int = None bangumi_id: int = None
# 合集ID
collection_id: int = None
# 媒体原语种 # 媒体原语种
original_language: str = None original_language: str = None
# 媒体原发行标题 # 媒体原发行标题
@@ -397,6 +399,8 @@ class MediaInfo:
if info.get("external_ids"): if info.get("external_ids"):
self.tvdb_id = info.get("external_ids", {}).get("tvdb_id") self.tvdb_id = info.get("external_ids", {}).get("tvdb_id")
self.imdb_id = info.get("external_ids", {}).get("imdb_id") self.imdb_id = info.get("external_ids", {}).get("imdb_id")
# 合集ID
self.collection_id = info.get('collection_id')
# 评分 # 评分
self.vote_average = round(float(info.get('vote_average')), 1) if info.get('vote_average') else 0 self.vote_average = round(float(info.get('vote_average')), 1) if info.get('vote_average') else 0
# 描述 # 描述
+21
View File
@@ -311,6 +311,27 @@ class TheMovieDbModule(_ModuleBase):
return [MediaPerson(source='themoviedb', **person) for person in results] return [MediaPerson(source='themoviedb', **person) for person in results]
return [] return []
def search_collections(self, name: str) -> Optional[List[MediaInfo]]:
"""
搜索集合信息
"""
if not name:
return []
results = self.tmdb.search_collections(name)
if results:
return [MediaInfo(tmdb_info=info) for info in results]
return []
def tmdb_collection(self, collection_id: int) -> Optional[List[MediaInfo]]:
"""
根据合集ID查询集合
:param collection_id: 合集ID
"""
results = self.tmdb.get_collection(collection_id)
if results:
return [MediaInfo(tmdb_info=info) for info in results]
return []
def metadata_nfo(self, meta: MetaBase, mediainfo: MediaInfo, def metadata_nfo(self, meta: MetaBase, mediainfo: MediaInfo,
season: int = None, episode: int = None) -> Optional[str]: season: int = None, episode: int = None) -> Optional[str]:
""" """
+28 -1
View File
@@ -11,7 +11,7 @@ from app.log import logger
from app.schemas.types import MediaType from app.schemas.types import MediaType
from app.utils.http import RequestUtils from app.utils.http import RequestUtils
from app.utils.string import StringUtils from app.utils.string import StringUtils
from .tmdbv3api import TMDb, Search, Movie, TV, Season, Episode, Discover, Trending, Person from .tmdbv3api import TMDb, Search, Movie, TV, Season, Episode, Discover, Trending, Person, Collection
from .tmdbv3api.exceptions import TMDbException from .tmdbv3api.exceptions import TMDbException
@@ -44,6 +44,7 @@ class TmdbApi:
self.discover = Discover() self.discover = Discover()
self.trending = Trending() self.trending = Trending()
self.person = Person() self.person = Person()
self.collection = Collection()
def search_multiis(self, title: str) -> List[dict]: def search_multiis(self, title: str) -> List[dict]:
""" """
@@ -101,6 +102,32 @@ class TmdbApi:
return [] return []
return self.search.people(term=name) or [] return self.search.people(term=name) or []
def search_collections(self, name: str) -> List[dict]:
"""
查询模糊匹配的所有合集TMDB信息
"""
if not name:
return []
collections = self.search.collections(term=name) or []
for collection in collections:
collection['media_type'] = MediaType.COLLECTION
collection['collection_id'] = collection.get("id")
return collections
def get_collection(self, collection_id: int) -> List[dict]:
"""
根据合集ID查询合集详情
"""
if not collection_id:
return []
try:
return self.collection.details(collection_id=collection_id)
except TMDbException as err:
logger.error(f"连接TMDB出错:{str(err)}")
except Exception as e:
logger.error(f"连接TMDB出错:{str(e)}")
return []
@staticmethod @staticmethod
def __compare_names(file_name: str, tmdb_names: list) -> bool: def __compare_names(file_name: str, tmdb_names: list) -> bool:
""" """
+3 -1
View File
@@ -67,7 +67,7 @@ class MediaInfo(BaseModel):
""" """
# 来源:themoviedb、douban、bangumi # 来源:themoviedb、douban、bangumi
source: Optional[str] = None source: Optional[str] = None
# 类型 电影、电视剧 # 类型 电影、电视剧、合集
type: Optional[str] = None type: Optional[str] = None
# 媒体标题 # 媒体标题
title: Optional[str] = None title: Optional[str] = None
@@ -79,6 +79,8 @@ class MediaInfo(BaseModel):
title_year: Optional[str] = None title_year: Optional[str] = None
# 当前指定季,如有 # 当前指定季,如有
season: Optional[int] = None season: Optional[int] = None
# 合集等id
collection_id: Optional[int] = None
# TMDB ID # TMDB ID
tmdb_id: Optional[int] = None tmdb_id: Optional[int] = None
# IMDB ID # IMDB ID
+1
View File
@@ -5,6 +5,7 @@ from enum import Enum
class MediaType(Enum): class MediaType(Enum):
MOVIE = '电影' MOVIE = '电影'
TV = '电视剧' TV = '电视剧'
COLLECTION = '合集'
UNKNOWN = '未知' UNKNOWN = '未知'