jmcomic 2.6.7__py3-none-any.whl → 2.6.9__py3-none-any.whl
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/__init__.py +1 -1
- jmcomic/jm_client_impl.py +4 -1
- jmcomic/jm_client_interface.py +8 -0
- jmcomic/jm_option.py +10 -2
- jmcomic/jm_plugin.py +33 -8
- jmcomic/jm_toolkit.py +20 -0
- {jmcomic-2.6.7.dist-info → jmcomic-2.6.9.dist-info}/METADATA +1 -1
- jmcomic-2.6.9.dist-info/RECORD +18 -0
- jmcomic-2.6.7.dist-info/RECORD +0 -18
- {jmcomic-2.6.7.dist-info → jmcomic-2.6.9.dist-info}/WHEEL +0 -0
- {jmcomic-2.6.7.dist-info → jmcomic-2.6.9.dist-info}/entry_points.txt +0 -0
- {jmcomic-2.6.7.dist-info → jmcomic-2.6.9.dist-info}/licenses/LICENSE +0 -0
- {jmcomic-2.6.7.dist-info → jmcomic-2.6.9.dist-info}/top_level.txt +0 -0
jmcomic/__init__.py
CHANGED
jmcomic/jm_client_impl.py
CHANGED
|
@@ -15,6 +15,7 @@ class AbstractJmClient(
|
|
|
15
15
|
postman: Postman,
|
|
16
16
|
domain_list: List[str],
|
|
17
17
|
retry_times=0,
|
|
18
|
+
domain_retry_strategy=None,
|
|
18
19
|
):
|
|
19
20
|
"""
|
|
20
21
|
创建JM客户端
|
|
@@ -26,9 +27,11 @@ class AbstractJmClient(
|
|
|
26
27
|
super().__init__(postman)
|
|
27
28
|
self.retry_times = retry_times
|
|
28
29
|
self.domain_list = domain_list
|
|
29
|
-
self.domain_retry_strategy =
|
|
30
|
+
self.domain_retry_strategy = domain_retry_strategy
|
|
30
31
|
self.CLIENT_CACHE = None
|
|
31
32
|
self._username = None # help for favorite_folder method
|
|
33
|
+
if domain_retry_strategy:
|
|
34
|
+
domain_retry_strategy(self)
|
|
32
35
|
self.enable_cache()
|
|
33
36
|
self.after_init()
|
|
34
37
|
|
jmcomic/jm_client_interface.py
CHANGED
|
@@ -293,6 +293,14 @@ class JmImageClient:
|
|
|
293
293
|
# https://cdn-msp2.18comic.vip/media/photos/498976/00027.gif
|
|
294
294
|
return data_original.endswith('.gif')
|
|
295
295
|
|
|
296
|
+
def download_album_cover(self, album_id, save_path: str, size: str = ''):
|
|
297
|
+
self.download_image(
|
|
298
|
+
img_url=JmcomicText.get_album_cover_url(album_id, size=size),
|
|
299
|
+
img_save_path=save_path,
|
|
300
|
+
scramble_id=None,
|
|
301
|
+
decode_image=False,
|
|
302
|
+
)
|
|
303
|
+
|
|
296
304
|
|
|
297
305
|
class JmSearchAlbumClient:
|
|
298
306
|
"""
|
jmcomic/jm_option.py
CHANGED
|
@@ -158,7 +158,8 @@ class DirRule:
|
|
|
158
158
|
if rule.startswith(('A', 'P')):
|
|
159
159
|
return cls.parse_detail_rule
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
return cls.parse_f_string_rule
|
|
162
|
+
# ExceptionTool.raises(f'不支持的rule配置: "{rule}"')
|
|
162
163
|
|
|
163
164
|
@classmethod
|
|
164
165
|
def apply_rule_to_filename(cls, album, photo, rule: str) -> str:
|
|
@@ -362,7 +363,13 @@ class JmOption:
|
|
|
362
363
|
"""
|
|
363
364
|
return self.new_jm_client(**kwargs)
|
|
364
365
|
|
|
365
|
-
def new_jm_client(self,
|
|
366
|
+
def new_jm_client(self,
|
|
367
|
+
domain_list=None,
|
|
368
|
+
impl=None,
|
|
369
|
+
cache=None,
|
|
370
|
+
domain_retry_strategy=None,
|
|
371
|
+
**kwargs
|
|
372
|
+
) -> Union[JmHtmlClient, JmApiClient]:
|
|
366
373
|
"""
|
|
367
374
|
创建新的Client(客户端),不同Client之间的元数据不共享
|
|
368
375
|
"""
|
|
@@ -423,6 +430,7 @@ class JmOption:
|
|
|
423
430
|
postman=postman,
|
|
424
431
|
domain_list=decide_domain_list(),
|
|
425
432
|
retry_times=retry_times,
|
|
433
|
+
domain_retry_strategy=domain_retry_strategy,
|
|
426
434
|
)
|
|
427
435
|
|
|
428
436
|
# enable cache
|
jmcomic/jm_plugin.py
CHANGED
|
@@ -111,7 +111,7 @@ class JmOptionPlugin:
|
|
|
111
111
|
def decide_filepath(self,
|
|
112
112
|
album: Optional[JmAlbumDetail],
|
|
113
113
|
photo: Optional[JmPhotoDetail],
|
|
114
|
-
filename_rule: str, suffix: str, base_dir: Optional[str],
|
|
114
|
+
filename_rule: Optional[str], suffix: Optional[str], base_dir: Optional[str],
|
|
115
115
|
dir_rule_dict: Optional[dict]
|
|
116
116
|
):
|
|
117
117
|
"""
|
|
@@ -1219,7 +1219,7 @@ class ReplacePathStringPlugin(JmOptionPlugin):
|
|
|
1219
1219
|
|
|
1220
1220
|
|
|
1221
1221
|
class AdvancedRetryPlugin(JmOptionPlugin):
|
|
1222
|
-
plugin_key = '
|
|
1222
|
+
plugin_key = 'advanced_retry'
|
|
1223
1223
|
|
|
1224
1224
|
def __init__(self, option: JmOption):
|
|
1225
1225
|
super().__init__(option)
|
|
@@ -1234,15 +1234,18 @@ class AdvancedRetryPlugin(JmOptionPlugin):
|
|
|
1234
1234
|
new_jm_client: Callable = self.option.new_jm_client
|
|
1235
1235
|
|
|
1236
1236
|
def hook_new_jm_client(*args, **kwargs):
|
|
1237
|
-
|
|
1238
|
-
client.domain_retry_strategy = self.request_with_retry
|
|
1239
|
-
client.domain_req_failed_counter = {}
|
|
1240
|
-
from threading import Lock
|
|
1241
|
-
client.domain_counter_lock = Lock()
|
|
1242
|
-
return client
|
|
1237
|
+
return new_jm_client(*args, **kwargs, domain_retry_strategy=self)
|
|
1243
1238
|
|
|
1244
1239
|
self.option.new_jm_client = hook_new_jm_client
|
|
1245
1240
|
|
|
1241
|
+
def __call__(self, client: AbstractJmClient, *args, **kwargs):
|
|
1242
|
+
if args:
|
|
1243
|
+
return self.request_with_retry(client, *args, **kwargs)
|
|
1244
|
+
# init
|
|
1245
|
+
from threading import Lock
|
|
1246
|
+
client.domain_req_failed_counter = {}
|
|
1247
|
+
client.domain_counter_lock = Lock()
|
|
1248
|
+
|
|
1246
1249
|
def request_with_retry(self,
|
|
1247
1250
|
client: AbstractJmClient,
|
|
1248
1251
|
request: Callable,
|
|
@@ -1306,3 +1309,25 @@ class AdvancedRetryPlugin(JmOptionPlugin):
|
|
|
1306
1309
|
def failed_count(client: JmcomicClient, domain: str) -> int:
|
|
1307
1310
|
# noinspection PyUnresolvedReferences
|
|
1308
1311
|
return client.domain_req_failed_counter.get(domain, 0)
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
class DownloadCoverPlugin(JmOptionPlugin):
|
|
1315
|
+
plugin_key = 'download_cover'
|
|
1316
|
+
|
|
1317
|
+
def invoke(self,
|
|
1318
|
+
dir_rule: dict,
|
|
1319
|
+
size='',
|
|
1320
|
+
photo: JmPhotoDetail = None,
|
|
1321
|
+
album: JmAlbumDetail = None,
|
|
1322
|
+
downloader=None,
|
|
1323
|
+
**kwargs) -> None:
|
|
1324
|
+
album_id = album.id if album else photo.album_id
|
|
1325
|
+
save_path = self.decide_filepath(
|
|
1326
|
+
album, photo,
|
|
1327
|
+
None, None, None,
|
|
1328
|
+
dir_rule
|
|
1329
|
+
)
|
|
1330
|
+
if self.option.download.cache and os.path.exists(save_path):
|
|
1331
|
+
self.log(f'album-{album_id}的封面已存在,跳过下载: [{save_path}]', 'skip')
|
|
1332
|
+
return
|
|
1333
|
+
downloader.client.download_album_cover(album_id, save_path, size)
|
jmcomic/jm_toolkit.py
CHANGED
|
@@ -368,6 +368,26 @@ class JmcomicText:
|
|
|
368
368
|
length = len(text)
|
|
369
369
|
return text if length <= limit else (text[:limit] + f'...({length - limit}')
|
|
370
370
|
|
|
371
|
+
@classmethod
|
|
372
|
+
def get_album_cover_url(cls,
|
|
373
|
+
album_id: Union[str, int],
|
|
374
|
+
image_domain: Optional[str] = None,
|
|
375
|
+
size: str = '',
|
|
376
|
+
) -> str:
|
|
377
|
+
"""
|
|
378
|
+
根据本子id生成封面url
|
|
379
|
+
|
|
380
|
+
:param album_id: 本子id
|
|
381
|
+
:param image_domain: 图片cdn域名(可传入裸域或含协议的域名)
|
|
382
|
+
:param size: 尺寸后缀,例如搜索列表页会使用 size="_3x4" 的封面图
|
|
383
|
+
"""
|
|
384
|
+
if image_domain is None:
|
|
385
|
+
import random
|
|
386
|
+
image_domain = random.choice(JmModuleConfig.DOMAIN_IMAGE_LIST)
|
|
387
|
+
|
|
388
|
+
path = f'/media/albums/{cls.parse_to_jm_id(album_id)}{size}.jpg'
|
|
389
|
+
return cls.format_url(path, image_domain)
|
|
390
|
+
|
|
371
391
|
|
|
372
392
|
# 支持dsl: #{???} -> os.getenv(???)
|
|
373
393
|
JmcomicText.dsl_replacer.add_dsl_and_replacer(r'\$\{(.*?)\}', JmcomicText.match_os_env)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
jmcomic/__init__.py,sha256=uYzq8cX-BV_LQ5RFpXSWdmW9yA00SSwdpVQlRA_Olio,902
|
|
2
|
+
jmcomic/api.py,sha256=ZduhXDmh4lg1dkXHs7UTAaPpYNO7kcdPCDH5JJT9KSI,4253
|
|
3
|
+
jmcomic/cl.py,sha256=PBSh0JndNFZw3B7WJPj5Y8SeFdKzHE00jIwYo9An-K0,3475
|
|
4
|
+
jmcomic/jm_client_impl.py,sha256=UpzqO3LD567U7ETs6SpSdCKQS4mvtbCbN6sVwU6DXxk,42301
|
|
5
|
+
jmcomic/jm_client_interface.py,sha256=HJPmaY0xdSghPKuTh2CvVjlgJmoW1rubqjysHcOGDHQ,19701
|
|
6
|
+
jmcomic/jm_config.py,sha256=8GDETnzQObZabd441Boc--Mb--J2kr7HLxxViKB0DvI,17213
|
|
7
|
+
jmcomic/jm_downloader.py,sha256=azYkIN-1OuEivZ1TGGDaYo1FkcO5KatSb0g4GVdKSPY,11041
|
|
8
|
+
jmcomic/jm_entity.py,sha256=ZyXVy3mOl9qkxlw6hyshVS3RR-yKfO5BkJHtyBAoKQE,20053
|
|
9
|
+
jmcomic/jm_exception.py,sha256=x3KGMLlQS2zi1GX7z5G58zJN2EwLkI4mAURkxZYjEvA,5055
|
|
10
|
+
jmcomic/jm_option.py,sha256=jczCX9gmSaTcl1BJLVYe9YN8GIdFYNQQVwDSh4oymto,21503
|
|
11
|
+
jmcomic/jm_plugin.py,sha256=9_EfTOVCk4ey1QQiKjYhFnd6j9XG-YM8rXiN21w-KrU,45374
|
|
12
|
+
jmcomic/jm_toolkit.py,sha256=2ltGKeJORZ7ARTrC-29nkO9TSu8Kzxdrqj6O28PIw28,31297
|
|
13
|
+
jmcomic-2.6.9.dist-info/licenses/LICENSE,sha256=kz4coTxZxuGxisK3W00tjK57Zh3RcMGq-EnbXrK7-xA,1064
|
|
14
|
+
jmcomic-2.6.9.dist-info/METADATA,sha256=PUBkNLrDi6UFgp86Y8h3sFrygyAQBRfKkEDN7Zvsvfs,9572
|
|
15
|
+
jmcomic-2.6.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
16
|
+
jmcomic-2.6.9.dist-info/entry_points.txt,sha256=tRbQltaGSBjejI0c9jYt-4SXQMd5nSDHcMvHmuTy4ow,44
|
|
17
|
+
jmcomic-2.6.9.dist-info/top_level.txt,sha256=puvVMFYJqIbd6NOTMEvOyugMTT8woBfSQyxEBan3zY4,8
|
|
18
|
+
jmcomic-2.6.9.dist-info/RECORD,,
|
jmcomic-2.6.7.dist-info/RECORD
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
jmcomic/__init__.py,sha256=Rg9DJ3YptC-BImHcbNB4cqM6-ZZMMtPGy2hw3-G7hZY,902
|
|
2
|
-
jmcomic/api.py,sha256=ZduhXDmh4lg1dkXHs7UTAaPpYNO7kcdPCDH5JJT9KSI,4253
|
|
3
|
-
jmcomic/cl.py,sha256=PBSh0JndNFZw3B7WJPj5Y8SeFdKzHE00jIwYo9An-K0,3475
|
|
4
|
-
jmcomic/jm_client_impl.py,sha256=sDrhqlO6zHAR0vlGFoKXmQ85l89BwksfG8BHGk7eXJ4,42165
|
|
5
|
-
jmcomic/jm_client_interface.py,sha256=4TDz-V8XLWPPxogLI-xiiHug4n6iir6UNeiKx9-KTXM,19410
|
|
6
|
-
jmcomic/jm_config.py,sha256=8GDETnzQObZabd441Boc--Mb--J2kr7HLxxViKB0DvI,17213
|
|
7
|
-
jmcomic/jm_downloader.py,sha256=azYkIN-1OuEivZ1TGGDaYo1FkcO5KatSb0g4GVdKSPY,11041
|
|
8
|
-
jmcomic/jm_entity.py,sha256=ZyXVy3mOl9qkxlw6hyshVS3RR-yKfO5BkJHtyBAoKQE,20053
|
|
9
|
-
jmcomic/jm_exception.py,sha256=x3KGMLlQS2zi1GX7z5G58zJN2EwLkI4mAURkxZYjEvA,5055
|
|
10
|
-
jmcomic/jm_option.py,sha256=T__PXJgzITdjyr2PMdk98jYMIKkUVGUA30p5lsMOTvQ,21244
|
|
11
|
-
jmcomic/jm_plugin.py,sha256=OekMjPVS25PMLcHV0r434BBvy0vbszlNiU5wODCZ3js,44524
|
|
12
|
-
jmcomic/jm_toolkit.py,sha256=9vwk4Q2gfh_04BhJxEoSsZcDT6ICh-wsN70WR4LSD9I,30511
|
|
13
|
-
jmcomic-2.6.7.dist-info/licenses/LICENSE,sha256=kz4coTxZxuGxisK3W00tjK57Zh3RcMGq-EnbXrK7-xA,1064
|
|
14
|
-
jmcomic-2.6.7.dist-info/METADATA,sha256=cuqBqo5Bp2GHItulju3coNt5dU9_UMtY1vcN0G0m0jk,9572
|
|
15
|
-
jmcomic-2.6.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
16
|
-
jmcomic-2.6.7.dist-info/entry_points.txt,sha256=tRbQltaGSBjejI0c9jYt-4SXQMd5nSDHcMvHmuTy4ow,44
|
|
17
|
-
jmcomic-2.6.7.dist-info/top_level.txt,sha256=puvVMFYJqIbd6NOTMEvOyugMTT8woBfSQyxEBan3zY4,8
|
|
18
|
-
jmcomic-2.6.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|