Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a2c0a86

Browse files
authoredSep 1, 2023
v2.2.3: 实现DirRule文件夹规则支持调用env环境变量,优化文档和代码示例 (#119)
1 parent a847b92 commit a2c0a86

File tree

12 files changed

+62
-48
lines changed

12 files changed

+62
-48
lines changed
 

‎assets/config/option_plugin.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
plugin:
44
after_init:
5-
- plugin: usage-log # 实时打印硬件占用率的插件
5+
- plugin: usage_log # 实时打印硬件占用率的插件
66
kwargs:
77
interval: 0.5 # 间隔时间
88
enable_warning: true # 占用过大时发出预警
@@ -21,5 +21,5 @@ plugin:
2121
kwargs:
2222
level: photo # 按照章节,一个章节一个压缩文件
2323
filename_rule: Ptitle # 压缩文件的命名规则
24-
zip_dir: D:/GitProject/dev/pip/jmcomic/ # 压缩文件存放的文件夹
24+
zip_dir: D:/jmcomic/zip/ # 压缩文件存放的文件夹
2525
delete_original_file: true # 压缩成功后,删除所有原文件和文件夹

‎assets/config/option_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ client:
99
# 插件配置
1010
plugin:
1111
after_init:
12-
- plugin: usage-log # 实时打印硬件占用率的插件
12+
- plugin: usage_log # 实时打印硬件占用率的插件
1313
kwargs:
1414
interval: 0.5 # 间隔时间
1515
enable_warning: false # 不告警

‎assets/config/option_workflow_download.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
version: '2.0'
33

44
dir_rule:
5-
base_dir: /home/runner/work/jmcomic/download/
5+
base_dir: ${JM_DOWNLOAD_DIR}
66
rule: Bd_Aauthor_Atitle_Pindex
77

88

@@ -14,7 +14,14 @@ client:
1414
# 插件配置
1515
plugin:
1616
after_init:
17-
- plugin: usage-log # 实时打印硬件占用率的插件
17+
- plugin: usage_log # 实时打印硬件占用率的插件
1818
kwargs:
1919
interval: 0.5 # 间隔时间
2020
enable_warning: false # 不告警
21+
22+
# after_album:
23+
# - plugin: zip # 压缩文件插件
24+
# kwargs:
25+
# level: album # 按照章节,一个章节一个压缩文件
26+
# filename_rule: Atitle # 压缩文件的命名规则
27+
# zip_dir: ${JM_ZIP_DIR} # 压缩文件存放的文件夹

‎src/jmcomic/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# 被依赖方 <--- 使用方
33
# config <--- entity <--- toolkit <--- client <--- option <--- downloader
44

5-
__version__ = '2.2.2'
5+
__version__ = '2.2.3'
66

77
from .api import *
88
from .jm_plugin import *

‎src/jmcomic/jm_downloader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def before_album(self, album: JmAlbumDetail):
2323
f'章节数: [{len(album)}], '
2424
f'总页数: [{album.page_count}], '
2525
f'标题: [{album.title}], '
26-
f'关键词: [{album.keywords}], '
26+
f'关键词: [{album.keywords}]'
2727
)
2828

2929
def after_album(self, album: JmAlbumDetail):

‎src/jmcomic/jm_option.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class DirRule:
2222
rule_solver_cache: Dict[str, RuleSolver] = {}
2323

2424
def __init__(self, rule: str, base_dir=None):
25-
base_dir = self.parse_dsl(base_dir)
25+
base_dir = JmcomicText.parse_to_abspath(base_dir)
2626
self.base_dir = base_dir
2727
self.rule_dsl = rule
2828
self.solver_list = self.get_role_solver_list(rule, base_dir)
@@ -114,16 +114,6 @@ def choose_detail(key):
114114
def apply_rule_directly(cls, album, photo, rule: str) -> str:
115115
return cls.apply_rule_solver(album, photo, cls.get_rule_solver(rule))
116116

117-
dsl_support = {
118-
'${workspace}': lambda text: workspace(),
119-
}
120-
121-
def parse_dsl(self, base_dir: str):
122-
for k, func in self.dsl_support.items():
123-
if k in base_dir:
124-
base_dir = base_dir.replace(k, func(base_dir))
125-
return base_dir
126-
127117

128118
class JmOption:
129119
JM_OP_VER = '2.0'

‎src/jmcomic/jm_plugin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def invoke(self, username, password) -> None:
5151

5252

