feat 支持IMDBID搜索
This commit is contained in:
parent
4298e36d74
commit
2e2ce32c54
@ -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]
|
||||||
|
@ -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]:
|
||||||
"""
|
"""
|
||||||
|
@ -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 = []
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user