From cd8952c7baa45351faf99a44b7717772c5ab4e9f Mon Sep 17 00:00:00 2001 From: hect0x7 <93357912+hect0x7@users.noreply.github.com> Date: Fri, 8 Sep 2023 21:29:28 +0800 Subject: [PATCH] =?UTF-8?q?v2.2.5:=20=E5=AE=8C=E5=96=84=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E6=8C=89=E6=9C=80?= =?UTF-8?q?=E6=96=B0/=E6=B5=8F=E8=A7=88/=E5=96=9C=E6=AC=A2/=E9=A1=B5?= =?UTF-8?q?=E6=95=B0=E6=8E=92=E5=BA=8F=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=A4=A9?= =?UTF-8?q?/=E5=91=A8/=E6=9C=88=E6=97=B6=E9=97=B4=E5=8C=BA=E9=97=B4?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=B9=E5=BA=94=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20(#124)=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/jmcomic/__init__.py | 2 +- src/jmcomic/jm_client_impl.py | 20 +++++++++- src/jmcomic/jm_client_interface.py | 63 ++++++++++++++++++++++++------ src/jmcomic/jm_entity.py | 3 ++ src/jmcomic/jm_option.py | 6 +-- tests/test_jmcomic/test_jm_api.py | 38 ++++++++++++++++++ 6 files changed, 115 insertions(+), 17 deletions(-) diff --git a/src/jmcomic/__init__.py b/src/jmcomic/__init__.py index 2dc5b2e..91665d1 100644 --- a/src/jmcomic/__init__.py +++ b/src/jmcomic/__init__.py @@ -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 * diff --git a/src/jmcomic/jm_client_impl.py b/src/jmcomic/jm_client_impl.py index aceecdc..402b5ed 100644 --- a/src/jmcomic/jm_client_impl.py +++ b/src/jmcomic/jm_client_impl.py @@ -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, } ) diff --git a/src/jmcomic/jm_client_interface.py b/src/jmcomic/jm_client_interface.py index 87c6539..c39a3a1 100644 --- a/src/jmcomic/jm_client_interface.py +++ b/src/jmcomic/jm_client_interface.py @@ -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 diff --git a/src/jmcomic/jm_entity.py b/src/jmcomic/jm_entity.py index 22eecae..e533862 100644 --- a/src/jmcomic/jm_entity.py +++ b/src/jmcomic/jm_entity.py @@ -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') diff --git a/src/jmcomic/jm_option.py b/src/jmcomic/jm_option.py index 8415f4c..ef8eca3 100644 --- a/src/jmcomic/jm_option.py +++ b/src/jmcomic/jm_option.py @@ -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, diff --git a/tests/test_jmcomic/test_jm_api.py b/tests/test_jmcomic/test_jm_api.py index 2c99909..efa4704 100644 --- a/tests/test_jmcomic/test_jm_api.py +++ b/tests/test_jmcomic/test_jm_api.py @@ -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)