diff --git a/app/api/endpoints/search.py b/app/api/endpoints/search.py index 5b0c50e2..2dad3b78 100644 --- a/app/api/endpoints/search.py +++ b/app/api/endpoints/search.py @@ -31,6 +31,7 @@ def search_by_id(mediaid: str, title: str = None, year: int = None, season: str = None, + sites: str = None, _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 根据TMDBID/豆瓣ID精确搜索站点资源 tmdb:/douban:/bangumi: @@ -39,6 +40,10 @@ def search_by_id(mediaid: str, mtype = MediaType(mtype) if season: season = int(season) + if sites: + site_list = [int(site) for site in sites.split(",") if site] + else: + site_list = None torrents = None # 根据前缀识别媒体ID if mediaid.startswith("tmdb:"): @@ -48,11 +53,13 @@ def search_by_id(mediaid: str, doubaninfo = MediaChain().get_doubaninfo_by_tmdbid(tmdbid=tmdbid, mtype=mtype) if doubaninfo: torrents = SearchChain().search_by_id(doubanid=doubaninfo.get("id"), - mtype=mtype, area=area, season=season) + mtype=mtype, area=area, season=season, + sites=site_list) else: return schemas.Response(success=False, message="未识别到豆瓣媒体信息") else: - torrents = SearchChain().search_by_id(tmdbid=tmdbid, mtype=mtype, area=area, season=season) + torrents = SearchChain().search_by_id(tmdbid=tmdbid, mtype=mtype, area=area, season=season, + sites=site_list) elif mediaid.startswith("douban:"): doubanid = mediaid.replace("douban:", "") if settings.RECOGNIZE_SOURCE == "themoviedb": @@ -62,11 +69,13 @@ def search_by_id(mediaid: str, if tmdbinfo.get('season') and not season: season = tmdbinfo.get('season') torrents = SearchChain().search_by_id(tmdbid=tmdbinfo.get("id"), - mtype=mtype, area=area, season=season) + mtype=mtype, area=area, season=season, + sites=site_list) else: return schemas.Response(success=False, message="未识别到TMDB媒体信息") else: - torrents = SearchChain().search_by_id(doubanid=doubanid, mtype=mtype, area=area, season=season) + torrents = SearchChain().search_by_id(doubanid=doubanid, mtype=mtype, area=area, season=season, + sites=site_list) elif mediaid.startswith("bangumi:"): bangumiid = int(mediaid.replace("bangumi:", "")) if settings.RECOGNIZE_SOURCE == "themoviedb": @@ -74,7 +83,8 @@ def search_by_id(mediaid: str, tmdbinfo = MediaChain().get_tmdbinfo_by_bangumiid(bangumiid=bangumiid) if tmdbinfo: torrents = SearchChain().search_by_id(tmdbid=tmdbinfo.get("id"), - mtype=mtype, area=area, season=season) + mtype=mtype, area=area, season=season, + sites=site_list) else: return schemas.Response(success=False, message="未识别到TMDB媒体信息") else: @@ -82,7 +92,8 @@ def search_by_id(mediaid: str, doubaninfo = MediaChain().get_doubaninfo_by_bangumiid(bangumiid=bangumiid) if doubaninfo: torrents = SearchChain().search_by_id(doubanid=doubaninfo.get("id"), - mtype=mtype, area=area, season=season) + mtype=mtype, area=area, season=season, + sites=site_list) else: return schemas.Response(success=False, message="未识别到豆瓣媒体信息") else: @@ -133,12 +144,13 @@ def search_by_id(mediaid: str, @router.get("/title", summary="模糊搜索资源", response_model=schemas.Response) def search_by_title(keyword: str = None, page: int = 0, - sites: List[int] = None, + sites: str = None, _: schemas.TokenPayload = Depends(verify_token)) -> Any: """ 根据名称模糊搜索站点资源,支持分页,关键词为空是返回首页资源 """ - torrents = SearchChain().search_by_title(title=keyword, page=page, sites=sites) + torrents = SearchChain().search_by_title(title=keyword, page=page, + sites=[int(site) for site in sites.split(",") if site] if sites else None) if not torrents: return schemas.Response(success=False, message="未搜索到任何资源") return schemas.Response(success=True, data=[torrent.to_dict() for torrent in torrents]) diff --git a/app/chain/search.py b/app/chain/search.py index eb6496d1..24d9edf7 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -35,7 +35,8 @@ class SearchChain(ChainBase): self.torrenthelper = TorrentHelper() def search_by_id(self, tmdbid: int = None, doubanid: str = None, - mtype: MediaType = None, area: str = "title", season: int = None) -> List[Context]: + mtype: MediaType = None, area: str = "title", season: int = None, + sites: List[int] = None) -> List[Context]: """ 根据TMDBID/豆瓣ID搜索资源,精确匹配,不过滤本地存在的资源 :param tmdbid: TMDB ID @@ -43,6 +44,7 @@ class SearchChain(ChainBase): :param mtype: 媒体,电影 or 电视剧 :param area: 搜索范围,title or imdbid :param season: 季数 + :param sites: 站点ID列表 """ mediainfo = self.recognize_media(tmdbid=tmdbid, doubanid=doubanid, mtype=mtype) if not mediainfo: @@ -55,7 +57,7 @@ class SearchChain(ChainBase): season: NotExistMediaInfo(episodes=[]) } } - results = self.process(mediainfo=mediainfo, area=area, no_exists=no_exists) + results = self.process(mediainfo=mediainfo, sites=sites, area=area, no_exists=no_exists) # 保存到本地文件 bytes_results = pickle.dumps(results) self.save_cache(bytes_results, self.__result_temp_file) @@ -75,7 +77,7 @@ class SearchChain(ChainBase): else: logger.info(f'开始浏览资源,站点:{sites} ...') # 搜索 - torrents = self.__search_all_sites(keywords=[title], sites=sites if sites else None, page=page) or [] + torrents = self.__search_all_sites(keywords=[title], sites=sites, page=page) or [] if not torrents: logger.warn(f'{title} 未搜索到资源') return [] diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index 34b5d679..3c8c782c 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -173,7 +173,7 @@ class TheMovieDbModule(_ModuleBase): if info and not info.get("genres"): info = self.tmdb.get_info(mtype=info.get("media_type"), tmdbid=info.get("id")) - else: + elif not info: logger.error("识别媒体信息时未提供元数据或唯一且有效的tmdbid") return None