jmcomic 2.5.2__tar.gz → 2.5.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jmcomic-2.5.2/src/jmcomic.egg-info → jmcomic-2.5.3}/PKG-INFO +2 -2
- {jmcomic-2.5.2 → jmcomic-2.5.3}/README.md +1 -1
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/__init__.py +1 -1
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_client_impl.py +7 -5
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_config.py +9 -6
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_exception.py +29 -17
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_option.py +6 -3
- {jmcomic-2.5.2 → jmcomic-2.5.3/src/jmcomic.egg-info}/PKG-INFO +2 -2
- {jmcomic-2.5.2 → jmcomic-2.5.3}/LICENSE +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/setup.cfg +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/setup.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/api.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/cl.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_client_interface.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_downloader.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_entity.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_plugin.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic/jm_toolkit.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic.egg-info/SOURCES.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic.egg-info/dependency_links.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic.egg-info/entry_points.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic.egg-info/requires.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.3}/src/jmcomic.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: jmcomic
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.3
|
|
4
4
|
Summary: Python API For JMComic (禁漫天堂)
|
|
5
5
|
Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
|
|
6
6
|
Author: hect0x7
|
|
@@ -97,8 +97,8 @@ $ jmcomic 422866
|
|
|
97
97
|
- **可扩展性强**
|
|
98
98
|
|
|
99
99
|
- 支持自定义本子/章节/图片下载前后的回调函数
|
|
100
|
-
- 支持自定义日志
|
|
101
100
|
- 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
|
|
101
|
+
- 支持自定义日志、异常监听器
|
|
102
102
|
- **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
|
|
103
103
|
- `登录插件`
|
|
104
104
|
- `硬件占用监控插件`
|
|
@@ -78,8 +78,10 @@ class AbstractJmClient(
|
|
|
78
78
|
:param kwargs: 请求方法的kwargs
|
|
79
79
|
"""
|
|
80
80
|
if domain_index >= len(self.domain_list):
|
|
81
|
-
self.fallback(request, url, domain_index, retry_count, **kwargs)
|
|
82
|
-
|
|
81
|
+
return self.fallback(request, url, domain_index, retry_count, **kwargs)
|
|
82
|
+
|
|
83
|
+
url_backup = url
|
|
84
|
+
|
|
83
85
|
if url.startswith('/'):
|
|
84
86
|
# path → url
|
|
85
87
|
domain = self.domain_list[domain_index]
|
|
@@ -120,9 +122,9 @@ class AbstractJmClient(
|
|
|
120
122
|
self.before_retry(e, kwargs, retry_count, url)
|
|
121
123
|
|
|
122
124
|
if retry_count < self.retry_times:
|
|
123
|
-
return self.request_with_retry(request,
|
|
125
|
+
return self.request_with_retry(request, url_backup, domain_index, retry_count + 1, callback, **kwargs)
|
|
124
126
|
else:
|
|
125
|
-
return self.request_with_retry(request,
|
|
127
|
+
return self.request_with_retry(request, url_backup, domain_index + 1, 0, callback, **kwargs)
|
|
126
128
|
|
|
127
129
|
# noinspection PyMethodMayBeStatic
|
|
128
130
|
def raise_if_resp_should_retry(self, resp):
|
|
@@ -209,7 +211,7 @@ class AbstractJmClient(
|
|
|
209
211
|
def fallback(self, request, url, domain_index, retry_count, **kwargs):
|
|
210
212
|
msg = f"请求重试全部失败: [{url}], {self.domain_list}"
|
|
211
213
|
jm_log('req.fallback', msg)
|
|
212
|
-
ExceptionTool.raises(msg)
|
|
214
|
+
ExceptionTool.raises(msg, {}, RequestRetryAllFailException)
|
|
213
215
|
|
|
214
216
|
# noinspection PyMethodMayBeStatic
|
|
215
217
|
def append_params_to_url(self, url, params):
|
|
@@ -117,10 +117,10 @@ class JmModuleConfig:
|
|
|
117
117
|
|
|
118
118
|
# 移动端API域名
|
|
119
119
|
DOMAIN_API_LIST = str_to_list('''
|
|
120
|
+
www.jmapinode.biz
|
|
120
121
|
www.jmapinode1.top
|
|
121
122
|
www.jmapinode2.top
|
|
122
123
|
www.jmapinode3.top
|
|
123
|
-
www.jmapinode.biz
|
|
124
124
|
www.jmapinode.top
|
|
125
125
|
|
|
126
126
|
''')
|
|
@@ -144,8 +144,11 @@ class JmModuleConfig:
|
|
|
144
144
|
REGISTRY_CLIENT = {}
|
|
145
145
|
# 插件注册表
|
|
146
146
|
REGISTRY_PLUGIN = {}
|
|
147
|
-
#
|
|
148
|
-
|
|
147
|
+
# 异常监听器
|
|
148
|
+
# key: 异常类
|
|
149
|
+
# value: 函数,参数只有异常对象,无需返回值
|
|
150
|
+
# 这个异常类(或者这个异常的子类)的实例将要被raise前,你的listener方法会被调用
|
|
151
|
+
REGISTRY_EXCEPTION_LISTENER = {}
|
|
149
152
|
|
|
150
153
|
# 执行log的函数
|
|
151
154
|
executor_log = default_jm_logging
|
|
@@ -311,7 +314,7 @@ class JmModuleConfig:
|
|
|
311
314
|
# 而如果只想修改几个简单常用的配置,也可以下方的DEFAULT_XXX属性
|
|
312
315
|
JM_OPTION_VER = '2.1'
|
|
313
316
|
DEFAULT_CLIENT_IMPL = 'api' # 默认Client实现类型为网页端
|
|
314
|
-
DEFAULT_CLIENT_CACHE =
|
|
317
|
+
DEFAULT_CLIENT_CACHE = None # 默认关闭Client缓存。缓存的配置详见 CacheRegistry
|
|
315
318
|
DEFAULT_PROXIES = ProxyBuilder.system_proxy() # 默认使用系统代理
|
|
316
319
|
|
|
317
320
|
default_option_dict: dict = {
|
|
@@ -404,8 +407,8 @@ class JmModuleConfig:
|
|
|
404
407
|
cls.REGISTRY_CLIENT[client_class.client_key] = client_class
|
|
405
408
|
|
|
406
409
|
@classmethod
|
|
407
|
-
def
|
|
408
|
-
cls.
|
|
410
|
+
def register_exception_listener(cls, etype, listener):
|
|
411
|
+
cls.REGISTRY_EXCEPTION_LISTENER[etype] = listener
|
|
409
412
|
|
|
410
413
|
|
|
411
414
|
jm_log = JmModuleConfig.jm_log
|
|
@@ -3,9 +3,7 @@ from .jm_entity import *
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class JmcomicException(Exception):
|
|
6
|
-
|
|
7
|
-
jmcomic 模块异常
|
|
8
|
-
"""
|
|
6
|
+
description = 'jmcomic 模块异常'
|
|
9
7
|
|
|
10
8
|
def __init__(self, msg: str, context: dict):
|
|
11
9
|
self.msg = msg
|
|
@@ -16,19 +14,22 @@ class JmcomicException(Exception):
|
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
class ResponseUnexpectedException(JmcomicException):
|
|
19
|
-
|
|
20
|
-
响应不符合预期异常
|
|
21
|
-
"""
|
|
17
|
+
description = '响应不符合预期异常'
|
|
22
18
|
|
|
23
19
|
@property
|
|
24
20
|
def resp(self):
|
|
25
21
|
return self.from_context(ExceptionTool.CONTEXT_KEY_RESP)
|
|
26
22
|
|
|
27
23
|
|
|
28
|
-
class RegularNotMatchException(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
class RegularNotMatchException(JmcomicException):
|
|
25
|
+
description = '正则表达式不匹配异常'
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def resp(self):
|
|
29
|
+
"""
|
|
30
|
+
可能为None
|
|
31
|
+
"""
|
|
32
|
+
return self.context.get(ExceptionTool.CONTEXT_KEY_RESP, None)
|
|
32
33
|
|
|
33
34
|
@property
|
|
34
35
|
def error_text(self):
|
|
@@ -40,19 +41,23 @@ class RegularNotMatchException(ResponseUnexpectedException):
|
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
class JsonResolveFailException(ResponseUnexpectedException):
|
|
44
|
+
description = 'Json解析异常'
|
|
43
45
|
pass
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
class MissingAlbumPhotoException(ResponseUnexpectedException):
|
|
47
|
-
|
|
48
|
-
缺少本子/章节异常
|
|
49
|
-
"""
|
|
49
|
+
description = '不存在本子或章节异常'
|
|
50
50
|
|
|
51
51
|
@property
|
|
52
52
|
def error_jmid(self) -> str:
|
|
53
53
|
return self.from_context(ExceptionTool.CONTEXT_KEY_MISSING_JM_ID)
|
|
54
54
|
|
|
55
55
|
|
|
56
|
+
class RequestRetryAllFailException(JmcomicException):
|
|
57
|
+
description = '请求重试全部失败异常'
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
|
|
56
61
|
class ExceptionTool:
|
|
57
62
|
"""
|
|
58
63
|
抛异常的工具
|
|
@@ -95,10 +100,7 @@ class ExceptionTool:
|
|
|
95
100
|
e = etype(msg, context)
|
|
96
101
|
|
|
97
102
|
# 异常处理建议
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if advice is not None:
|
|
101
|
-
advice(e)
|
|
103
|
+
cls.notify_all_listeners(e)
|
|
102
104
|
|
|
103
105
|
raise e
|
|
104
106
|
|
|
@@ -174,3 +176,13 @@ class ExceptionTool:
|
|
|
174
176
|
raises(old, msg, context)
|
|
175
177
|
|
|
176
178
|
cls.raises = new
|
|
179
|
+
|
|
180
|
+
@classmethod
|
|
181
|
+
def notify_all_listeners(cls, e):
|
|
182
|
+
registry: Dict[Type, Callable[Type]] = JmModuleConfig.REGISTRY_EXCEPTION_LISTENER
|
|
183
|
+
if not registry:
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
for accept_type, listener in registry.items():
|
|
187
|
+
if isinstance(e, accept_type):
|
|
188
|
+
listener(e)
|
|
@@ -17,8 +17,11 @@ class CacheRegistry:
|
|
|
17
17
|
return registry[client]
|
|
18
18
|
|
|
19
19
|
@classmethod
|
|
20
|
-
def enable_client_cache_on_condition(cls,
|
|
21
|
-
|
|
20
|
+
def enable_client_cache_on_condition(cls,
|
|
21
|
+
option: 'JmOption',
|
|
22
|
+
client: JmcomicClient,
|
|
23
|
+
cache: Union[None, bool, str, Callable],
|
|
24
|
+
):
|
|
22
25
|
"""
|
|
23
26
|
cache parameter
|
|
24
27
|
|
|
@@ -539,7 +542,7 @@ class JmOption:
|
|
|
539
542
|
|
|
540
543
|
pclass: Type[JmOptionPlugin]
|
|
541
544
|
plugin: Optional[JmOptionPlugin] = None
|
|
542
|
-
|
|
545
|
+
|
|
543
546
|
try:
|
|
544
547
|
# 构建插件对象
|
|
545
548
|
plugin: JmOptionPlugin = pclass.build(self)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: jmcomic
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.3
|
|
4
4
|
Summary: Python API For JMComic (禁漫天堂)
|
|
5
5
|
Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
|
|
6
6
|
Author: hect0x7
|
|
@@ -97,8 +97,8 @@ $ jmcomic 422866
|
|
|
97
97
|
- **可扩展性强**
|
|
98
98
|
|
|
99
99
|
- 支持自定义本子/章节/图片下载前后的回调函数
|
|
100
|
-
- 支持自定义日志
|
|
101
100
|
- 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
|
|
101
|
+
- 支持自定义日志、异常监听器
|
|
102
102
|
- **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
|
|
103
103
|
- `登录插件`
|
|
104
104
|
- `硬件占用监控插件`
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|