jmcomic 2.5.2__tar.gz → 2.5.4__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.4}/PKG-INFO +2 -2
- {jmcomic-2.5.2 → jmcomic-2.5.4}/README.md +1 -1
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/__init__.py +1 -1
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_client_impl.py +7 -5
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_config.py +13 -16
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_exception.py +29 -17
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_option.py +6 -3
- {jmcomic-2.5.2 → jmcomic-2.5.4/src/jmcomic.egg-info}/PKG-INFO +2 -2
- {jmcomic-2.5.2 → jmcomic-2.5.4}/LICENSE +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/setup.cfg +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/setup.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/api.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/cl.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_client_interface.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_downloader.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_entity.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_plugin.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic/jm_toolkit.py +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic.egg-info/SOURCES.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic.egg-info/dependency_links.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic.egg-info/entry_points.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/src/jmcomic.egg-info/requires.txt +0 -0
- {jmcomic-2.5.2 → jmcomic-2.5.4}/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.4
|
|
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):
|
|
@@ -106,23 +106,17 @@ class JmModuleConfig:
|
|
|
106
106
|
|
|
107
107
|
# 移动端图片域名
|
|
108
108
|
DOMAIN_IMAGE_LIST = str_to_list('''
|
|
109
|
-
cdn-msp.
|
|
110
|
-
cdn-msp2.
|
|
111
|
-
cdn-msp.jmapiproxy1.cc
|
|
112
|
-
cdn-msp.jmapiproxy2.cc
|
|
113
|
-
cdn-msp.jmapiproxy3.cc
|
|
114
|
-
cdn-msp.jmapiproxy4.cc
|
|
109
|
+
cdn-msp.jmapinodeudzn.net
|
|
110
|
+
cdn-msp2.jmapinodeudzn.net
|
|
115
111
|
|
|
116
112
|
''')
|
|
117
113
|
|
|
118
114
|
# 移动端API域名
|
|
119
115
|
DOMAIN_API_LIST = str_to_list('''
|
|
120
|
-
www.
|
|
121
|
-
www.
|
|
122
|
-
www.jmapinode3.top
|
|
116
|
+
www.jmapinodeudzn.xyz
|
|
117
|
+
www.jmapinode.vip
|
|
123
118
|
www.jmapinode.biz
|
|
124
|
-
www.jmapinode.
|
|
125
|
-
|
|
119
|
+
www.jmapinode.xyz
|
|
126
120
|
''')
|
|
127
121
|
|
|
128
122
|
# 网页端域名配置
|
|
@@ -144,8 +138,11 @@ class JmModuleConfig:
|
|
|
144
138
|
REGISTRY_CLIENT = {}
|
|
145
139
|
# 插件注册表
|
|
146
140
|
REGISTRY_PLUGIN = {}
|
|
147
|
-
#
|
|
148
|
-
|
|
141
|
+
# 异常监听器
|
|
142
|
+
# key: 异常类
|
|
143
|
+
# value: 函数,参数只有异常对象,无需返回值
|
|
144
|
+
# 这个异常类(或者这个异常的子类)的实例将要被raise前,你的listener方法会被调用
|
|
145
|
+
REGISTRY_EXCEPTION_LISTENER = {}
|
|
149
146
|
|
|
150
147
|
# 执行log的函数
|
|
151
148
|
executor_log = default_jm_logging
|
|
@@ -311,7 +308,7 @@ class JmModuleConfig:
|
|
|
311
308
|
# 而如果只想修改几个简单常用的配置,也可以下方的DEFAULT_XXX属性
|
|
312
309
|
JM_OPTION_VER = '2.1'
|
|
313
310
|
DEFAULT_CLIENT_IMPL = 'api' # 默认Client实现类型为网页端
|
|
314
|
-
DEFAULT_CLIENT_CACHE =
|
|
311
|
+
DEFAULT_CLIENT_CACHE = None # 默认关闭Client缓存。缓存的配置详见 CacheRegistry
|
|
315
312
|
DEFAULT_PROXIES = ProxyBuilder.system_proxy() # 默认使用系统代理
|
|
316
313
|
|
|
317
314
|
default_option_dict: dict = {
|
|
@@ -404,8 +401,8 @@ class JmModuleConfig:
|
|
|
404
401
|
cls.REGISTRY_CLIENT[client_class.client_key] = client_class
|
|
405
402
|
|
|
406
403
|
@classmethod
|
|
407
|
-
def
|
|
408
|
-
cls.
|
|
404
|
+
def register_exception_listener(cls, etype, listener):
|
|
405
|
+
cls.REGISTRY_EXCEPTION_LISTENER[etype] = listener
|
|
409
406
|
|
|
410
407
|
|
|
411
408
|
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.4
|
|
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
|