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 CHANGED
@@ -2,7 +2,7 @@
2
2
  # 被依赖方 <--- 使用方
3
3
  # config <--- entity <--- toolkit <--- client <--- option <--- downloader
4
4
 
5
- __version__ = '2.6.7'
5
+ __version__ = '2.6.9'
6
6
 
7
7
  from .api import *
8
8
  from .jm_plugin import *
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 = None
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
 
@@ -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
- ExceptionTool.raises(f'不支持的rule配置: "{rule}"')
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, domain_list=None, impl=None, cache=None, **kwargs) -> Union[JmHtmlClient, JmApiClient]:
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 = 'advanced-retry'
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
- client: JmcomicClient = new_jm_client(*args, **kwargs)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jmcomic
3
- Version: 2.6.7
3
+ Version: 2.6.9
4
4
  Summary: Python API For JMComic (禁漫天堂)
5
5
  Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
6
6
  Author: hect0x7
@@ -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,,
@@ -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,,