Skip to content

Commit 6ac8ffa

Browse files
authored
v2.7.0: 新增 async 异步版全套 API; 支持 html 正则解析失败时自动保存网页代码,方便排查; 新增异步vs同步性能 Benchmark; 优化文档。 (#542)
1 parent 0bd6f1e commit 6ac8ffa

39 files changed

Lines changed: 3787 additions & 557 deletions

.github/workflows/benchmark.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: Async Benchmark
2+
3+
on:
4+
push:
5+
branches: [ main, master ]
6+
paths:
7+
- '**/*async*.py'
8+
- '.github/workflows/benchmark.yml'
9+
pull_request:
10+
branches: [ main, master ]
11+
paths:
12+
- '**/*async*.py'
13+
- '.github/workflows/benchmark.yml'
14+
workflow_dispatch:
15+
16+
jobs:
17+
benchmark:
18+
runs-on: ubuntu-latest
19+
timeout-minutes: 15
20+
21+
steps:
22+
- uses: actions/checkout@v4
23+
24+
- name: Set up Python
25+
uses: actions/setup-python@v5
26+
with:
27+
python-version: '3.12'
28+
29+
- name: Install dependencies
30+
run: |
31+
python -m pip install --upgrade pip
32+
pip install -r requirements-dev.txt
33+
pip install -e .
34+
35+
- name: Run Performance Benchmark
36+
env:
37+
PYTHONPATH: ${{ github.workspace }}/src
38+
no_proxy: '*'
39+
run: python usage/benchmark_async_vs_sync.py
40+
41+
- name: Publish Report to Step Summary
42+
if: always()
43+
run: |
44+
if [ -f PERFORMANCE_REPORT.md ]; then
45+
cat PERFORMANCE_REPORT.md >> $GITHUB_STEP_SUMMARY
46+
else
47+
echo "❌ PERFORMANCE_REPORT.md not generated" >> $GITHUB_STEP_SUMMARY
48+
fi
49+
50+
- name: Upload Benchmark Report
51+
if: always()
52+
uses: actions/upload-artifact@v4
53+
with:
54+
name: benchmark-report
55+
path: PERFORMANCE_REPORT.md
56+
if-no-files-found: warn

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,5 @@ cython_debug/
162162
# and can be added to the global gitignore or merged into this file. For a more nuclear
163163
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
164164
.idea/
165-
.agent
165+
.agent
166+
gemini.md

README.md

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@
8383
```python
8484
import jmcomic # 导入此模块,需要先安装.
8585
jmcomic.download_album('123') # 传入要下载的album的id,即可下载整个album到本地.
86+
87+
# 也可以使用 Async API (详见教程: https://jmcomic.readthedocs.io/zh-cn/latest/tutorial/14_async_usage/)
88+
import asyncio
89+
asyncio.run(jmcomic.download_album_async('123'))
8690
```
8791

8892
上面的 `download_album`方法还有一个参数`option`,可用于控制下载配置,配置包括禁漫域名、网络代理、图片格式转换、插件等等。
@@ -222,9 +226,9 @@ jmv 350234 -y
222226
Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md)
223227
- 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md)
224228
- Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
229+
- **支持 Async 和 Sync 两套 API**
225230
- 支持**网页端****移动端**两种客户端实现,可通过配置切换(**移动端不限ip兼容性好,网页端限制ip地区但效率高**
226231
- 支持**自动重试和域名切换**机制
227-
- **多线程下载**(可细化到一图一线程,效率极高)
228232
- **可配置性强**
229233

230234
- 不配置也能使用,十分方便
@@ -236,26 +240,10 @@ jmv 350234 -y
236240
- 支持自定义本子/章节/图片下载前后的回调函数
237241
- 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`
238242
- 支持自定义日志、异常监听器
239-
- **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**
240-
- `登录插件`
241-
- `硬件占用监控插件`
242-
- `只下载新章插件`
243-
- `压缩文件插件`
244-
- `客户端代理插件`
245-
- `下载特定后缀图片插件`
246-
- `发送QQ邮件插件`
247-
- `日志主题过滤插件`
248-
- `自动获取浏览器cookies插件`
249-
- `导出收藏夹为csv文件插件`
250-
- `合并所有图片为pdf文件插件`
251-
- `合并所有图片为长图png插件`
252-
- `网页观看本地章节插件`
253-
- `订阅更新插件`
254-
- `小章节跳过插件`
255-
- `重复文件检测删除插件`
256-
- `路径字符串替换插件`
257-
- `高级重试插件`
258-
- `封面下载插件`
243+
- **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前核心内置插件有**
244+
- `登录插件``只下载新章插件``导出收藏夹为csv文件插件`
245+
- `合并所有图片为pdf文件插件``合并所有图片为长图png插件`
246+
- `压缩文件插件``自动获取浏览器cookies插件``订阅更新插件`
259247

260248
## 使用小说明
261249

assets/docs/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ nav:
5959
- tutorial/11_log_custom.md
6060
- tutorial/12_domain_strategy.md
6161
- tutorial/13_export_and_feature.md
62+
- tutorial/14_async_usage.md
6263

6364
plugins:
6465
- search

assets/docs/sources/api/client.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,13 @@
55
members:
66
- JmHtmlClient
77
- JmApiClient
8+
9+
::: jmcomic.jm_client_interface
10+
options:
11+
members:
12+
- AsyncJmcomicClient
13+
14+
::: jmcomic.jm_async_client
15+
options:
16+
members:
17+
- AsyncJmApiClient

assets/docs/sources/api/download.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,11 @@
99
- create_option_by_env
1010
- create_option_by_file
1111
- create_option_by_str
12+
- download_album_async
13+
- download_photo_async
14+
- download_batch_async
15+
16+
::: jmcomic.jm_async_downloader
17+
options:
18+
members:
19+
- JmAsyncDownloader

assets/docs/sources/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
- [快速上手(GitHub README)](https://github.com/hect0x7/JMComic-Crawler-Python/tree/master?tab=readme-ov-file#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B)
1919
- [常用类和方法演示](tutorial/0_common_usage.md)
20+
- [Async API用法](tutorial/14_async_usage.md)
2021
- [下载后转为 PDF / ZIP / 长图](tutorial/13_export_and_feature.md)
2122
- [option配置以及插件写法](./option_file_syntax.md)
2223

assets/docs/sources/option_file_syntax.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ JmOption.default().to_file('./option.yml') # 创建默认option,导出为optio
1515

1616
```yaml
1717
# 开启jmcomic的日志输出,默认为true
18-
# 对日志有需求的可进一步参考文档 → https://jmcomic.readthedocs.io/en/latest/tutorial/11_log_custom/
18+
# 对日志有需求的可进一步参考文档 → https://jmcomic.readthedocs.io/zh-cn/latest/tutorial/11_log_custom/
1919
log: true
2020

2121
# 配置客户端相关
@@ -26,6 +26,10 @@ client:
2626
# api - 表示APP端
2727
# APP端不限ip兼容性好,网页端限制ip地区但效率高
2828
impl: html
29+
30+
# async_impl: 指定异步客户端的底层实现类 (目前仅有: async_api)
31+
# 注意: 配置此项不会自动开启异步下载,你必须在代码中调用 _async 相关方法
32+
async_impl: async_api
2933

3034
# domain: 禁漫域名配置,一般无需配置,jmcomic会根据上面的impl自动设置相应域名
3135
# 该配置项需要和上面的impl结合使用,因为禁漫网页端和APP端使用的是不同域名,

assets/docs/sources/roadmap.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# 项目更新计划
22

3-
| 版本范围 | 更新计划 |
4-
|:--------:|:-----------------------------------------:|
5-
| v2.6.* | 实现移动端API域名自动更新,支持Zip加密/PDF密码/路径繁简转换/封面下载。 |
6-
| v2.5.* | 引入新插件`jm-server`,实现基于浏览器观看本地本子。 |
7-
| v2.4.* | 项目实现基本稳定,进入维护期,按需增加功能。 |
8-
| v2.3.* | 实现移动端API的基础功能,统一HTML和API的实现。 |
9-
| v2.2.* | 新的插件体系,新的命令行调用,完善搜索功能。 |
10-
| v2.1.* | 拆分Downloader抽象调度,优化可扩展性、代码复用性、模块级别自定义。 |
11-
| v2.0.* | 重新设计合理的抽象层次,实现请求重试切换域名机制,新的option配置设计。 |
12-
| v1.\*.\* | 基于HTML实现基础功能。 |
3+
| 版本范围 | 更新计划 |
4+
|:--------:|:---------------------------------------------------:|
5+
| v2.7.* | 支持 Async,命令行拓展 |
6+
| v2.6.* | 实现移动端API域名自动更新,支持Zip加密/PDF密码/路径繁简转换/封面下载。Feature 特性 |
7+
| v2.5.* | 引入新插件`jm-server`,实现基于浏览器观看本地本子。 |
8+
| v2.4.* | 项目实现基本稳定,进入维护期,按需增加功能。 |
9+
| v2.3.* | 实现移动端API的基础功能,统一HTML和API的实现。 |
10+
| v2.2.* | 新的插件体系,新的命令行调用,完善搜索功能。 |
11+
| v2.1.* | 拆分Downloader抽象调度,优化可扩展性、代码复用性、模块级别自定义。 |
12+
| v2.0.* | 重新设计合理的抽象层次,实现请求重试切换域名机制,新的option配置设计。 |
13+
| v1.\*.\* | 基于HTML实现基础功能。 |

assets/docs/sources/tutorial/0_common_usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ from jmcomic import *
2929
# 1. 在调用下载api前,通过创建和使用option对象,可以定制化下载行为。
3030
# 推荐使用配置文件的方式来创建option对象,
3131
# 你可以配置很多东西,比如代理、cookies、下载规则等等。
32-
# 配置文件的语法参考: https://jmcomic.readthedocs.io/en/latest/option_file_syntax/
32+
# 配置文件的语法参考: https://jmcomic.readthedocs.io/zh-cn/latest/option_file_syntax/
3333
option = create_option_by_file('op.yml') # 通过配置文件来创建option对象
3434

3535
# 2. 调用下载api,把option作为参数传递

0 commit comments

Comments
 (0)