Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,48 @@
条目分类参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。

## [2.7.7] - 2026-09-12

### Summary

本次更新新增签到及打卡日历接口,为本子详情增加收藏与点赞状态,修复 HTML 登录结果校验。引入插件依赖声明、依赖策略,并完善收藏夹导出插件的失败重试与汇总提示,新增
Calibre metadata 插件。

### Added

#### 每日签到

| 功能 | 说明 |
|:------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------|
| `get_daily` / `daily_checkin` | HTML/API 客户端支持获取每日签到信息与打卡日历、执行每日签到,未提供 `daily_id` 时自动获取。 |
| `JmDailyCheckinResp` | 双端统一返回标准打卡状态(`code=0` 签到成功,`code=1` 今日重复打卡,透传服务端 `msg`),其余失败直接抛异常。 |

#### 实体字段

| 字段 | 说明 |
|:----------------------------|:------------------------------------------------------------|
| `JmAlbumDetail.is_favorite` | `bool`,HTML 网页端与 API 移动端双端识别本子收藏状态。 |
| `JmAlbumDetail.liked` | `bool`,HTML 网页端与 API 移动端双端识别本子点赞/喜欢状态。 |

#### 插件系统

| 功能 | 说明 |
|:-----------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `plugin_dependencies` 声明 | 插件基类新增 `plugin_dependencies` 类属性声明运行时依赖,并提供 `required_dependencies_for(kwargs)` 钩子按配置动态扩展(如 `zip` 按加密方式追加 `pyzipper`/`py7zr`,`img2pdf` 启用加密时追加 `pikepdf`)。 |
| `dependencies_strategy` 配置 | 新增 `plugins.dependencies_strategy`,支持三种策略:`failed-fast`(默认,缺失即报错并给出安装指引)、`auto-install`(自动 pip 安装)、`ignore-only-log`(仅警告不阻断)。 |
| `[plugins]` extras | `pyproject.toml` 新增 extras,`pip install jmcomic[plugins]` 一次性安装全部插件可选依赖(`img2pdf`、`pikepdf`、`psutil`、`py7zr`、`pyzipper`、`rich`、`browser_cookie3`)。 |
| 已有插件依赖补齐 | 为 `usage_log`、`download_progress`、`auto_set_browser_cookies` 等已有插件补齐 `plugin_dependencies` 声明。 |
| `calibre_metadata` 插件 | 在 `after_album` 阶段生成 Calibre 可识别的 `metadata.opf`,支持 `include_cover` 下载封面、`fields` 自定义元数据;OPF 生成由 `jmcomic-calibre` 提供。impl by [@yifenliwu](https://github.com/yifenliwu)。 |

### Changed

| 变更点 | 说明 |
|:-------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------|
| `zip` 插件 `encrypt` 校验 | 新增参数类型校验,非法标量(如 `encrypt: enabled`)在初始化阶段即拦截并给出清晰报错,不再等到运行时抛出 `AttributeError`。 |
| HTML 登录接口返回值更新 | `POST /login` 密码错误时 HTTP 200 误判为成功,增加 `status == 1` 严格校验并提取错误信息。 |
| API `page_count` / `pub_date` 字段适配最新返回值 | `page_count` 正确映射为全本总图片数(`total_photos`),`pub_date` 格式化为发布日期。 |
| `PhotoConcurrentFetcherProxy` 代理委托 | 补齐 `__getattr__` 委托,修复底层客户端方法丢失的问题。 |

## [2.7.6] - 2026-09-09

### Summary
Expand Down
5 changes: 1 addition & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,7 @@ jmv 350234 -y
- 支持自定义本子/章节/图片下载前后事件的回调函数
- 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
- 支持自定义日志、异常监听器
- **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前核心内置插件有**:
- `登录插件`、`只下载新章插件`、`导出收藏夹为csv文件插件`
- `合并所有图片为pdf文件插件`、`合并所有图片为长图png插件`
- `压缩文件插件`、`自动获取浏览器cookies插件`、`订阅更新插件`等
- **支持 Plugin 扩展,目前内置 21 个实用插件,包括**:`美观下载进度条`、`图片合并 PDF`、`一图流长图拼接`、`生成zip/7z压缩包`、`浏览器 Cookie 获取`、`订阅更新`、`收藏夹导出`、`封面下载`等。

## 使用小说明

Expand Down
34 changes: 34 additions & 0 deletions assets/docs/sources/option_file_syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,32 @@ dir_rule:

* **插件配置中的kwargs参数支持引用环境变量,语法为 ${环境变量名}**

> **💡 依赖安装建议**:
>
> 部分插件可能需要安装额外依赖,这里推荐:
>
> - **纯小白 / 完全不关心具体依赖的用户**:推荐直接在终端执行一键安装插件依赖全家桶:
> ```bash
> pip install jmcomic[plugins]
> ```
> - **关注环境体积 / 仅需特定功能的用户**:无需安装全家桶,只需在用到具体插件时按需安装对应依赖即可。也可通过下面的 `plugins.dependencies_strategy` 配置处理策略。

```yaml
# 插件的配置示例
plugins:
dependencies_strategy: failed-fast
# dependencies_strategy: 插件依赖处理策略(默认: failed-fast)
# 只有在不采用全家桶安装时,才需要根据你的使用场景权衡选择以下策略:
# 1. failed-fast (默认): 缺失依赖时快速失败,在启动阶段直接报错并给出解决方案。
# - 利:防呆、安全性最高,避免任务跑了一半因为缺依赖而报错或生成物缺失。
# - 弊:只要启用的插件缺少依赖就会阻断运行,必须先安装依赖。
# 2. auto-install: 启动时检测到缺失依赖,自动调用 pip 在当前 Python 环境中排队静默安装。
# - 利:省心无感,免去手动执行 pip install 的繁琐步骤。
# - 弊:若处于无外网环境或无系统安装权限(如未激活虚拟环境),安装失败也会严格抛错。
# 3. ignore-only-log: 缺失依赖时仅打印 Warning 日志,不阻断运行。
# - 利:容错性最强,不会因缺库中断主流程。
# - 弊:依赖缺失的插件可能在执行阶段被跳过,容易造成“配置了插件却没有产出”的困惑。

after_init:
- plugin: download_progress
kwargs:
Expand Down Expand Up @@ -296,10 +319,21 @@ plugins:
title: jmcomic # 标题
content: jmcomic finished !!! # 内容

# impl by @yifenliwu https://github.com/yifenliwu/jmcomic-calibre
- plugin: calibre_metadata # 生成 Calibre 元数据
kwargs:
dir_rule:
rule: 'Bd/Aid/metadata.opf' # 保存到 base_dir/本子ID/metadata.opf
base_dir: './'
include_cover: true # 同时下载封面
fields:
language: zh # 自定义元数据字段

main:
- plugin: favorite_folder_export # 导出收藏夹插件
log: false
kwargs:
max_retry: 2 # 失败后重试次数,0 表示不重试
zip_enable: true # 对导出文件进行压缩
zip_filepath: ${JM_DOWNLOAD_DIR}/export.zip # 压缩文件路径
zip_password: ${ZIP_PASSWORD} # 压缩密码
Expand Down
81 changes: 80 additions & 1 deletion assets/docs/sources/tutorial/0_common_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,58 @@ for page in client.forum_pagination_gen(page=1):
print(f'本子 {comment.album_id} | {comment}')
```

## 登录

登录可以下载某些特定本子,以及访问收藏夹、签到、查看本子的收藏与点赞状态。

你可以使用代码或者插件来登录。


### 1、配置登录插件

下载本子时推荐使用这种方式,简单直接。

```yaml
plugins:
after_init:
- plugin: login
kwargs:
username: '你的用户名'
password: '你的密码'
```

配置以后,使用option下载/创建client都自带登录状态

```python
from jmcomic import create_option_by_file, download_album

option = create_option_by_file('op.yml')

# 创建client会自动获得登录状态
client = option.build_jm_client()

# 下载本子,也会已登录状态下载
download_album(123, option)
```

### 2、代码写法

```python
from jmcomic import JmOption

option = JmOption.default()

# 创建一个新的client,此时是无登录状态的
client = option.new_jm_client()

# 登录
client.login('你的用户名', '你的密码')

# 后续使用这个 client 时,就是带上登录状态的了
album = client.get_album_detail(123)
print(f'本子 {album.title},是否收藏: {album.is_favorite},是否点赞: {album.liked}')
```

## 获取收藏夹

可参考discussions: https://github.com/hect0x7/JMComic-Crawler-Python/discussions/235
Expand Down Expand Up @@ -292,7 +344,7 @@ page = client.favorite_folder(page=1,

### 添加与取消收藏

支持直接通过本子 ID 添加或取消收藏(HTML 网页端与 API 端均支持)
支持直接通过本子 ID 添加或取消收藏:

```python
# 把本子加入收藏
Expand All @@ -302,6 +354,33 @@ client.add_favorite_album('438696')
client.delete_favorite_album('438696')
```

## 每日签到与打卡日历

```python
from jmcomic import *

client = JmOption.default().build_jm_client()

# 先登录(打卡和获取签到日历都需要登录)
client.login('你的用户名', '你的密码') # 也支持在 option.yml 中启用自动登录插件

# 获取当月每日签到与打卡日历信息(包含已签到、漏签等个人签到记录)
daily_resp = client.get_daily()
# 不同客户端实现的返回值不一样,不好统一,因此具体json格式请查看 get_daily() 的方法注释。
print(daily_resp)

# 执行今日签到打卡
try:
checkin_resp: JmDailyCheckinResp = client.daily_checkin()
# code: [0]-签到成功,[1]-今日重复签到,其余失败情况会直接抛出异常。
if checkin_resp.code == 0:
print(f'签到成功: {checkin_resp.msg}')
elif checkin_resp.code == 1:
print(f'今日重复签到: {checkin_resp.msg}')
except JmcomicException as e:
print(f'签到失败: {e}')
```

## 分类 / 排行榜

禁漫的分类是一个和搜索有些类似的功能。
Expand Down
32 changes: 29 additions & 3 deletions assets/docs/sources/tutorial/14_async_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,33 @@ async def main():
asyncio.run(main())
```

## 7. 异步分类 / 排行榜
## 7. 异步每日签到与打卡日历

登录后可以查询打卡日历,并执行今日签到:

```python
import asyncio
from jmcomic import JmOption, JmcomicException

async def main():
async with JmOption.default().new_jm_async_client() as cl:
await cl.login('你的用户名', '你的密码')
daily = await cl.get_daily()
print(daily.res_data) # 移动端返回的打卡日历数据

try:
result = await cl.daily_checkin()
if result.code == 0:
print(f'签到成功: {result.msg}')
elif result.code == 1:
print(f'今日已签到: {result.msg}')
except JmcomicException as e:
print(f'签到失败: {e}')

asyncio.run(main())
```

## 8. 异步分类 / 排行榜

分类和排行榜本质上都是过滤请求,可以使用 `categories_filter` 获取单页,或使用
`categories_filter_gen` 异步生成器自动翻页。
Expand Down Expand Up @@ -220,7 +246,7 @@ async def main():
asyncio.run(main())
```

## 8. 关于 `async_impl` 配置
## 9. 关于 `async_impl` 配置

注意:仅仅在 `option.yml` 中增加配置**并不能**让代码自动变成异步,你必须要在代码中改为调用 `_async` 相关方法(如上文所示)。

Expand All @@ -234,7 +260,7 @@ client:
async_impl: async_api
```

## 9. 查看下载耗时
## 10. 查看下载耗时

异步下载完成后,可以直接查看自己总共等了多久,也可以继续查看具体是哪个本子、章节或图片比较慢。所有 `duration` 的单位都是秒。

Expand Down
5 changes: 1 addition & 4 deletions assets/readme/README-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,7 @@ Please check the documentation homepage → [jmcomic.readthedocs.io (Chinese lan
- Supports custom callbacks before/after downloading albums/chapters/images
- Customizable objects: `Downloader` `Option` `Client` `Entities`, etc.
- Supports custom logging and exception listener mechanics
- **Embedded with powerful core Plugins** to easily extend features or inject others':
- `Login Plugin`, `Filter-new-chapter plugin`, `Export favorites to CSV plugin`
- `Merge images into PDF plugin`, `Merge images into Long png plugin`
- `Zip-files plugin`, `Auto fetch browser cookies plugin`, `Subscribe album update plugin`, etc.
- **Supports plugin extensions, with 21 useful built-in plugins**, including `download progress display`, `image-to-PDF conversion`, `long-image stitching`, `ZIP/7z compression`, `browser cookie extraction`, `album update subscriptions`, `favorites export`, and `cover downloads`.

## Prerequisites

Expand Down
5 changes: 1 addition & 4 deletions assets/readme/README-jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,7 @@ jmv 350234 -y
- アルバム/チャプター/画像ダウンロード前後のコールバック関数のカスタムをサポート
- 各種クラスのカスタマイズ対応: `Downloader(スケジューリング担当)` `Option(設定担当)` `Client(リクエスト担当)` `エンティティクラス` など
- カスタムログ出力・例外リスナーの実装
- **プラグイン(Plugin)システムにより、機能を容易に拡張したり、他者の製作物を利用可能**。主要な組み込みプラグインの一例:
- `ログインプラグイン`, `最新チャプターのみダウンロードするプラグイン`, `お気に入りをCSV形式でエクスポートするプラグイン`
- `すべての画像を1つのPDFファイルに結合するプラグイン`, `すべての画像を縦長の1つのPNGファイルに結合するプラグイン`
- `ファイル圧縮(Zip)プラグイン`, `ブラウザのクッキーを自動で抽出するプラグイン`, `アルバム更新購読プラグイン` など
- **プラグインによる機能拡張に対応し、現在21個の便利なプラグインを内蔵**。`ダウンロード進捗表示`、`画像のPDF結合`、`縦長画像の結合`、`ZIP/7z圧縮`、`ブラウザCookieの取得`、`アルバム更新の購読`、`お気に入りのエクスポート`、`表紙のダウンロード`などが利用できます。

## ご利用上の注意点

Expand Down
5 changes: 1 addition & 4 deletions assets/readme/README-kr.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,7 @@ jmv 350234 -y
- 챕터/이미지의 다운로드 전, 다운로드 후의 콜백 기능 및 커스텀 함수 동작.
- 여러 사용자 정의 클래스를 구성하도록 개방: `Downloader (스케줄 관리)` `Option (구성 관리)` `Client (요청 관리)` `Entity 생성` 및 등등.
- 사용자 맞춤형 로거, 에러 감지기 시스템
- **강력한 'Plugin 시스템', 타인의 플러그인 이용가능, 현재 지원되는 핵심 플러그인 목록**:
- `로그인 플러그인`, `새로 올라온 챕터만을 받는 플러그인`, `북마크 목록을 CSV 표로 추출하는 플러그인`
- `모든 이미지를 읽기용 PDF 파일 한 개로 결합하는 플러그인`, `모든 이미지를 좁고 긴 하나의 원본 PNG 사진으로 결합하는 플러그인`
- `압축(Archive) 지원 플러그인`, `웹 브라우저의 쿠키(Cookies)를 능동적으로 받는 플러그인`, `앨범 업데이트 구독 플러그인` 등
- **플러그인 확장을 지원하며, 현재 21개의 실용적인 플러그인을 내장하고 있습니다**. `다운로드 진행률 표시`, `이미지 PDF 병합`, `긴 이미지 이어 붙이기`, `ZIP/7z 압축`, `브라우저 쿠키 가져오기`, `앨범 업데이트 구독`, `즐겨찾기 내보내기`, `표지 다운로드` 등을 제공합니다.

## 사용 팁

Expand Down
11 changes: 11 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ dependencies = [
]
dynamic = ["version"]

[project.optional-dependencies]
plugins = [
"img2pdf",
"pikepdf",
"psutil",
"py7zr",
"pyzipper",
"rich",
"browser_cookie3",
]

[project.urls]
Homepage = "https://github.com/hect0x7/JMComic-Crawler-Python"
Documentation = "https://jmcomic.readthedocs.io"
Expand Down
2 changes: 1 addition & 1 deletion src/jmcomic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# 被依赖方 <--- 使用方
# config <--- entity <--- toolkit <--- client <--- option <--- downloader

__version__ = '2.7.6'
__version__ = '2.7.7'

from .jm_task_context import *
from .api import *
Expand Down
Loading