Skip to content

Commit db09b8b

Browse files
committed
fix: 解决 PR#533 的 review 问题
修复内容: 1. [文档修正] 修正 13_export_and_feature.md 中的失效锚点链接 2. [文档完善] 补全 README.md 中的教程支持范围描述(增加长图) 3. [核心修复] 修复批量下载时没有透传 extra 参数导致 Feature 无法执行的严重 Bug 4. [性能优化] 改用 ctypes 启用 Windows ANSI 控制台支持,移除低效且不安全的 os.system 进程调用 5. [错误捕获] 提前在 jm_downloader.py 的 add_features 方法中对 extra 进行类型校验 6. [认知升级] 更新代码中的 docstring,强化 Feature 作为“基于生命周期和调用来源的动态自适应机制”的定位 未修改内容及原因: 1. jm_feature.py 链式调用丢失 _user_keys 问题 - 经与开发者确认,暂时先不修改此逻辑。
1 parent b5d9858 commit db09b8b

6 files changed

Lines changed: 21 additions & 10 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
> **🧭 快速指路**
3131
> - [教程:使用 GitHub Actions 下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md)
3232
> - [教程:导出并下载你的禁漫收藏夹数据](./assets/docs/sources/tutorial/10_export_favorites.md)
33-
> - [教程:下载后转为 PDF / ZIP](./assets/docs/sources/tutorial/13_export_and_feature.md)
33+
> - [教程:下载后转为 PDF / ZIP / 长图](./assets/docs/sources/tutorial/13_export_and_feature.md)
3434
> - [塔台广播:欢迎各位机长加入并贡献代码](./.github/CONTRIBUTING.md)
3535
>
3636
> **友情提示:珍爱JM,为了减轻JM的服务器压力,请不要一次性爬取太多本子,西门🙏🙏🙏**.

assets/docs/sources/tutorial/13_export_and_feature.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ download_photo('456', option, extra=Feature.export_pdf)
8585
├── [章节标题].pdf ← 该章节导出为 1 个 PDF
8686
```
8787

88-
> 💡 **提示**:同一个 Feature,通过 `download_album``download_photo` 调用时会自动适配不同的导出行为,详见下方 [智能适配规则](#智能适配规则)
88+
> 💡 **提示**:同一个 Feature,通过 `download_album``download_photo` 调用时会自动适配不同的导出行为,详见下方 [智能适配规则](#25-智能适配规则)
8989
9090
### 2.5 智能适配规则
9191

src/jmcomic/api.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ def download_batch(download_api,
77
jm_id_iter: Union[Iterable, Generator],
88
option=None,
99
downloader=None,
10+
**kwargs,
1011
) -> Set[__DOWNLOAD_API_RET]:
1112
"""
1213
批量下载 album / photo
@@ -37,6 +38,7 @@ def callback(*ret):
3738
option,
3839
downloader,
3940
callback=callback,
41+
**kwargs,
4042
),
4143
wait_finish=True
4244
)
@@ -61,12 +63,12 @@ def download_album(jm_album_id,
6163
:param downloader: 下载器类
6264
:param callback: 返回值回调函数,可以拿到 album 和 downloader
6365
:param check_exception: 是否检查异常, 如果为True,会检查downloader是否有下载异常,并上抛PartialDownloadFailedException
64-
:param extra: 下载特性(Feature),下载完成后自动执行对应插件。支持单个 Feature、FeatureChain、或列表
66+
:param extra: 下载特性(Feature),下载时动态挂载的附加行为上下文。会自动根据上下文(如 album/photo 来源)自适应参数行为。支持单个 Feature、FeatureChain、或列表
6567
:return: 对于的本子实体类,下载器(如果是上述的批量情况,返回值为download_batch的返回值)
6668
"""
6769

6870
if not isinstance(jm_album_id, (str, int)):
69-
return download_batch(download_album, jm_album_id, option, downloader)
71+
return download_batch(download_album, jm_album_id, option, downloader, extra=extra)
7072

7173
with new_downloader(option, downloader) as dler:
7274
# 注册 Feature 及来源,由 downloader 在 after_album 钩子中自动执行
@@ -91,7 +93,7 @@ def download_photo(jm_photo_id,
9193
下载一个章节(photo),参数同 download_album
9294
"""
9395
if not isinstance(jm_photo_id, (str, int)):
94-
return download_batch(download_photo, jm_photo_id, option, downloader)
96+
return download_batch(download_photo, jm_photo_id, option, downloader, extra=extra)
9597

9698
with new_downloader(option, downloader) as dler:
9799
# 注册 Feature 及来源,由 downloader 在 after_photo 钩子中自动执行

src/jmcomic/jm_config.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,12 @@ def enable_pretty_log():
595595

596596
# Windows 需要启用 VT100 ANSI 支持
597597
if sys.platform == 'win32':
598-
_os.system('')
598+
import ctypes
599+
kernel32 = ctypes.windll.kernel32
600+
handle = kernel32.GetStdHandle(-11) # STD_OUTPUT_HANDLE
601+
mode = ctypes.c_uint32()
602+
if kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
603+
kernel32.SetConsoleMode(handle, mode.value | 0x0004) # ENABLE_VIRTUAL_TERMINAL_PROCESSING
599604

600605
jm_logger.handlers.clear()
601606
handler = logging.StreamHandler(sys.stdout)

src/jmcomic/jm_downloader.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,16 +285,19 @@ def add_features(self, features, feature_from: str):
285285
if features is None:
286286
return
287287

288-
from .jm_feature import FeatureChain
288+
from .jm_feature import FeatureChain, Feature
289+
from .jm_toolkit import ExceptionTool
289290

290291
if isinstance(features, list):
291292
for f in features:
292293
self.add_features(f, feature_from)
293294
elif isinstance(features, FeatureChain):
294295
for f in features._features:
295296
self._feature_list.append((f, feature_from))
296-
else:
297+
elif isinstance(features, Feature):
297298
self._feature_list.append((features, feature_from))
299+
else:
300+
ExceptionTool.raises(f'不支持的 extra 类型: {type(features)},请传入 Feature / FeatureChain / list / None')
298301

299302
def _invoke_features_for(self, when: str, **context):
300303
"""

src/jmcomic/jm_feature.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
"""
22
该文件存放的是 Feature(下载特性)机制
33
4-
Feature 用于在 download_album / download_photo 时附加额外行为,
5-
例如下载完成后自动导出为 PDF、ZIP 等格式。
4+
Feature 用于在下载生命周期中挂载上下文相关的动态附加行为,
5+
例如下载完成后自适应导出为 PDF、ZIP 或长图等。
6+
它不仅是插件的封装,更能根据调用来源(整本/单章)智能调整执行策略。
67
78
用法:
89
from jmcomic import download_album, Feature

0 commit comments

Comments
 (0)