Skip to content

Commit cd8952c

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

File tree

6 files changed

+119
-21
lines changed

6 files changed

+119
-21
lines changed

src/jmcomic/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# 被依赖方 <--- 使用方
33
# config <--- entity <--- toolkit <--- client <--- option <--- downloader
44

5-
__version__ = '2.2.4'
5+
__version__ = '2.2.5'
66

77
from .api import *
88
from .jm_plugin import *

src/jmcomic/jm_client_impl.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,19 @@ def get_photo_detail(self, photo_id, fetch_album=True) -> JmPhotoDetail:
199199

200200
return photo
201201

202-
def search(self, search_query, page, main_tag) -> JmSearchPage:
202+
def search(self,
203+
search_query: str,
204+
page: int,
205+
main_tag: int,
206+
order_by: str,
207+
date: str,
208+
) -> JmSearchPage:
203209
params = {
204210
'main_tag': main_tag,
205211
'search_query': search_query,
206212
'page': page,
213+
'o': order_by,
214+
't': date,
207215
}
208216

209217
resp = self.get_jm_html(
@@ -391,7 +399,13 @@ class JmApiClient(AbstractJmClient):
391399
client_key = 'api'
392400
API_SEARCH = '/search'
393401

394-
def search(self, search_query, main_tag=0, page=1) -> JmApiResp:
402+
def search(self,
403+
search_query: str,
404+
page: int,
405+
main_tag: int,
406+
order_by: str,
407+
time: str,
408+
) -> JmApiResp:
395409
"""
396410
model_data: {
397411
"search_query": "MANA",
@@ -421,6 +435,8 @@ def search(self, search_query, main_tag=0, page=1) -> JmApiResp:
421435
'search_query': search_query,
422436
'main_tag': main_tag,
423437
'page': page,
438+
'o': order_by,
439+
't': time,
424440
}
425441
)
426442

src/jmcomic/jm_client_interface.py

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -285,41 +285,82 @@ class JmSearchAlbumClient:
285285
範例:全彩 人妻
286286
"""
287287

288-
def search(self, search_query: str, page: int, main_tag: int) -> JmSearchPage:
288+
ORDER_BY_LATEST = 'mr'
289+
ORDER_BY_VIEW = 'mv'
290+
ORDER_BY_PICTURE = 'mp'
291+
ORDER_BY_LIKE = 'tf'
292+
293+
TIME_TODAY = 't'
294+
TIME_WEEK = 'w'
295+
TIME_MONTH = 'm'
296+
TIME_ALL = 'a'
297+
298+
def search(self,
299+
search_query: str,
300+
page: int,
301+
main_tag: int,
302+
order_by: str,
303+
time: str,
304+
) -> JmSearchPage:
289305
"""
290306
搜索【成人A漫】
291307
"""
292308
raise NotImplementedError
293309

294-
def search_site(self, search_query: str, page: int = 1) -> JmSearchPage:
310+
def search_site(self,
311+
search_query: str,
312+
page: int = 1,
313+
order_by: str = ORDER_BY_LATEST,
314+
time: str = TIME_ALL,
315+
) -> JmSearchPage:
295316
"""
296317
对应禁漫的站内搜索
297318
"""
298-
return self.search(search_query, page, 0)
299-
300-
def search_work(self, search_query: str, page: int = 1) -> JmSearchPage:
319+
return self.search(search_query, page, 0, order_by, time)
320+
321+
def search_work(self,
322+
search_query: str,
323+
page: int = 1,
324+
order_by: str = ORDER_BY_LATEST,
325+
time: str = TIME_ALL,
326+
) -> JmSearchPage:
301327
"""
302328
搜索album的作品 work
303329
"""
304-
return self.search(search_query, page, 1)
305-
306-
def search_author(self, search_query: str, page: int = 1) -> JmSearchPage:
330+
return self.search(search_query, page, 1, order_by, time)
331+
332+
def search_author(self,
333+
search_query: str,
334+
page: int = 1,
335+
order_by: str = ORDER_BY_LATEST,
336+
time: str = TIME_ALL,
337+
) -> JmSearchPage:
307338
"""
308339
搜索album的作者 author
309340
"""
310-
return self.search(search_query, page, 2)
311-
312-
def search_tag(self, search_query: str, page: int = 1) -> JmSearchPage:
341+
return self.search(search_query, page, 2, order_by, time)
342+
343+
def search_tag(self,
344+
search_query: str,
345+
page: int = 1,
346+
order_by: str = ORDER_BY_LATEST,
347+
time: str = TIME_ALL,
348+
) -> JmSearchPage:
313349
"""
314350
搜索album的标签 tag
315351
"""
316-
return self.search(search_query, page, 3)
317-
318-
def search_actor(self, search_query: str, page: int = 1) -> JmSearchPage:
352+
return self.search(search_query, page, 3, order_by, time)
353+
354+
def search_actor(self,
355+
search_query: str,
356+
page: int = 1,
357+
order_by: str = ORDER_BY_LATEST,
358+
time: str = TIME_ALL,
359+
) -> JmSearchPage:
319360
"""
320361
搜索album的登场角色 actor
321362
"""
322-
return self.search(search_query, page, 4)
363+
return self.search(search_query, page, 4, order_by, time)
323364

324365

325366
# noinspection PyAbstractClass

src/jmcomic/jm_entity.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,9 @@ def __len__(self):
419419
def __getitem__(self, item):
420420
return self.album_info_list[item][0:2]
421421

422+
def __iter__(self) -> Generator[List[str], Any, None]:
423+
return super().__iter__()
424+
422425
@property
423426
def single_album(self) -> JmAlbumDetail:
424427
return getattr(self, 'album')

src/jmcomic/jm_option.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def get_role_solver_list(self, rule_dsl: str, base_dir: str) -> RuleSolverList:
4949
解析下载路径dsl,得到一个路径规则解析列表
5050
"""
5151

52-
if '_' not in rule_dsl:
52+
if '_' not in rule_dsl and rule_dsl != 'Bd':
5353
raise NotImplementedError(f'不支持的dsl: "{rule_dsl}"')
5454

5555
rule_ls = rule_dsl.split('_')
@@ -273,7 +273,7 @@ def build_jm_client(self, **kwargs):
273273
"""
274274
return self.new_jm_client(**kwargs)
275275

276-
def new_jm_client(self, domain_list=None, **kwargs) -> JmcomicClient:
276+
def new_jm_client(self, domain_list=None, impl=None, **kwargs) -> JmcomicClient:
277277
postman_conf: dict = self.client.postman.src_dict
278278

279279
# support kwargs overwrite meta_data
@@ -291,7 +291,7 @@ def new_jm_client(self, domain_list=None, **kwargs) -> JmcomicClient:
291291
domain_list = [JmModuleConfig.domain()]
292292

293293
# client
294-
client = JmModuleConfig.client_impl_class(self.client.impl)(
294+
client = JmModuleConfig.client_impl_class(impl or self.client.impl)(
295295
postman,
296296
self.client.retry_times,
297297
fallback_domain_list=domain_list,

tests/test_jmcomic/test_jm_api.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,41 @@ def test_getitem_and_slice(self):
164164
list1=[int(e.img_file_name) for e in ls],
165165
list2=ans,
166166
)
167+
168+
def test_search_advanced(self):
169+
elist = []
170+
171+
def search_and_test(expected_result, params):
172+
try:
173+
page = self.client.search_site(**params)
174+
print(page)
175+
assert int(page[0][0]) == expected_result
176+
except Exception as e:
177+
elist.append(e)
178+
179+
# 定义测试用例
180+
cases = {
181+
152637: {
182+
'search_query': '无修正',
183+
'order_by': JmSearchAlbumClient.ORDER_BY_LIKE,
184+
'time': JmSearchAlbumClient.TIME_ALL,
185+
},
186+
147643: {
187+
'search_query': '无修正',
188+
'order_by': JmSearchAlbumClient.ORDER_BY_PICTURE,
189+
'time': JmSearchAlbumClient.TIME_ALL,
190+
},
191+
}
192+
193+
multi_thread_launcher(
194+
iter_objs=cases.items(),
195+
apply_each_obj_func=search_and_test,
196+
)
197+
198+
if len(elist) == 0:
199+
return
200+
201+
for e in elist:
202+
print(e)
203+
204+
raise AssertionError(elist)

0 commit comments

Comments
 (0)