feat:媒体信息聚合

This commit is contained in:
jxxghp
2024-04-27 15:20:46 +08:00
parent 26b5ad6a44
commit 7a37078e90
19 changed files with 274 additions and 105 deletions

View File

@ -79,7 +79,7 @@ class BangumiModule(_ModuleBase):
:param page: 页码
:param count: 数量
"""
persons = self.bangumiapi.persons(bangumiid) or []
persons = self.bangumiapi.credits(bangumiid)
if persons:
return persons[(page - 1) * count: page * count]
else:
@ -90,4 +90,19 @@ class BangumiModule(_ModuleBase):
根据BangumiID查询推荐电影
:param bangumiid: BangumiID
"""
return self.bangumiapi.subjects(bangumiid) or []
return self.bangumiapi.subjects(bangumiid)
def bangumi_person_detail(self, person_id: int) -> dict:
"""
获取人物详细信息
:param person_id: 豆瓣人物ID
"""
return self.bangumiapi.person_detail(person_id)
def bangumi_person_credits(self, person_id: int, page: int = 1) -> List[dict]:
"""
根据TMDBID查询人物参演作品
:param person_id: 人物ID
:param page: 页码
"""
return self.bangumiapi.person_credits(person_id=person_id, page=page)

View File

@ -14,9 +14,11 @@ class BangumiApi(object):
_urls = {
"calendar": "calendar",
"detail": "v0/subjects/%s",
"persons": "v0/subjects/%s/persons",
"credits": "v0/subjects/%s/persons",
"subjects": "v0/subjects/%s/subjects",
"characters": "v0/subjects/%s/characters"
"characters": "v0/subjects/%s/characters",
"person_detail": "v0/persons/%s",
"person_credits": "v0/persons/%s/subjects",
}
_base_url = "https://api.bgm.tv/"
_req = RequestUtils(session=requests.Session())
@ -142,7 +144,7 @@ class BangumiApi(object):
"""
return self.__invoke(self._urls["detail"] % bid, _ts=datetime.strftime(datetime.now(), '%Y%m%d'))
def persons(self, bid: int):
def credits(self, bid: int):
"""
获取番剧人物
"""
@ -163,3 +165,20 @@ class BangumiApi(object):
获取关联条目信息
"""
return self.__invoke(self._urls["subjects"] % bid, _ts=datetime.strftime(datetime.now(), '%Y%m%d'))
def person_detail(self, person_id: int):
"""
获取人物详细信息
"""
return self.__invoke(self._urls["person_detail"] % person_id, _ts=datetime.strftime(datetime.now(), '%Y%m%d'))
def person_credits(self, person_id: int, page: int = 1):
"""
获取人物参演作品
"""
ret_list = []
result = self.__invoke(self._urls["person_credits"] % person_id, _ts=datetime.strftime(datetime.now(), '%Y%m%d'))
if result:
for item in result:
ret_list.append(item)
return ret_list[(page - 1) * 20: page * 20]

View File

