From 2e2ce32c540a127df7c0352df946ce5766fc91d3 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 24 Aug 2023 08:34:29 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=94=AF=E6=8C=81IMDBID=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/search.py | 6 ++++-- app/chain/__init__.py | 6 ++++-- app/chain/search.py | 18 ++++++++++++------ app/modules/indexer/__init__.py | 8 +++++--- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/api/endpoints/search.py b/app/api/endpoints/search.py index a65850ad..cb89b76b 100644 --- a/app/api/endpoints/search.py +++ b/app/api/endpoints/search.py @@ -26,6 +26,7 @@ async def search_latest(db: Session = Depends(get_db), @router.get("/media/{mediaid}", summary="精确搜索资源", response_model=List[schemas.Context]) def search_by_tmdbid(mediaid: str, mtype: str = None, + area: str = "title", db: Session = Depends(get_db), _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ @@ -35,7 +36,7 @@ def search_by_tmdbid(mediaid: str, tmdbid = int(mediaid.replace("tmdb:", "")) if 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:"): 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: raise HTTPException(status_code=404, detail="无法识别TMDB媒体信息!") 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: return [] return [torrent.to_dict() for torrent in torrents] diff --git a/app/chain/__init__.py b/app/chain/__init__.py index c452f58f..672b66b9 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -199,17 +199,19 @@ class ChainBase(metaclass=ABCMeta): def search_torrents(self, site: CommentedMap, mediainfo: Optional[MediaInfo] = None, keyword: str = None, - page: int = 0) -> List[TorrentInfo]: + page: int = 0, + area: str = "title") -> List[TorrentInfo]: """ 搜索一个站点的种子资源 :param site: 站点 :param mediainfo: 识别的媒体信息 :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 :param page: 页码 + :param area: 搜索区域 :reutrn: 资源列表 """ 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]: """ diff --git a/app/chain/search.py b/app/chain/search.py index b1f7c249..e1c30423 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -32,17 +32,18 @@ class SearchChain(ChainBase): self.systemconfig = SystemConfigOper(self._db) 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搜索资源,精确匹配,但不不过滤本地存在的资源 :param tmdbid: TMDB ID :param mtype: 媒体,电影 or 电视剧 + :param area: 搜索范围,title or imdbid """ mediainfo = self.recognize_media(tmdbid=tmdbid, mtype=mtype) if not mediainfo: logger.error(f'{tmdbid} 媒体信息识别失败!') return [] - results = self.process(mediainfo=mediainfo) + results = self.process(mediainfo=mediainfo, area=area) # 保存眲结果 bytes_results = pickle.dumps(results) self.systemconfig.set(SystemConfigKey.SearchResults, bytes_results) @@ -95,7 +96,8 @@ class SearchChain(ChainBase): keyword: str = None, no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None, sites: List[int] = None, - filter_rule: str = None) -> List[Context]: + filter_rule: str = None, + area: str = "title") -> List[Context]: """ 根据媒体信息搜索种子资源,精确匹配,应用过滤规则,同时根据no_exists过滤本地已存在的资源 :param mediainfo: 媒体信息 @@ -103,6 +105,7 @@ class SearchChain(ChainBase): :param no_exists: 缺失的媒体信息 :param sites: 站点ID列表,为空时搜索所有站点 :param filter_rule: 过滤规则,为空是使用默认过滤规则 + :param area: 搜索范围,title or imdbid """ logger.info(f'开始搜索资源,关键词:{keyword or mediainfo.title} ...') # 补充媒体信息 @@ -132,7 +135,8 @@ class SearchChain(ChainBase): torrents = self.__search_all_sites( mediainfo=mediainfo, keyword=keyword, - sites=sites + sites=sites, + area=area ) if torrents: break @@ -233,13 +237,15 @@ class SearchChain(ChainBase): def __search_all_sites(self, mediainfo: Optional[MediaInfo] = None, keyword: str = None, sites: List[int] = None, - page: int = 0) -> Optional[List[TorrentInfo]]: + page: int = 0, + area: str = "title") -> Optional[List[TorrentInfo]]: """ 多线程搜索多个站点 :param mediainfo: 识别的媒体信息 :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 :param sites: 指定站点ID列表,如有则只搜索指定站点,否则搜索所有站点 :param page: 搜索页码 + :param area: 搜索区域 title or imdbid :reutrn: 资源列表 """ # 未开启的站点不搜索 @@ -278,7 +284,7 @@ class SearchChain(ChainBase): all_task = [] for site in indexer_sites: 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) # 结果集 results = [] diff --git a/app/modules/indexer/__init__.py b/app/modules/indexer/__init__.py index 831a9679..7cd677b5 100644 --- a/app/modules/indexer/__init__.py +++ b/app/modules/indexer/__init__.py @@ -28,13 +28,14 @@ class IndexerModule(_ModuleBase): return "INDEXER", "builtin" 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 site: 站点 :param keyword: 搜索关键词,如有按关键词搜索,否则按媒体信息名称搜索 :param page: 页码 + :param area: 搜索区域 title or imdbid :return: 资源列表 """ # 确认搜索的名字 @@ -57,10 +58,11 @@ class IndexerModule(_ModuleBase): # 开始计时 start_time = datetime.now() try: + imdbid = mediainfo.imdb_id if mediainfo and area == "imdbid" else None if site.get('parser') == "TNodeSpider": error_flag, result_array = TNodeSpider(site).search( keyword=search_word, - # imdbid=mediainfo.imdb_id if mediainfo else None, + imdbid=imdbid, page=page ) elif site.get('parser') == "TorrentLeech": @@ -71,7 +73,7 @@ class IndexerModule(_ModuleBase): else: error_flag, result_array = self.__spider_search( keyword=search_word, - # imdbid=mediainfo.imdb_id if mediainfo else None, + imdbid=imdbid, indexer=site, mtype=mediainfo.type if mediainfo else None, page=page