Skip to content

Commit 10ef575

Browse files
authored
v2.0.0: 一次大版本更新 (#33)
- 重构JmcomicClient,重新设计抽象层次,以及两种实现:HTMl、API,支持请求重试+域名更换的机制; - 重构JmOption,更加优雅、简单的配置,支持更多文件类型; - 优化debug机制,等等。
1 parent abdde83 commit 10ef575

22 files changed

+842
-808
lines changed

.github/workflows/action_workflow.yml renamed to .github/workflows/download.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,20 @@ jobs:
3535
pip install commonX -i https://pypi.org/project --upgrade
3636
pip install -e ./
3737
38+
- name: 安装依赖项(pull_request)
39+
if: ${{ github.event_name == 'pull_request' }}
40+
run: |
41+
python -m pip install --upgrade pip
42+
pip install commonX -i https://pypi.org/project --upgrade
43+
pip install -e ./
44+
3845
- name: 运行下载脚本
3946
env:
4047
JM_USERNAME: ${{ secrets.JM_USERNAME }}
4148
JM_PASSWORD: ${{ secrets.JM_PASSWORD }}
4249
run: |
4350
cd ./usage/
44-
python jmcomic_workflows.py
51+
python jmcomic_workflow_download.py
4552
4653
- name: 压缩下载的漫画
4754
run: |

.github/workflows/action_run_tests.yml renamed to .github/workflows/test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ on:
44
push:
55
branches: [ "dev", "master" ]
66
paths:
7+
- '.github/workflows/*.yml' # 工作流定义
8+
- 'usage/**/*.py' # 工作流脚本
9+
- 'assets/config/*.yml' # option配置文件
710
- 'src/**/*.py' # 源码
811
- 'tests/**/*.py' # 测试代码
912

assets/config/option.yml

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,24 @@
1-
!!python/object:jmcomic.jm_option.JmOption
2-
dir_tree: !!python/object:jmcomic.jm_option.DownloadDirTree
3-
Bd: D:/jmcomic/download/
4-
flag: Bd_Id_Index_image
1+
version: '2.0'
2+
debug: true
53

6-
disable_jm_module_debug: false
7-
download_convert_image_suffix: .jpg
8-
download_image_then_decode: true
9-
download_multi_thread_photo_batch_count: 10 # 一次多线程批量下载的数量,太多了禁漫服务器可能顶不住
10-
download_multi_thread_photo_len_limit: 30
11-
download_use_disk_cache: true
12-
filepath: null
4+
dir_rule:
5+
base_dir: ${workspace}/download/
6+
rule: Bd_Ptitle
137

14-
client_config:
15-
domain: jmcomic1.group
16-
# 请求失败时,重试的次数,配个正数就行,不配默认是5
8+
client:
9+
domain: []
10+
impl: html
11+
postman:
12+
meta_data:
13+
cookies: null
14+
impersonate: chrome110
15+
type: cffi
1716
retry_times: 5
18-
postman_type: cffi
19-
postman_type_list:
20-
- requests
21-
- requests_Session
22-
- cffi
23-
- cffi_Session
24-
meta_data:
25-
proxies: null
26-
allow_redirects: true
27-
cookies: null
28-
headers:
29-
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
30-
accept-language: zh-CN,zh;q=0.9
31-
authority: jmcomic1.group
32-
sec-ch-ua: '"Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"'
33-
sec-ch-ua-mobile: ?0
34-
sec-ch-ua-platform: '"Windows"'
35-
sec-fetch-dest: document
36-
sec-fetch-mode: navigate
37-
sec-fetch-site: none
38-
sec-fetch-user: ?1
39-
upgrade-insecure-requests: '1'
40-
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
41-
like Gecko) Chrome/109.0.0.0 Safari/537.36
17+
18+
download:
19+
cache: true
20+
image:
21+
decode: true
22+
suffix: .jpg
23+
threading:
24+
batch_count: 30

assets/config/option_test.yml

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,2 @@
1-
!!python/object:jmcomic.jm_option.JmOption
2-
dir_tree: !!python/object:jmcomic.jm_option.DownloadDirTree
3-
Bd: $(workspace}/download/
4-
flag: Bd_Id_Image
5-
6-
disable_jm_module_debug: false
7-
download_convert_image_suffix: null
8-
download_image_then_decode: true
9-
download_multi_thread_photo_batch_count: 3
10-
download_multi_thread_photo_len_limit: 5
11-
download_use_disk_cache: true
12-
13-
14-
client_config:
15-
# 请求失败时,重试的次数,配个正数就行
16-
retry_times: 10
17-
domain: null
18-
postman_type: cffi
19-
postman_type_list:
20-
- requests
21-
- requests_Session
22-
- cffi
23-
- cffi_Session
24-
meta_data:
25-
proxies: null
26-
allow_redirects: true
27-
cookies: null
1+
# Github Actions 测试用
2+
version: '2.0'

assets/config/option_use_proxy.yml

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Github Actions 下载脚本配置
2+
3+
version: '2.0'
4+
5+
dir_tree:
6+
Bd: /home/runner/work/jmcomic/download/
7+
flag: Bd_Aauthor_Atitle_Pindex

assets/config/workflow_option.yml

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/jmcomic/__init__.py

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

5-
__version__ = '1.9.1'
5+
__version__ = '2.0.0'
66

