v2.2.5: 完善搜索功能,支持按最新/浏览/喜欢/页数排序,以及天/周/月时间区间,增加对应测试 (#124) (#126)

This commit is contained in:
hect0x7 2023-09-08 21:29:28 +08:00
parent dbd3f8ce66
commit cd8952c7ba
6 changed files with 115 additions and 17 deletions

View File

@ -2,7 +2,7 @@
# 被依赖方 <--- 使用方
# config <--- entity <--- toolkit <--- client <--- option <--- downloader
__version__ = '2.2.4'
__version__ = '2.2.5'
from .api import *
from .jm_plugin import *

View File

@ -199,11 +199,19 @@ class JmHtmlClient(AbstractJmClient):
return photo
def search(self, search_query, page, main_tag) -> JmSearchPage:
def search(self,
search_query: str,
page: int,
main_tag: int,
order_by: str,
date: str,
) -> JmSearchPage:
params = {
'main_tag': main_tag,
'search_query': search_query,
'page': page,
'o': order_by,
't': date,
}
resp = self.get_jm_html(
@ -391,7 +399,13 @@ class JmApiClient(AbstractJmClient):
client_key = 'api'
API_SEARCH = '/search'
def search(self, search_query, main_tag=0, page=1) -> JmApiResp:
def search(self,
search_query: str,
page: int,
main_tag: int,
order_by: str,
time: str,
) -> JmApiResp:
"""
model_data: {
"search_query": "MANA",
@ -421,6 +435,8 @@ class JmApiClient(AbstractJmClient):
'search_query': search_query,
'main_tag': main_tag,
'page': page,
'o': order_by,
't': time,
}
)

View File

@ -285,41 +285,82 @@ class JmSearchAlbumClient:
範例:全彩 人妻
"""
def search(self, search_query: str, page: int, main_tag: int) -> JmSearchPage:
ORDER_BY_LATEST = 'mr'
ORDER_BY_VIEW = 'mv'
ORDER_BY_PICTURE = 'mp'
ORDER_BY_LIKE = 'tf'
TIME_TODAY = 't'
TIME_WEEK = 'w'
TIME_MONTH = 'm'
TIME_ALL = 'a'
def search(self,
search_query: str,
page: int,
main_tag: int,
order_by: str,
time: str,
) -> JmSearchPage:
"""
搜索成人A漫
"""
raise NotImplementedError
def search_site(self, search_query: str, page: int = 1) -> JmSearchPage:
def search_site(self,
search_query: str,
page: int = 1,
order_by: str = ORDER_BY_LATEST,
time: str = TIME_ALL,
) -> JmSearchPage:
"""
对应禁漫的站内搜索
"""
return self.search(search_query, page, 0)
return self.search(search_query, page, 0, order_by, time)
def search_work(self, search_query: str, page: int = 1) -> JmSearchPage:
def search_work(self,
search_query: str,
page: int = 1,
order_by: str = ORDER_BY_LATEST,
time: str = TIME_ALL,
) -> JmSearchPage:
"""
搜索album的作品 work
"""
return self.search(search_query, page, 1)
return self.search(search_query, page, 1, order_by, time)
def search_author(self, search_query: str, page: int = 1) -> JmSearchPage:
def search_author(self,
search_query: str,
page: int = 1,
order_by: str = ORDER_BY_LATEST,
time: str = TIME_ALL,
) -> JmSearchPage:
"""
搜索album的作者 author
"""
return self.search(search_query, page, 2)
return self.search(search_query, page, 2, order_by, time)
def search_tag(self, search_query: str, page: int = 1) -> JmSearchPage:
def search_tag(self,
search_query: str,
page: int = 1,
order_by: str = ORDER_BY_LATEST,
time: str = TIME_ALL,
) -> JmSearchPage:
"""
搜索album的标签 tag
"""
return self.search(search_query, page, 3)
return self.search(search_query, page, 3, order_by, time)
def search_actor(self, search_query: str, page: int = 1) -> JmSearchPage:
def search_actor(self,
search_query: str,
page: int = 1,
order_by: str = ORDER_BY_LATEST,
time: str = TIME_ALL,
) -> JmSearchPage:
"""
搜索album的登场角色 actor
"""
return self.search(search_query, page, 4)
return self.search(search_query, page, 4, order_by, time)
# noinspection PyAbstractClass

View File

@ -419,6 +419,9 @@ class JmSearchPage(JmBaseEntity, IterableEntity):
def __getitem__(self, item):
return self.album_info_list[item][0:2]
def __iter__(self) -> Generator[List[str], Any, None]:
return super().__iter__()
@property
def single_album(self) -> JmAlbumDetail:
return getattr(self, 'album')

View File

@ -49,7 +49,7 @@ class DirRule:
解析下载路径dsl得到一个路径规则解析列表
"""
if '_' not in rule_dsl:
if '_' not in rule_dsl and rule_dsl != 'Bd':
raise NotImplementedError(f'不支持的dsl: "{rule_dsl}"')
rule_ls = rule_dsl.split('_')
@ -273,7 +273,7 @@ class JmOption:
"""
return self.new_jm_client(**kwargs)
def new_jm_client(self, domain_list=None, **kwargs) -> JmcomicClient:
def new_jm_client(self, domain_list=None, impl=None, **kwargs) -> JmcomicClient:
postman_conf: dict = self.client.postman.src_dict
# support kwargs overwrite meta_data
@ -291,7 +291,7 @@ class JmOption:
domain_list = [JmModuleConfig.domain()]
# client
client = JmModuleConfig.client_impl_class(self.client.impl)(
client = JmModuleConfig.client_impl_class(impl or self.client.impl)(
postman,
self.client.retry_times,
fallback_domain_list=domain_list,

View File

@ -164,3 +164,41 @@ class Test_Api(JmTestConfigurable):
list1=[int(e.img_file_name) for e in ls],
list2=ans,
)
def test_search_advanced(self):
elist = []
def search_and_test(expected_result, params):
try:
page = self.client.search_site(**params)
print(page)
assert int(page[0][0]) == expected_result
except Exception as e:
elist.append(e)
# 定义测试用例
cases = {
152637: {
'search_query': '无修正',
'order_by': JmSearchAlbumClient.ORDER_BY_LIKE,
'time': JmSearchAlbumClient.TIME_ALL,
},
147643: {
'search_query': '无修正',
'order_by': JmSearchAlbumClient.ORDER_BY_PICTURE,
'time': JmSearchAlbumClient.TIME_ALL,
},
}
multi_thread_launcher(
iter_objs=cases.items(),
apply_each_obj_func=search_and_test,
)
if len(elist) == 0:
return
for e in elist:
print(e)
raise AssertionError(elist)