feat 支持IMDBID搜索

This commit is contained in:
jxxghp 2023-08-24 08:34:29 +08:00
parent 4298e36d74
commit 2e2ce32c54
4 changed files with 25 additions and 13 deletions

View File

@ -26,6 +26,7 @@ async def search_latest(db: Session = Depends(get_db),
@router.get("/media/{mediaid}", summary="精确搜索资源", response_model=List[schemas.Context]) @router.get("/media/{mediaid}", summary="精确搜索资源", response_model=List[schemas.Context])
def search_by_tmdbid(mediaid: str, def search_by_tmdbid(mediaid: str,
mtype: str = None, mtype: str = None,
area: str = "title",
db: Session = Depends(get_db), db: Session = Depends(get_db),
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
@ -35,7 +36,7 @@ def search_by_tmdbid(mediaid: str,
tmdbid = int(mediaid.replace("tmdb:", "")) tmdbid = int(mediaid.replace("tmdb:", ""))
if mtype: if mtype:
mtype = MediaType(mtype) mtype = MediaType(mtype)
torrents = SearchChain(db).search_by_tmdbid(tmdbid=tmdbid, mtype=mtype) torrents = SearchChain(db).search_by_tmdbid(tmdbid=tmdbid, mtype=mtype, area=area)
elif mediaid.startswith("douban:"): elif mediaid.startswith("douban:"):
doubanid = mediaid.replace("douban:", "") doubanid = mediaid.replace("douban:", "")
# 识别豆瓣信息 # 识别豆瓣信息
@ -43,7 +44,8 @@ def search_by_tmdbid(mediaid: str,
if not context or not context.media_info or not context.media_info.tmdb_id: if not context or not context.media_info or not context.media_info.tmdb_id:
raise HTTPException(status_code=404, detail="无法识别TMDB媒体信息") raise HTTPException(status_code=404, detail="无法识别TMDB媒体信息")
torrents = SearchChain(db).search_by_tmdbid(tmdbid=context.media_info.tmdb_id, torrents = SearchChain(db).search_by_tmdbid(tmdbid=context.media_info.tmdb_id,
mtype=context.media_info.type) mtype=context.media_info.type,
area=area)
else: else:
return [] return []
return [torrent.to_dict() for torrent in torrents] return [torrent.to_dict() for torrent in torrents]

View File

@ -199,17 +199,19 @@ class ChainBase(metaclass=ABCMeta):
def search_torrents(self, site: CommentedMap, def search_torrents(self, site: CommentedMap,
mediainfo: Optional[MediaInfo] = None, mediainfo: Optional[MediaInfo] = None,
keyword: str = None, keyword: str = None,
page: int = 0) -> List[TorrentInfo]: page: int = 0,
area: str = "title") -> List[TorrentInfo]:
""" """
搜索一个站点的种子资源 搜索一个站点的种子资源
:param site: 站点 :param site: 站点
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索 :param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索
:param page: 页码 :param page: 页码
:param area: 搜索区域
:reutrn: 资源列表 :reutrn: 资源列表
""" """
return self.run_module("search_torrents", mediainfo=mediainfo, site=site, return self.run_module("search_torrents", mediainfo=mediainfo, site=site,
keyword=keyword, page=page) keyword=keyword, page=page, area=area)
def refresh_torrents(self, site: CommentedMap) -> List[TorrentInfo]: def refresh_torrents(self, site: CommentedMap) -> List[TorrentInfo]:
""" """

View File

@ -32,17 +32,18 @@ class SearchChain(ChainBase):
self.systemconfig = SystemConfigOper(self._db) self.systemconfig = SystemConfigOper(self._db)
self.torrenthelper = TorrentHelper() self.torrenthelper = TorrentHelper()
def search_by_tmdbid(self, tmdbid: int, mtype: MediaType = None) -> List[Context]: def search_by_tmdbid(self, tmdbid: int, mtype: MediaType = None, area: str = "title") -> List[Context]:
""" """
根据TMDB ID搜索资源精确匹配但不不过滤本地存在的资源 根据TMDB ID搜索资源精确匹配但不不过滤本地存在的资源
:param tmdbid: TMDB ID :param tmdbid: TMDB ID
:param mtype: 媒体电影 or 电视剧 :param mtype: 媒体电影 or 电视剧
:param area: 搜索范围title or imdbid
""" """
mediainfo = self.recognize_media(tmdbid=tmdbid, mtype=mtype) mediainfo = self.recognize_media(tmdbid=tmdbid, mtype=mtype)
if not mediainfo: if not mediainfo:
logger.error(f'{tmdbid} 媒体信息识别失败!') logger.error(f'{tmdbid} 媒体信息识别失败!')
return [] return []
results = self.process(mediainfo=mediainfo) results = self.process(mediainfo=mediainfo, area=area)
# 保存眲结果 # 保存眲结果
bytes_results = pickle.dumps(results) bytes_results = pickle.dumps(results)
self.systemconfig.set(SystemConfigKey.SearchResults, bytes_results) self.systemconfig.set(SystemConfigKey.SearchResults, bytes_results)
@ -95,7 +96,8 @@ class SearchChain(ChainBase):
keyword: str = None, keyword: str = None,
no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None, no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None,
sites: List[int] = None, sites: List[int] = None,
filter_rule: str = None) -> List[Context]: filter_rule: str = None,
area: str = "title") -> List[Context]:
""" """
根据媒体信息搜索种子资源精确匹配应用过滤规则同时根据no_exists过滤本地已存在的资源 根据媒体信息搜索种子资源精确匹配应用过滤规则同时根据no_exists过滤本地已存在的资源
:param mediainfo: 媒体信息 :param mediainfo: 媒体信息
@ -103,6 +105,7 @@ class SearchChain(ChainBase):
:param no_exists: 缺失的媒体信息 :param no_exists: 缺失的媒体信息
:param sites: 站点ID列表为空时搜索所有站点 :param sites: 站点ID列表为空时搜索所有站点
:param filter_rule: 过滤规则为空是使用默认过滤规则 :param filter_rule: 过滤规则为空是使用默认过滤规则
:param area: 搜索范围title or imdbid
""" """
logger.info(f'开始搜索资源,关键词:{keyword or mediainfo.title} ...') logger.info(f'开始搜索资源,关键词:{keyword or mediainfo.title} ...')
# 补充媒体信息 # 补充媒体信息
@ -132,7 +135,8 @@ class SearchChain(ChainBase):
torrents = self.__search_all_sites( torrents = self.__search_all_sites(
mediainfo=mediainfo, mediainfo=mediainfo,
keyword=keyword, keyword=keyword,
sites=sites sites=sites,
area=area
) )
if torrents: if torrents:
break break
@ -233,13 +237,15 @@ class SearchChain(ChainBase):
def __search_all_sites(self, mediainfo: Optional[MediaInfo] = None, def __search_all_sites(self, mediainfo: Optional[MediaInfo] = None,
keyword: str = None, keyword: str = None,
sites: List[int] = None, sites: List[int] = None,
page: int = 0) -> Optional[List[TorrentInfo]]: page: int = 0,
area: str = "title") -> Optional[List[TorrentInfo]]:
""" """
多线程搜索多个站点 多线程搜索多个站点
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索 :param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索
:param sites: 指定站点ID列表如有则只搜索指定站点否则搜索所有站点 :param sites: 指定站点ID列表如有则只搜索指定站点否则搜索所有站点
:param page: 搜索页码 :param page: 搜索页码
:param area: 搜索区域 title or imdbid
:reutrn: 资源列表 :reutrn: 资源列表
""" """
# 未开启的站点不搜索 # 未开启的站点不搜索
@ -278,7 +284,7 @@ class SearchChain(ChainBase):
all_task = [] all_task = []
for site in indexer_sites: for site in indexer_sites:
task = executor.submit(self.search_torrents, mediainfo=mediainfo, task = executor.submit(self.search_torrents, mediainfo=mediainfo,
site=site, keyword=keyword, page=page) site=site, keyword=keyword, page=page, area=area)
all_task.append(task) all_task.append(task)
# 结果集 # 结果集
results = [] results = []

View File

@ -28,13 +28,14 @@ class IndexerModule(_ModuleBase):
return "INDEXER", "builtin" return "INDEXER", "builtin"
def search_torrents(self, site: CommentedMap, mediainfo: MediaInfo = None, def search_torrents(self, site: CommentedMap, mediainfo: MediaInfo = None,
keyword: str = None, page: int = 0) -> List[TorrentInfo]: keyword: str = None, page: int = 0, area: str = "title") -> List[TorrentInfo]:
""" """
搜索一个站点 搜索一个站点
:param mediainfo: 识别的媒体信息 :param mediainfo: 识别的媒体信息
:param site: 站点 :param site: 站点
:param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索 :param keyword: 搜索关键词如有按关键词搜索否则按媒体信息名称搜索
:param page: 页码 :param page: 页码
:param area: 搜索区域 title or imdbid
:return: 资源列表 :return: 资源列表
""" """
# 确认搜索的名字 # 确认搜索的名字
@ -57,10 +58,11 @@ class IndexerModule(_ModuleBase):
# 开始计时 # 开始计时
start_time = datetime.now() start_time = datetime.now()
try: try:
imdbid = mediainfo.imdb_id if mediainfo and area == "imdbid" else None
if site.get('parser') == "TNodeSpider": if site.get('parser') == "TNodeSpider":
error_flag, result_array = TNodeSpider(site).search( error_flag, result_array = TNodeSpider(site).search(
keyword=search_word, keyword=search_word,
# imdbid=mediainfo.imdb_id if mediainfo else None, imdbid=imdbid,
page=page page=page
) )
elif site.get('parser') == "TorrentLeech": elif site.get('parser') == "TorrentLeech":
@ -71,7 +73,7 @@ class IndexerModule(_ModuleBase):
else: else:
error_flag, result_array = self.__spider_search( error_flag, result_array = self.__spider_search(
keyword=search_word, keyword=search_word,
# imdbid=mediainfo.imdb_id if mediainfo else None, imdbid=imdbid,
indexer=site, indexer=site,
mtype=mediainfo.type if mediainfo else None, mtype=mediainfo.type if mediainfo else None,
page=page page=page