77
from .api import *

src/jmcomic/api.py

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,35 @@ def download_album(jm_album_id, option=None):
1313
return download_album_batch(jm_album_id, option)
1414

1515
option, jm_client = build_client(option)
16-
album_detail: JmAlbumDetail = jm_client.get_album_detail(jm_album_id)
16+
album: JmAlbumDetail = jm_client.get_album_detail(jm_album_id)
1717

18-
jm_debug('download_album',
19-
f'获得album_detail成功,准备下载。'
20-
f'本子作者是【{album_detail.author}】,一共有{len(album_detail)}集本子')
18+
jm_debug('album',
19+
f'本子获取成功: [{album.id}], '
20+
f'标题: [{album.title}], '
21+
f'作者: [{album.author}], '
22+
f'章节数: [{len(album)}]')
2123

22-
def download_photo(index: int,
23-
photo_detail: JmPhotoDetail,
24-
debug_topic='download_album_photo',
24+
def download_photo(photo: JmPhotoDetail,
25+
debug_topic='photo',
2526
):
26-
jm_client.ensure_photo_can_use(photo_detail)
27+
jm_client.ensure_photo_can_use(photo)
2728

2829
jm_debug(debug_topic,
29-
f"下载第[{index + 1}]集: "
30-
f"图片数为[{len(photo_detail)}],"
31-
f"标题为:({photo_detail.title}) "
32-
f"-- photo {photo_detail.photo_id}")
33-
34-
download_by_photo_detail(
35-
photo_detail,
36-
option,
37-
)
30+
f'开始下载章节: {photo.id} ({photo.album_id}[{photo.index}/{len(album)}]), '
31+
f'标题: [{photo.title}], '
32+
f'图片数为[{len(photo)}]')
3833

39-
jm_debug(debug_topic,
40-
f"下载完成:({photo_detail.title}) "
41-
f"-- photo {photo_detail.photo_id}")
34+
download_by_photo_detail(photo, option)
35+
36+
jm_debug(debug_topic, f'章节下载完成: {photo.id} ({photo.album_id}[{photo.index}/{len(album)}])')
4237

4338
thread_pool_executor(
44-
iter_objs=enumerate(album_detail),
39+
iter_objs=album,
4540
apply_each_obj_func=download_photo,
4641
)
4742

43+
jm_debug('album', f'本子下载完成: [{album.id}]')
44+
4845

4946
def download_album_batch(jm_album_id_iter: Union[Iterable, Generator],
5047
option=None,
@@ -88,35 +85,34 @@ def download_by_photo_detail(photo_detail: JmPhotoDetail,
8885
option, jm_client = build_client(option)
8986

9087
# 下载准备
91-
use_cache = option.download_use_disk_cache
92-
decode_image = option.download_image_then_decode
88+
use_cache = option.download_cache
89+
decode_image = option.download_image_decode
9390
jm_client.ensure_photo_can_use(photo_detail)
9491

9592
# 下载每个图片的函数
96-
def download_image(index, img_detail, debug_topic='download_images_of_photo'):
93+
def download_image(index, image: JmImageDetail, debug_topic='image'):
9794
img_save_path = option.decide_image_filepath(photo_detail, index)
9895

9996
# 已下载过,缓存命中
10097
if use_cache is True and file_exists(img_save_path):
101-
jm_debug(debug_topic, f'photo-{img_detail.aid}: '
102-
f'图片{img_detail.filename}已下载过,'
103-
f'命中磁盘缓存({img_save_path})')
98+
jm_debug(debug_topic,
99+
f'图片已存在: {image.aid}[{image.filename}] → {img_save_path}')
104100
return
105101

106102
# 开始下载
107103
jm_client.download_by_image_detail(
108-
img_detail,
104+
image,
109105
img_save_path,
110106
decode_image=decode_image,
111107
)
112108

113-
jm_debug(debug_topic, f'photo-{img_detail.aid}: '
114-
f'图片{img_detail.filename}下载完成:'
115-
f'[{img_detail.img_url}] → [{img_save_path}]')
109+
jm_debug(debug_topic,
110+
f'图片下载完成: {image.aid}/{image.filename}, '
111+
f'[{image.img_url}] → [{img_save_path}]')
116112

117113
length = len(photo_detail)
118114
# 根据图片数,决定下载策略
119-
if length <= option.download_multi_thread_photo_len_limit:
115+
if length <= option.download_threading_batch_count:
120116
# 如果图片数小的话,直接使用多线程下载,一张图一个线程。
121117
multi_thread_launcher(
122118
iter_objs=enumerate(photo_detail),
@@ -127,7 +123,7 @@ def download_image(index, img_detail, debug_topic='download_images_of_photo'):
127123
multi_task_launcher_batch(
128124
iter_objs=enumerate(photo_detail),
129125
apply_each_obj_func=download_image,
130-
batch_size=option.download_multi_thread_photo_batch_count
126+
batch_size=option.download_threading_batch_count
131127
)
132128

133129

@@ -143,5 +139,5 @@ def build_client(option: Optional[JmOption]) -> Tuple[JmOption, JmcomicClient]:
143139

144140

145141
def create_option(filepath: str) -> JmOption:
146-
option = JmOption.create_from_file(filepath)
142+
option = JmOption.from_file(filepath)
147143
return option

0 commit comments

Comments
 (0)