@ -13,6 +13,7 @@ from app.modules import _ModuleBase
from app.modules.douban.apiv2 import DoubanApi
from app.modules.douban.douban_cache import DoubanCache
from app.modules.douban.scraper import DoubanScraper
from app.schemas import MediaPerson
from app.schemas.types import MediaType
from app.utils.common import retry
from app.utils.http import RequestUtils
@ -536,10 +537,6 @@ class DoubanModule(_ModuleBase):
:param meta: 识别的元数据
:reutrn: 媒体信息
"""
# 未启用豆瓣搜索时返回None
if settings.RECOGNIZE_SOURCE != "douban":
return None
if not meta.name:
return []
result = self.doubanapi.search(meta.name)
@ -563,6 +560,23 @@ class DoubanModule(_ModuleBase):
media.season = meta.begin_season
return ret_medias
def search_persons(self, name: str) -> Optional[List[MediaPerson]]:
"""
搜索人物信息
"""
if not name:
return []
result = self.doubanapi.person_search(keyword=name)
if result and result.get('items'):
return [MediaPerson(source='douban', **{
'id': item.get('target_id'),
'name': item.get('target', {}).get('title'),
'url': item.get('target', {}).get('url'),
'images': item.get('target', {}).get('cover', {}),
'avatar': item.get('target', {}).get('cover_img', {}).get('url'),
}) for item in result.get('items')]
return []
@retry(Exception, 5, 3, 3, logger=logger)
def match_doubaninfo(self, name: str, imdbid: str = None,
mtype: MediaType = None, year: str = None, season: int = None) -> dict:
@ -804,11 +818,39 @@ class DoubanModule(_ModuleBase):
根据豆瓣ID查询推荐电影
:param doubanid: 豆瓣ID
"""
return self.doubanapi.movie_recommendations(subject_id=doubanid) or []
return self.doubanapi.movie_recommendations(subject_id=doubanid)
def douban_tv_recommend(self, doubanid: str) -> List[dict]:
"""
根据豆瓣ID查询推荐电视剧
:param doubanid: 豆瓣ID
"""
return self.doubanapi.tv_recommendations(subject_id=doubanid) or []
return self.doubanapi.tv_recommendations(subject_id=doubanid)
def douban_person_detail(self, person_id: int) -> dict:
"""
获取人物详细信息
:param person_id: 豆瓣人物ID
"""
return self.doubanapi.person_detail(person_id)
def douban_person_credits(self, person_id: int, page: int = 1) -> List[dict]:
"""
根据TMDBID查询人物参演作品
:param person_id: 人物ID
:param page: 页码
"""
# 获取人物参演作品集
personinfo = self.doubanapi.person_detail(person_id)
if not personinfo:
return []
collection_id = None
for module in personinfo.get("modules"):
if module.get("type") == "work_collections":
collection_id = module.get("payload", {}).get("id")
# 查询作品集内容
if collection_id:
collections = self.doubanapi.person_work(subject_id=collection_id, start=(page - 1) * 20, count=20)
if collections:
return collections.get("works")
return []

View File

@ -488,15 +488,16 @@ class DoubanApi(metaclass=Singleton):
return self.__invoke(self._urls["tv_photos"] % subject_id,
start=start, count=count, _ts=ts)
def person_detail(self, subject_id):
def person_detail(self, subject_id: int):
"""
用户详情
:param subject_id: 人物 id
:return:
"""
return self.__invoke(self._urls["person_detail"] + subject_id)
return self.__invoke(self._urls["person_detail"] + str(subject_id))
def person_work(self, subject_id, start=0, count=20, sort_by="time", collection_title="影视",
def person_work(self, subject_id: int, start: int = 0, count: int = 20, sort_by: str = "time",
collection_title: str = "影视",
ts=datetime.strftime(datetime.now(), '%Y%m%d')):
"""
用户作品集

View File

@ -13,7 +13,7 @@ from app.modules.themoviedb.category import CategoryHelper
from app.modules.themoviedb.scraper import TmdbScraper
from app.modules.themoviedb.tmdb_cache import TmdbCache
from app.modules.themoviedb.tmdbapi import TmdbApi
from app.schemas import TmdbPerson
from app.schemas import MediaPerson
from app.schemas.types import MediaType, MediaImageType
from app.utils.http import RequestUtils
from app.utils.system import SystemUtils
@ -227,10 +227,6 @@ class TheMovieDbModule(_ModuleBase):
:param meta: 识别的元数据
:reutrn: 媒体信息列表
"""
# 未启用时返回None
if settings.RECOGNIZE_SOURCE != "themoviedb":
return None
if not meta.name:
return []
if meta.type == MediaType.UNKNOWN and not meta.year:
@ -262,17 +258,15 @@ class TheMovieDbModule(_ModuleBase):
return medias
return []
def search_persons(self, name: str) -> Optional[List[TmdbPerson]]:
def search_persons(self, name: str) -> Optional[List[MediaPerson]]:
"""
搜索人物信息
"""
if settings.RECOGNIZE_SOURCE != "themoviedb":
return None
if not name:
return []
results = self.tmdb.search_persons(name)
if results:
return [TmdbPerson(**person) for person in results]
return [MediaPerson(source='themoviedb', **person) for person in results]
return []
def scrape_metadata(self, path: Path, mediainfo: MediaInfo, transfer_type: str,