5353
class UsageLogPlugin(JmOptionPlugin):
54-
plugin_key = 'usage-log'
54+
plugin_key = 'usage_log'
5555

5656
def invoke(self, **kwargs) -> None:
5757
import threading
@@ -199,6 +199,7 @@ def invoke(self,
199199
from .jm_downloader import JmDownloader
200200
downloader: JmDownloader
201201

202+
zip_dir = JmcomicText.parse_to_abspath(zip_dir)
202203
mkdir_if_not_exists(zip_dir)
203204
photo_dict = downloader.all_downloaded[album]
204205
original_file_dir_list = []

‎src/jmcomic/jm_toolkit.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,38 @@ def format_url(cls, path, domain):
166166
assert isinstance(domain, str) and len(domain) != 0
167167
return f'{JmModuleConfig.PROT}{domain}{path}'
168168

169+
class DSLReplacer:
170+
171+
def __init__(self):
172+
self.dsl_dict: Dict[Pattern, Callable[[Match], str]] = {}
173+
174+
def parse_dsl_text(self, text) -> str:
175+
for pattern, replacer in self.dsl_dict.items():
176+
text = pattern.sub(replacer, text)
177+
return text
178+
179+
def add_dsl_and_replacer(self, dsl: str, replacer: Callable[[Match], str]):
180+
pattern = compile(dsl)
181+
self.dsl_dict[pattern] = replacer
182+
183+
@classmethod
184+
def match_os_env(cls, match: Match) -> str:
185+
name = match[1]
186+
value = os.getenv(name, None)
187+
assert value is not None, f"未配置环境变量: {name}"
188+
return os.path.abspath(value)
189+
190+
dsl_replacer = DSLReplacer()
191+
192+
@classmethod
193+
def parse_to_abspath(cls, dsl_text: str) -> str:
194+
path = cls.dsl_replacer.parse_dsl_text(dsl_text)
195+
return os.path.abspath(path)
196+
197+
198+
# 支持dsl: #{???} -> os.getenv(???)
199+
JmcomicText.dsl_replacer.add_dsl_and_replacer('\$\{(.*?)\}', JmcomicText.match_os_env)
200+
169201

170202
class JmSearchSupport:
171203
# 用来缩减html的长度

‎tests/test_jmcomic/__init__.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
class JmTestConfigurable(unittest.TestCase):
1515
option: JmOption = None
1616
client: JmcomicClient = None
17+
project_dir: str = None
1718

1819
def setUp(self) -> None:
1920
print_sep('>')
@@ -24,10 +25,8 @@ def tearDown(self) -> None:
2425
@classmethod
2526
def setUpClass(cls):
2627
# 获取项目根目录
27-
application_workspace = os.path.abspath(os.path.dirname(__file__) + '/../..')
28-
29-
# 设置 workspace → assets/
30-
set_application_workspace(f'{application_workspace}/assets/')
28+
cls.project_dir = os.path.abspath(os.path.dirname(__file__) + '/../..')
29+
os.chdir(cls.project_dir)
3130

3231
# 设置 JmOption,JmcomicClient
3332
option = cls.use_option('option_test.yml')
@@ -37,13 +36,9 @@ def setUpClass(cls):
3736
# 跨平台设置
3837
cls.adapt_os()
3938

40-
@staticmethod
41-
def use_option(op_filename: str) -> JmOption:
42-
return create_option(workspace(f"/config/{op_filename}"))
43-
44-
@staticmethod
45-
def move_workspace(new_dir: str):
46-
set_application_workspace(workspace(f"/{new_dir}/", is_dir=True))
39+
@classmethod
40+
def use_option(cls, op_filename: str) -> JmOption:
41+
return create_option(f'./assets/config/{op_filename}')
4742

4843
@classmethod
4944
def adapt_os(cls):

‎tests/test_jmcomic/test_jm_api.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33

44
class Test_Api(JmTestConfigurable):
55

6-
@classmethod
7-
def setUpClass(cls):
8-
super().setUpClass()
9-
cls.move_workspace('download')
10-
116
def test_download_photo_by_id(self):
127
"""
138
测试jmcomic模块的api的使用

‎tests/test_jmcomic/test_jm_client.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,11 @@
33

44
class Test_Client(JmTestConfigurable):
55

6-
@classmethod
7-
def setUpClass(cls):
8-
super().setUpClass()
9-
cls.move_workspace('download')
10-
116
def test_download_image(self):
127
jm_photo_id = 'JM438516'
138
photo = self.client.get_photo_detail(jm_photo_id, False)
14-
self.client.download_by_image_detail(
15-
photo[0],
16-
img_save_path=workspace('test_download_image.png')
17-
)
9+
image = photo[0]
10+
self.client.download_by_image_detail(image, self.option.decide_image_filepath(image))
1811

1912
def test_get_album_detail_by_jm_photo_id(self):
2013
album_id = "JM438516"
@@ -49,7 +42,7 @@ def test_gt_300_photo(self):
4942
photo: JmPhotoDetail = self.client.get_photo_detail(photo_id, False)
5043
image = photo[3000]
5144
print(image.img_url)
52-
self.client.download_by_image_detail(image, workspace('3000.png'))
45+
self.client.download_by_image_detail(image, self.option.decide_image_filepath(image))
5346

5447
def test_album_missing(self):
5548
JmModuleConfig.CLASS_EXCEPTION = JmcomicException

‎usage/usage_advanced.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
kwargs:
5151
level: photo # 按照章节,一个章节一个压缩文件
5252
filename_rule: Ptitle # 压缩文件的命名规则
53-
zip_dir: D:/GitProject/dev/pip/jmcomic/ # 压缩文件存放的文件夹
53+
zip_dir: D:/jmcomic # 压缩文件存放的文件夹
5454
delete_original_file: true # 压缩成功后,删除所有原文件和文件夹
5555
"""
5656

@@ -64,7 +64,8 @@
6464
2023-08-01 02:23:58:【plugin.kwargs】插件参数类型转换: 145504 (<class 'int'>) -> 145504 (<class 'str'>)
6565
2023-08-01 02:23:58:【plugin.invoke】调用插件: [find_update]
6666
2023-08-01 02:23:58:【html】https://18comic.vip/album/145504
67-
2023-08-01 02:23:59:【album.before】本子获取成功: [145504], 作者: [G.HO], 章节数: [104], 总页数: [3598], 标题: [健身教练 / もしも、幼馴染を抱いたなら / Fitness], 关键词: [['完結', '韩漫', '上柱香再走', '以晨:我爹呢', '你妈真香', '連載中', '肌肉豪名不虚传']], 2023-08-01 02:23:59:【html】https://18comic.vip/photo/291640
67+
2023-08-01 02:23:59:【album.before】本子获取成功: [145504], 作者: [G.HO], 章节数: [104], 总页数: [3598], 标题: [健身教练 / もしも、幼馴染を抱いたなら / Fitness], 关键词: [['完結', '韩漫', '上柱香再走', '以晨:我爹呢', '你妈真香', '連載中', '肌肉豪名不虚传']],
68+
2023-08-01 02:23:59:【html】https://18comic.vip/photo/291640
6869
2023-08-01 02:24:00:【photo.before】开始下载章节: 291640 (145504[104/104]), 标题: [健身教练 完結], 图片数为[41]
6970
2023-08-01 02:24:00:【image.before】图片准备下载: 291640/00001.webp [1/41], [https://cdn-msp.18comic.vip/media/photos/291640/00001.webp] → [D:/jmcomic/145504/00001.jpg]
7071
2023-08-01 02:24:00:【image.before】图片准备下载: 291640/00004.webp [4/41], [https://cdn-msp.18comic.vip/media/photos/291640/00004.webp] → [D:/jmcomic/145504/00004.jpg]
@@ -151,7 +152,7 @@
151152
2023-08-01 02:24:08:【photo.after】章节下载完成: [291640] (145504[104/104])
152153
2023-08-01 02:24:08:【album.after】本子下载完成: [145504]
153154
2023-08-01 02:24:08:【plugin.invoke】调用插件: [zip]
154-
2023-08-01 02:24:08:【plugin.zip.finish】压缩章节[291640]成功 → D:/GitProject/dev/pip/jmcomic/健身教练 完結.zip
155+
2023-08-01 02:24:08:【plugin.zip.finish】压缩章节[291640]成功 → D:/jmcomic/健身教练 完結.zip
155156
2023-08-01 02:24:08:【plugin.zip.remove】移除原文件: D:/jmcomic/145504/00017.jpg
156157
2023-08-01 02:24:08:【plugin.zip.remove】移除原文件: D:/jmcomic/145504/00007.jpg
157158
2023-08-01 02:24:08:【plugin.zip.remove】移除原文件: D:/jmcomic/145504/00021.jpg

0 commit comments

Comments
 (0)
Please sign in to comment.