jmcomic 2.5.14__tar.gz → 2.5.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {jmcomic-2.5.14/src/jmcomic.egg-info → jmcomic-2.5.16}/PKG-INFO +54 -55
  2. jmcomic-2.5.16/README.md +157 -0
  3. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/__init__.py +1 -1
  4. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/api.py +1 -0
  5. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_client_impl.py +10 -5
  6. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_config.py +1 -0
  7. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_entity.py +4 -0
  8. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_option.py +13 -13
  9. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_plugin.py +66 -16
  10. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_toolkit.py +13 -0
  11. {jmcomic-2.5.14 → jmcomic-2.5.16/src/jmcomic.egg-info}/PKG-INFO +54 -55
  12. jmcomic-2.5.14/README.md +0 -158
  13. {jmcomic-2.5.14 → jmcomic-2.5.16}/LICENSE +0 -0
  14. {jmcomic-2.5.14 → jmcomic-2.5.16}/setup.cfg +0 -0
  15. {jmcomic-2.5.14 → jmcomic-2.5.16}/setup.py +0 -0
  16. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/cl.py +0 -0
  17. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_client_interface.py +0 -0
  18. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_downloader.py +0 -0
  19. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic/jm_exception.py +0 -0
  20. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic.egg-info/SOURCES.txt +0 -0
  21. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic.egg-info/dependency_links.txt +0 -0
  22. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic.egg-info/entry_points.txt +0 -0
  23. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic.egg-info/requires.txt +0 -0
  24. {jmcomic-2.5.14 → jmcomic-2.5.16}/src/jmcomic.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jmcomic
3
- Version: 2.5.14
3
+ Version: 2.5.16
4
4
  Summary: Python API For JMComic (禁漫天堂)
5
5
  Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
6
6
  Author: hect0x7
@@ -40,24 +40,26 @@ Requires-Dist: pycryptodome
40
40
 
41
41
  ## 项目介绍
42
42
 
43
- 本项目的核心功能是下载本子,基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
43
+ 本项目的核心功能是下载本子。
44
44
 
45
- 目前核心功能实现较为稳定,项目也处于维护阶段。
45
+ 基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
46
46
 
47
- 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现,具体如下。
47
+ 目前核心功能实现较为稳定,项目也处于维护阶段。
48
48
 
49
- ### 已实现的禁漫API:
49
+ 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现。目前已有功能:
50
50
 
51
51
  - 登录
52
- - 搜本
53
- - 分类 (排行榜)
54
- - 本子章节详情
52
+ - 搜索本子(支持所有搜索项)
55
53
  - 图片下载解码
56
- - 收藏夹
57
- - 移动端接口加解密
54
+ - 分类/排行榜
55
+ - 本子/章节详情
56
+ - 个人收藏夹
57
+ - 接口加解密(APP的接口)
58
58
 
59
59
  ## 安装教程
60
60
 
61
+ > ⚠如果你没有安装过Python,需要先安装Python再执行下面的步骤,且版本需要>=3.7([点我去python官网下载](https://www.python.org/downloads/))
62
+
61
63
  * 通过pip官方源安装(推荐,并且更新也是这个命令)
62
64
 
63
65
  ```shell
@@ -72,7 +74,9 @@ Requires-Dist: pycryptodome
72
74
  ## 快速上手
73
75
 
74
76
  ### 1. 下载本子方法
77
+
75
78
  只需要使用如下代码,就可以下载本子`JM422866`的所有章节的图片:
79
+
76
80
  ```python
77
81
  import jmcomic # 导入此模块,需要先安装.
78
82
  jmcomic.download_album('422866') # 传入要下载的album的id,即可下载整个album到本地.
@@ -85,10 +89,10 @@ jmcomic.download_album('422866') # 传入要下载的album的id,即可下载
85
89
  ### 2. 使用option配置来下载本子
86
90
 
87
91
  1. 首先,创建一个配置文件,假设文件名为 `option.yml`
88
-
89
- 该文件有特定的写法,你需要参考这个文档 → [option配置](./assets/docs/sources/option_file_syntax.md)
90
-
91
- 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
92
+
93
+ 该文件有特定的写法,你需要参考这个文档 → [配置文件指南](./assets/docs/sources/option_file_syntax.md)
94
+
95
+ 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
92
96
 
93
97
  ```yml
94
98
  download:
@@ -97,6 +101,7 @@ download:
97
101
  ```
98
102
 
99
103
  2. 第二步,运行下面的python代码
104
+
100
105
  ```python
101
106
  import jmcomic
102
107
 
@@ -104,24 +109,14 @@ import jmcomic
104
109
  option = jmcomic.create_option_by_file('你的配置文件路径,例如 D:/option.yml')
105
110
  # 使用option对象来下载本子
106
111
  jmcomic.download_album(422866, option)
112
+ # 等价写法: option.download_album(422866)
107
113
  ```
108
114
 
109
-
110
-
111
115
  ## 进阶使用
112
116
 
113
- 文档网站:[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/en/latest)
114
-
115
- 首先,就下载功能,jmcomic提供了很多配置项,大部分的下载需求你都可以通过上文介绍的配置文件来配置。
117
+ 请查阅文档首页→[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/zh-cn/latest)
116
118
 
117
- 如果你不满足于下载,还有其他的使用需求,推荐你先看看以下文档:
118
-
119
- * [jmcomic常用类和方法演示](assets/docs/sources/tutorial/0_demo.md)
120
- * [option配置文件语法(包含插件配置)](./assets/docs/sources/option_file_syntax.md)
121
- * [GitHub Actions使用教程](./assets/docs/sources/tutorial/1_github_actions.md)
122
- * [命令行使用教程](assets/docs/sources/tutorial/2_command_line.md)
123
- * [插件机制](assets/docs/sources/tutorial/6_plugin.md)
124
- * [下载过滤器机制](assets/docs/sources/tutorial/5_filter.md)
119
+ (提示:jmcomic提供了很多下载配置项,大部分的下载需求你都可以尝试寻找相关配置项或插件来实现。)
125
120
 
126
121
  ## 项目特点
127
122
 
@@ -129,35 +124,35 @@ jmcomic.download_album(422866, option)
129
124
  - **实现禁漫APP接口最新的加解密算法 (1.6.3)**
130
125
  - 用法多样:
131
126
 
132
- - GitHub
133
- Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
134
- - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
135
- - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
127
+ - GitHub
128
+ Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
129
+ - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
130
+ - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
136
131
  - 支持**网页端**和**移动端**两种客户端实现,可通过配置切换(**移动端不限ip兼容性好,网页端限制ip地区但效率高**)
137
132
  - 支持**自动重试和域名切换**机制
138
133
  - **多线程下载**(可细化到一图一线程,效率极高)
139
134
  - **可配置性强**
140
135
 
141
- - 不配置也能使用,十分方便
142
- - 配置可以从配置文件生成,支持多种文件格式
143
- - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
144
-
136
+ - 不配置也能使用,十分方便
137
+ - 配置可以从配置文件生成,支持多种文件格式
138
+ - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
139
+
145
140
  - **可扩展性强**
146
141
 
147
- - 支持自定义本子/章节/图片下载前后的回调函数
148
- - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
149
- - 支持自定义日志、异常监听器
150
- - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
151
- - `登录插件`
152
- - `硬件占用监控插件`
153
- - `只下载新章插件`
154
- - `压缩文件插件`
155
- - `下载特定后缀图片插件`
156
- - `发送QQ邮件插件`
157
- - `日志主题过滤插件`
158
- - `自动使用浏览器cookies插件`
159
- - `jpg图片合成为一个pdf插件`
160
- - `导出收藏夹为csv文件插件`
142
+ - 支持自定义本子/章节/图片下载前后的回调函数
143
+ - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
144
+ - 支持自定义日志、异常监听器
145
+ - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
146
+ - `登录插件`
147
+ - `硬件占用监控插件`
148
+ - `只下载新章插件`
149
+ - `压缩文件插件`
150
+ - `下载特定后缀图片插件`
151
+ - `发送QQ邮件插件`
152
+ - `日志主题过滤插件`
153
+ - `自动使用浏览器cookies插件`
154
+ - `jpg图片合成为一个pdf插件`
155
+ - `导出收藏夹为csv文件插件`
161
156
 
162
157
  ## 使用小说明
163
158
 
@@ -169,13 +164,11 @@ jmcomic.download_album(422866, option)
169
164
  * .github:GitHub Actions配置文件
170
165
  * assets:存放一些非代码的资源文件
171
166
 
172
- * docs:项目文档
173
- * option:存放配置文件
174
-
167
+ * docs:项目文档
168
+ * option:存放配置文件
175
169
  * src:存放源代码
176
170
 
177
- * jmcomic:`jmcomic`模块
178
-
171
+ * jmcomic:`jmcomic`模块
179
172
  * tests:测试目录,存放测试代码,使用unittest
180
173
  * usage:用法目录,存放示例/使用代码
181
174
 
@@ -183,4 +176,10 @@ jmcomic.download_album(422866, option)
183
176
 
184
177
  ### 图片分割算法代码+禁漫移动端API
185
178
 
186
- [![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt)](https://github.com/tonquer/JMComic-qt)
179
+ <a href="https://github.com/tonquer/JMComic-qt">
180
+ <picture>
181
+ <source media="(prefers-color-scheme: dark)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt&theme=radical" />
182
+ <source media="(prefers-color-scheme: light)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
183
+ <img alt="Repo Card" src="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
184
+ </picture>
185
+ </a>
@@ -0,0 +1,157 @@
1
+ # Python API For JMComic (禁漫天堂)
2
+
3
+ 本项目封装了一套可用于爬取JM的Python API.
4
+
5
+ 你可以通过简单的几行Python代码,实现下载JM上的本子到本地,并且是处理好的图片。
6
+
7
+ [【指路】教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md)
8
+
9
+ [【指路】教程:导出并下载你的禁漫收藏夹数据](./assets/docs/sources/tutorial/10_export_favorites.md)
10
+
11
+ **友情提示:珍爱JM,为了减轻JM的服务器压力,请不要一次性爬取太多本子,西门🙏🙏🙏**.
12
+
13
+ ## 项目介绍
14
+
15
+ 本项目的核心功能是下载本子。
16
+
17
+ 基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
18
+
19
+ 目前核心功能实现较为稳定,项目也处于维护阶段。
20
+
21
+ 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现。目前已有功能:
22
+
23
+ - 登录
24
+ - 搜索本子(支持所有搜索项)
25
+ - 图片下载解码
26
+ - 分类/排行榜
27
+ - 本子/章节详情
28
+ - 个人收藏夹
29
+ - 接口加解密(APP的接口)
30
+
31
+ ## 安装教程
32
+
33
+ > ⚠如果你没有安装过Python,需要先安装Python再执行下面的步骤,且版本需要>=3.7([点我去python官网下载](https://www.python.org/downloads/))
34
+
35
+ * 通过pip官方源安装(推荐,并且更新也是这个命令)
36
+
37
+ ```shell
38
+ pip install jmcomic -i https://pypi.org/project -U
39
+ ```
40
+ * 通过源代码安装
41
+
42
+ ```shell
43
+ pip install git+https://github.com/hect0x7/JMComic-Crawler-Python
44
+ ```
45
+
46
+ ## 快速上手
47
+
48
+ ### 1. 下载本子方法
49
+
50
+ 只需要使用如下代码,就可以下载本子`JM422866`的所有章节的图片:
51
+
52
+ ```python
53
+ import jmcomic # 导入此模块,需要先安装.
54
+ jmcomic.download_album('422866') # 传入要下载的album的id,即可下载整个album到本地.
55
+ ```
56
+
57
+ 上面的 `download_album`方法还有一个参数`option`,可用于控制下载配置,配置包括禁漫域名、网络代理、图片格式转换、插件等等。
58
+
59
+ 你可能需要这些配置项。推荐使用配置文件创建option,用option下载本子,见下章:
60
+
61
+ ### 2. 使用option配置来下载本子
62
+
63
+ 1. 首先,创建一个配置文件,假设文件名为 `option.yml`
64
+
65
+ 该文件有特定的写法,你需要参考这个文档 → [配置文件指南](./assets/docs/sources/option_file_syntax.md)
66
+
67
+ 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
68
+
69
+ ```yml
70
+ download:
71
+ image:
72
+ suffix: .png # 该配置用于把下载的图片转为png格式
73
+ ```
74
+
75
+ 2. 第二步,运行下面的python代码
76
+
77
+ ```python
78
+ import jmcomic
79
+
80
+ # 创建配置对象
81
+ option = jmcomic.create_option_by_file('你的配置文件路径,例如 D:/option.yml')
82
+ # 使用option对象来下载本子
83
+ jmcomic.download_album(422866, option)
84
+ # 等价写法: option.download_album(422866)
85
+ ```
86
+
87
+ ## 进阶使用
88
+
89
+ 请查阅文档首页→[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/zh-cn/latest)
90
+
91
+ (提示:jmcomic提供了很多下载配置项,大部分的下载需求你都可以尝试寻找相关配置项或插件来实现。)
92
+
93
+ ## 项目特点
94
+
95
+ - **绕过Cloudflare的反爬虫**
96
+ - **实现禁漫APP接口最新的加解密算法 (1.6.3)**
97
+ - 用法多样:
98
+
99
+ - GitHub
100
+ Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
101
+ - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
102
+ - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
103
+ - 支持**网页端**和**移动端**两种客户端实现,可通过配置切换(**移动端不限ip兼容性好,网页端限制ip地区但效率高**)
104
+ - 支持**自动重试和域名切换**机制
105
+ - **多线程下载**(可细化到一图一线程,效率极高)
106
+ - **可配置性强**
107
+
108
+ - 不配置也能使用,十分方便
109
+ - 配置可以从配置文件生成,支持多种文件格式
110
+ - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
111
+
112
+ - **可扩展性强**
113
+
114
+ - 支持自定义本子/章节/图片下载前后的回调函数
115
+ - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
116
+ - 支持自定义日志、异常监听器
117
+ - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
118
+ - `登录插件`
119
+ - `硬件占用监控插件`
120
+ - `只下载新章插件`
121
+ - `压缩文件插件`
122
+ - `下载特定后缀图片插件`
123
+ - `发送QQ邮件插件`
124
+ - `日志主题过滤插件`
125
+ - `自动使用浏览器cookies插件`
126
+ - `jpg图片合成为一个pdf插件`
127
+ - `导出收藏夹为csv文件插件`
128
+
129
+ ## 使用小说明
130
+
131
+ * Python >= 3.7
132
+ * 个人项目,文档和示例会有不及时之处,可以Issue提问
133
+
134
+ ## 项目文件夹介绍
135
+
136
+ * .github:GitHub Actions配置文件
137
+ * assets:存放一些非代码的资源文件
138
+
139
+ * docs:项目文档
140
+ * option:存放配置文件
141
+ * src:存放源代码
142
+
143
+ * jmcomic:`jmcomic`模块
144
+ * tests:测试目录,存放测试代码,使用unittest
145
+ * usage:用法目录,存放示例/使用代码
146
+
147
+ ## 感谢以下项目
148
+
149
+ ### 图片分割算法代码+禁漫移动端API
150
+
151
+ <a href="https://github.com/tonquer/JMComic-qt">
152
+ <picture>
153
+ <source media="(prefers-color-scheme: dark)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt&theme=radical" />
154
+ <source media="(prefers-color-scheme: light)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
155
+ <img alt="Repo Card" src="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
156
+ </picture>
157
+ </a>
@@ -2,7 +2,7 @@
2
2
  # 被依赖方 <--- 使用方
3
3
  # config <--- entity <--- toolkit <--- client <--- option <--- downloader
4
4
 
5
- __version__ = '2.5.14'
5
+ __version__ = '2.5.16'
6
6
 
7
7
  from .api import *
8
8
  from .jm_plugin import *
@@ -2,6 +2,7 @@ from .jm_downloader import *
2
2
 
3
3
  __DOWNLOAD_API_RET = Tuple[JmAlbumDetail, JmDownloader]
4
4
 
5
+
5
6
  def download_batch(download_api,
6
7
  jm_id_iter: Union[Iterable, Generator],
7
8
  option=None,
@@ -27,7 +27,7 @@ class AbstractJmClient(
27
27
  self.retry_times = retry_times
28
28
  self.domain_list = domain_list
29
29
  self.CLIENT_CACHE = None
30
- self.__username = None # help for favorite_folder method
30
+ self._username = None # help for favorite_folder method
31
31
  self.enable_cache()
32
32
  self.after_init()
33
33
 
@@ -402,7 +402,7 @@ class JmHtmlClient(AbstractJmClient):
402
402
  allow_redirects=False,
403
403
  )
404
404
 
405
- if resp.status_code != 301:
405
+ if resp.status_code != 200:
406
406
  ExceptionTool.raises_resp(f'登录失败,状态码为{resp.status_code}', resp)
407
407
 
408
408
  orig_cookies = self.get_meta_data('cookies') or {}
@@ -412,7 +412,7 @@ class JmHtmlClient(AbstractJmClient):
412
412
  return resp
413
413
 
414
414
  self['cookies'] = new_cookies
415
- self.__username = username
415
+ self._username = username
416
416
 
417
417
  return resp
418
418
 
@@ -423,8 +423,8 @@ class JmHtmlClient(AbstractJmClient):
423
423
  username='',
424
424
  ) -> JmFavoritePage:
425
425
  if username == '':
426
- ExceptionTool.require_true(self.__username is not None, 'favorite_folder方法需要传username参数')
427
- username = self.__username
426
+ ExceptionTool.require_true(self._username is not None, 'favorite_folder方法需要传username参数')
427
+ username = self._username
428
428
 
429
429
  resp = self.get_jm_html(
430
430
  f'/user/{username}/favorite/albums',
@@ -973,6 +973,11 @@ class JmApiClient(AbstractJmClient):
973
973
  # 例如图片请求
974
974
  return resp
975
975
 
976
+ code = resp.status_code
977
+ if code >= 500:
978
+ msg = JmModuleConfig.JM_ERROR_STATUS_CODE.get(code, f'HTTP状态码: {code}')
979
+ ExceptionTool.raises_resp(f"禁漫API异常响应, {msg}", resp)
980
+
976
981
  url = resp.request.url
977
982
 
978
983
  if self.API_SCRAMBLE in url:
@@ -123,6 +123,7 @@ class JmModuleConfig:
123
123
  # JM的异常网页code
124
124
  JM_ERROR_STATUS_CODE = {
125
125
  403: 'ip地区禁止访问/爬虫被识别',
126
+ 500: '500: 禁漫服务器内部异常(可能是服务器过载,可以换个ip或稍后重试)',
126
127
  520: '520: Web server is returning an unknown error (禁漫服务器内部报错)',
127
128
  524: '524: The origin web server timed out responding to this request. (禁漫服务器处理超时)',
128
129
  }
@@ -1,3 +1,5 @@
1
+ from functools import lru_cache
2
+
1
3
  from common import *
2
4
 
3
5
  from .jm_config import *
@@ -400,6 +402,7 @@ class JmPhotoDetail(DetailEntity, Downloadable):
400
402
  def id(self):
401
403
  return self.photo_id
402
404
 
405
+ @lru_cache(None)
403
406
  def getindex(self, index) -> JmImageDetail:
404
407
  return self.create_image_detail(index)
405
408
 
@@ -514,6 +517,7 @@ class JmAlbumDetail(DetailEntity, Downloadable):
514
517
 
515
518
  return photo
516
519
 
520
+ @lru_cache(None)
517
521
  def getindex(self, item) -> JmPhotoDetail:
518
522
  return self.create_photo_detail(item)
519
523
 
@@ -270,15 +270,7 @@ class JmOption:
270
270
  )
271
271
 
272
272
  if ensure_exists:
273
- try:
274
- mkdir_if_not_exists(save_dir)
275
- except OSError as e:
276
- if e.errno == 36:
277
- # 目录名过长
278
- limit = JmModuleConfig.VAR_FILE_NAME_LENGTH_LIMIT
279
- jm_log('error', f'目录名过长,无法创建目录,强制缩短到{limit}个字符并重试')
280
- save_dir = save_dir[0:limit]
281
- mkdir_if_not_exists(save_dir)
273
+ save_dir = JmcomicText.try_mkdir(save_dir)
282
274
 
283
275
  return save_dir
284
276
 
@@ -517,13 +509,21 @@ class JmOption:
517
509
 
518
510
  # 下面的方法提供面向对象的调用风格
519
511
 
520
- def download_album(self, album_id):
512
+ def download_album(self,
513
+ album_id,
514
+ downloader=None,
515
+ callback=None,
516
+ ):
521
517
  from .api import download_album
522
- download_album(album_id, self)
518
+ download_album(album_id, self, downloader, callback)
523
519
 
524
- def download_photo(self, photo_id):
520
+ def download_photo(self,
521
+ photo_id,
522
+ downloader=None,
523
+ callback=None
524
+ ):
525
525
  from .api import download_photo
526
- download_photo(photo_id, self)
526
+ download_photo(photo_id, self, downloader, callback)
527
527
 
528
528
  # 下面的方法为调用插件提供支持
529
529
 
@@ -734,13 +734,17 @@ class Img2pdfPlugin(JmOptionPlugin):
734
734
  plugin_key = 'img2pdf'
735
735
 
736
736
  def invoke(self,
737
- photo: JmPhotoDetail,
737
+ photo: JmPhotoDetail = None,
738
+ album: JmAlbumDetail = None,
738
739
  downloader=None,
739
740
  pdf_dir=None,
740
741
  filename_rule='Pid',
741
742
  delete_original_file=False,
742
743
  **kwargs,
743
744
  ):
745
+ if photo is None and album is None:
746
+ jm_log('wrong_usage', 'img2pdf必须运行在after_photo或after_album时')
747
+
744
748
  try:
745
749
  import img2pdf
746
750
  except ImportError:
@@ -749,28 +753,50 @@ class Img2pdfPlugin(JmOptionPlugin):
749
753
 
750
754
  self.delete_original_file = delete_original_file
751
755
 
752
- # 处理文件夹配置
753
- filename = DirRule.apply_rule_directly(None, photo, filename_rule)
754
- photo_dir = self.option.decide_image_save_dir(photo)
755
-
756
756
  # 处理生成的pdf文件的路径
757
- if pdf_dir is None:
758
- pdf_dir = photo_dir
759
- else:
760
- pdf_dir = fix_filepath(pdf_dir, True)
761
- mkdir_if_not_exists(pdf_dir)
757
+ pdf_dir = self.ensure_make_pdf_dir(pdf_dir)
758
+
759
+ # 处理pdf文件名
760
+ filename = DirRule.apply_rule_directly(album, photo, filename_rule)
762
761
 
762
+ # pdf路径
763
763
  pdf_filepath = os.path.join(pdf_dir, f'{filename}.pdf')
764
764
 
765
765
  # 调用 img2pdf 把 photo_dir 下的所有图片转为pdf
766
- all_img = files_of_dir(photo_dir)
767
- with open(pdf_filepath, 'wb') as f:
768
- f.write(img2pdf.convert(all_img))
766
+ img_path_ls, img_dir_ls = self.write_img_2_pdf(pdf_filepath, album, photo)
767
+ self.log(f'Convert Successfully: JM{album or photo} → {pdf_filepath}')
769
768
 
770
769
  # 执行删除
771
- self.log(f'Convert Successfully: JM{photo.id} → {pdf_filepath}')
772
- all_img.append(self.option.decide_image_save_dir(photo, ensure_exists=False))
773
- self.execute_deletion(all_img)
770
+ img_path_ls += img_dir_ls
771
+ self.execute_deletion(img_path_ls)
772
+
773
+ def write_img_2_pdf(self, pdf_filepath, album: JmAlbumDetail, photo: JmPhotoDetail):
774
+ import img2pdf
775
+
776
+ if album is None:
777
+ img_dir_ls = [self.option.decide_image_save_dir(photo)]
778
+ else:
779
+ img_dir_ls = [self.option.decide_image_save_dir(photo) for photo in album]
780
+
781
+ img_path_ls = []
782
+
783
+ for img_dir in img_dir_ls:
784
+ imgs = files_of_dir(img_dir)
785
+ if not imgs:
786
+ continue
787
+ img_path_ls += imgs
788
+
789
+ with open(pdf_filepath, 'wb') as f:
790
+ f.write(img2pdf.convert(img_path_ls))
791
+
792
+ return img_path_ls, img_dir_ls
793
+
794
+ @staticmethod
795
+ def ensure_make_pdf_dir(pdf_dir: str):
796
+ pdf_dir = pdf_dir or os.getcwd()
797
+ pdf_dir = fix_filepath(pdf_dir, True)
798
+ mkdir_if_not_exists(pdf_dir)
799
+ return pdf_dir
774
800
 
775
801
 
776
802
  class JmServerPlugin(JmOptionPlugin):
@@ -1067,3 +1093,27 @@ class DeleteDuplicatedFilesPlugin(JmOptionPlugin):
1067
1093
  [f' {path}' for path in paths]
1068
1094
  self.log('\n'.join(message))
1069
1095
  self.execute_deletion(paths)
1096
+
1097
+
1098
+ class ReplacePathStringPlugin(JmOptionPlugin):
1099
+ plugin_key = 'replace_path_string'
1100
+
1101
+ def invoke(self,
1102
+ replace: Dict[str, str],
1103
+ ):
1104
+ if not replace:
1105
+ return
1106
+
1107
+ old_decide_dir = self.option.decide_image_save_dir
1108
+
1109
+ def new_decide_dir(photo, ensure_exists=True) -> str:
1110
+ original_path: str = old_decide_dir(photo, False)
1111
+ for k, v in replace.items():
1112
+ original_path = original_path.replace(k, v)
1113
+
1114
+ if ensure_exists:
1115
+ JmcomicText.try_mkdir(original_path)
1116
+
1117
+ return original_path
1118
+
1119
+ self.option.decide_image_save_dir = new_decide_dir
@@ -316,6 +316,19 @@ class JmcomicText:
316
316
  import zhconv
317
317
  return zhconv.convert(s, 'zh_cn')
318
318
 
319
+ @classmethod
320
+ def try_mkdir(cls, save_dir: str):
321
+ try:
322
+ mkdir_if_not_exists(save_dir)
323
+ except OSError as e:
324
+ if e.errno == 36:
325
+ # 目录名过长
326
+ limit = JmModuleConfig.VAR_FILE_NAME_LENGTH_LIMIT
327
+ jm_log('error', f'目录名过长,无法创建目录,强制缩短到{limit}个字符并重试')
328
+ save_dir = save_dir[0:limit]
329
+ mkdir_if_not_exists(save_dir)
330
+ return save_dir
331
+
319
332
 
320
333
  # 支持dsl: #{???} -> os.getenv(???)
321
334
  JmcomicText.dsl_replacer.add_dsl_and_replacer(r'\$\{(.*?)\}', JmcomicText.match_os_env)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jmcomic
3
- Version: 2.5.14
3
+ Version: 2.5.16
4
4
  Summary: Python API For JMComic (禁漫天堂)
5
5
  Home-page: https://github.com/hect0x7/JMComic-Crawler-Python
6
6
  Author: hect0x7
@@ -40,24 +40,26 @@ Requires-Dist: pycryptodome
40
40
 
41
41
  ## 项目介绍
42
42
 
43
- 本项目的核心功能是下载本子,基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
43
+ 本项目的核心功能是下载本子。
44
44
 
45
- 目前核心功能实现较为稳定,项目也处于维护阶段。
45
+ 基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
46
46
 
47
- 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现,具体如下。
47
+ 目前核心功能实现较为稳定,项目也处于维护阶段。
48
48
 
49
- ### 已实现的禁漫API:
49
+ 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现。目前已有功能:
50
50
 
51
51
  - 登录
52
- - 搜本
53
- - 分类 (排行榜)
54
- - 本子章节详情
52
+ - 搜索本子(支持所有搜索项)
55
53
  - 图片下载解码
56
- - 收藏夹
57
- - 移动端接口加解密
54
+ - 分类/排行榜
55
+ - 本子/章节详情
56
+ - 个人收藏夹
57
+ - 接口加解密(APP的接口)
58
58
 
59
59
  ## 安装教程
60
60
 
61
+ > ⚠如果你没有安装过Python,需要先安装Python再执行下面的步骤,且版本需要>=3.7([点我去python官网下载](https://www.python.org/downloads/))
62
+
61
63
  * 通过pip官方源安装(推荐,并且更新也是这个命令)
62
64
 
63
65
  ```shell
@@ -72,7 +74,9 @@ Requires-Dist: pycryptodome
72
74
  ## 快速上手
73
75
 
74
76
  ### 1. 下载本子方法
77
+
75
78
  只需要使用如下代码,就可以下载本子`JM422866`的所有章节的图片:
79
+
76
80
  ```python
77
81
  import jmcomic # 导入此模块,需要先安装.
78
82
  jmcomic.download_album('422866') # 传入要下载的album的id,即可下载整个album到本地.
@@ -85,10 +89,10 @@ jmcomic.download_album('422866') # 传入要下载的album的id,即可下载
85
89
  ### 2. 使用option配置来下载本子
86
90
 
87
91
  1. 首先,创建一个配置文件,假设文件名为 `option.yml`
88
-
89
- 该文件有特定的写法,你需要参考这个文档 → [option配置](./assets/docs/sources/option_file_syntax.md)
90
-
91
- 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
92
+
93
+ 该文件有特定的写法,你需要参考这个文档 → [配置文件指南](./assets/docs/sources/option_file_syntax.md)
94
+
95
+ 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
92
96
 
93
97
  ```yml
94
98
  download:
@@ -97,6 +101,7 @@ download:
97
101
  ```
98
102
 
99
103
  2. 第二步,运行下面的python代码
104
+
100
105
  ```python
101
106
  import jmcomic
102
107
 
@@ -104,24 +109,14 @@ import jmcomic
104
109
  option = jmcomic.create_option_by_file('你的配置文件路径,例如 D:/option.yml')
105
110
  # 使用option对象来下载本子
106
111
  jmcomic.download_album(422866, option)
112
+ # 等价写法: option.download_album(422866)
107
113
  ```
108
114
 
109
-
110
-
111
115
  ## 进阶使用
112
116
 
113
- 文档网站:[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/en/latest)
114
-
115
- 首先,就下载功能,jmcomic提供了很多配置项,大部分的下载需求你都可以通过上文介绍的配置文件来配置。
117
+ 请查阅文档首页→[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/zh-cn/latest)
116
118
 
117
- 如果你不满足于下载,还有其他的使用需求,推荐你先看看以下文档:
118
-
119
- * [jmcomic常用类和方法演示](assets/docs/sources/tutorial/0_demo.md)
120
- * [option配置文件语法(包含插件配置)](./assets/docs/sources/option_file_syntax.md)
121
- * [GitHub Actions使用教程](./assets/docs/sources/tutorial/1_github_actions.md)
122
- * [命令行使用教程](assets/docs/sources/tutorial/2_command_line.md)
123
- * [插件机制](assets/docs/sources/tutorial/6_plugin.md)
124
- * [下载过滤器机制](assets/docs/sources/tutorial/5_filter.md)
119
+ (提示:jmcomic提供了很多下载配置项,大部分的下载需求你都可以尝试寻找相关配置项或插件来实现。)
125
120
 
126
121
  ## 项目特点
127
122
 
@@ -129,35 +124,35 @@ jmcomic.download_album(422866, option)
129
124
  - **实现禁漫APP接口最新的加解密算法 (1.6.3)**
130
125
  - 用法多样:
131
126
 
132
- - GitHub
133
- Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
134
- - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
135
- - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
127
+ - GitHub
128
+ Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
129
+ - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
130
+ - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
136
131
  - 支持**网页端**和**移动端**两种客户端实现,可通过配置切换(**移动端不限ip兼容性好,网页端限制ip地区但效率高**)
137
132
  - 支持**自动重试和域名切换**机制
138
133
  - **多线程下载**(可细化到一图一线程,效率极高)
139
134
  - **可配置性强**
140
135
 
141
- - 不配置也能使用,十分方便
142
- - 配置可以从配置文件生成,支持多种文件格式
143
- - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
144
-
136
+ - 不配置也能使用,十分方便
137
+ - 配置可以从配置文件生成,支持多种文件格式
138
+ - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
139
+
145
140
  - **可扩展性强**
146
141
 
147
- - 支持自定义本子/章节/图片下载前后的回调函数
148
- - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
149
- - 支持自定义日志、异常监听器
150
- - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
151
- - `登录插件`
152
- - `硬件占用监控插件`
153
- - `只下载新章插件`
154
- - `压缩文件插件`
155
- - `下载特定后缀图片插件`
156
- - `发送QQ邮件插件`
157
- - `日志主题过滤插件`
158
- - `自动使用浏览器cookies插件`
159
- - `jpg图片合成为一个pdf插件`
160
- - `导出收藏夹为csv文件插件`
142
+ - 支持自定义本子/章节/图片下载前后的回调函数
143
+ - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
144
+ - 支持自定义日志、异常监听器
145
+ - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
146
+ - `登录插件`
147
+ - `硬件占用监控插件`
148
+ - `只下载新章插件`
149
+ - `压缩文件插件`
150
+ - `下载特定后缀图片插件`
151
+ - `发送QQ邮件插件`
152
+ - `日志主题过滤插件`
153
+ - `自动使用浏览器cookies插件`
154
+ - `jpg图片合成为一个pdf插件`
155
+ - `导出收藏夹为csv文件插件`
161
156
 
162
157
  ## 使用小说明
163
158
 
@@ -169,13 +164,11 @@ jmcomic.download_album(422866, option)
169
164
  * .github:GitHub Actions配置文件
170
165
  * assets:存放一些非代码的资源文件
171
166
 
172
- * docs:项目文档
173
- * option:存放配置文件
174
-
167
+ * docs:项目文档
168
+ * option:存放配置文件
175
169
  * src:存放源代码
176
170
 
177
- * jmcomic:`jmcomic`模块
178
-
171
+ * jmcomic:`jmcomic`模块
179
172
  * tests:测试目录,存放测试代码,使用unittest
180
173
  * usage:用法目录,存放示例/使用代码
181
174
 
@@ -183,4 +176,10 @@ jmcomic.download_album(422866, option)
183
176
 
184
177
  ### 图片分割算法代码+禁漫移动端API
185
178
 
186
- [![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt)](https://github.com/tonquer/JMComic-qt)
179
+ <a href="https://github.com/tonquer/JMComic-qt">
180
+ <picture>
181
+ <source media="(prefers-color-scheme: dark)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt&theme=radical" />
182
+ <source media="(prefers-color-scheme: light)" srcset="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
183
+ <img alt="Repo Card" src="https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt" />
184
+ </picture>
185
+ </a>
jmcomic-2.5.14/README.md DELETED
@@ -1,158 +0,0 @@
1
- # Python API For JMComic (禁漫天堂)
2
-
3
- 本项目封装了一套可用于爬取JM的Python API.
4
-
5
- 你可以通过简单的几行Python代码,实现下载JM上的本子到本地,并且是处理好的图片。
6
-
7
- [【指路】教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md)
8
-
9
- [【指路】教程:导出并下载你的禁漫收藏夹数据](./assets/docs/sources/tutorial/10_export_favorites.md)
10
-
11
- **友情提示:珍爱JM,为了减轻JM的服务器压力,请不要一次性爬取太多本子,西门🙏🙏🙏**.
12
-
13
- ## 项目介绍
14
-
15
- 本项目的核心功能是下载本子,基于此,设计了一套方便使用、便于扩展,能满足一些特殊下载需求的框架。
16
-
17
- 目前核心功能实现较为稳定,项目也处于维护阶段。
18
-
19
- 除了下载功能以外,也实现了其他的一些禁漫接口,按需实现,具体如下。
20
-
21
- ### 已实现的禁漫API:
22
-
23
- - 登录
24
- - 搜本
25
- - 分类 (排行榜)
26
- - 本子章节详情
27
- - 图片下载解码
28
- - 收藏夹
29
- - 移动端接口加解密
30
-
31
- ## 安装教程
32
-
33
- * 通过pip官方源安装(推荐,并且更新也是这个命令)
34
-
35
- ```shell
36
- pip install jmcomic -i https://pypi.org/project -U
37
- ```
38
- * 通过源代码安装
39
-
40
- ```shell
41
- pip install git+https://github.com/hect0x7/JMComic-Crawler-Python
42
- ```
43
-
44
- ## 快速上手
45
-
46
- ### 1. 下载本子方法
47
- 只需要使用如下代码,就可以下载本子`JM422866`的所有章节的图片:
48
- ```python
49
- import jmcomic # 导入此模块,需要先安装.
50
- jmcomic.download_album('422866') # 传入要下载的album的id,即可下载整个album到本地.
51
- ```
52
-
53
- 上面的 `download_album`方法还有一个参数`option`,可用于控制下载配置,配置包括禁漫域名、网络代理、图片格式转换、插件等等。
54
-
55
- 你可能需要这些配置项。推荐使用配置文件创建option,用option下载本子,见下章:
56
-
57
- ### 2. 使用option配置来下载本子
58
-
59
- 1. 首先,创建一个配置文件,假设文件名为 `option.yml`
60
-
61
- 该文件有特定的写法,你需要参考这个文档 → [option配置](./assets/docs/sources/option_file_syntax.md)
62
-
63
- 下面做一个演示,假设你需要把下载的图片转为png格式,你应该把以下内容写进`option.yml`
64
-
65
- ```yml
66
- download:
67
- image:
68
- suffix: .png # 该配置用于把下载的图片转为png格式
69
- ```
70
-
71
- 2. 第二步,运行下面的python代码
72
- ```python
73
- import jmcomic
74
-
75
- # 创建配置对象
76
- option = jmcomic.create_option_by_file('你的配置文件路径,例如 D:/option.yml')
77
- # 使用option对象来下载本子
78
- jmcomic.download_album(422866, option)
79
- ```
80
-
81
-
82
-
83
- ## 进阶使用
84
-
85
- 文档网站:[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/en/latest)
86
-
87
- 首先,就下载功能,jmcomic提供了很多配置项,大部分的下载需求你都可以通过上文介绍的配置文件来配置。
88
-
89
- 如果你不满足于下载,还有其他的使用需求,推荐你先看看以下文档:
90
-
91
- * [jmcomic常用类和方法演示](assets/docs/sources/tutorial/0_demo.md)
92
- * [option配置文件语法(包含插件配置)](./assets/docs/sources/option_file_syntax.md)
93
- * [GitHub Actions使用教程](./assets/docs/sources/tutorial/1_github_actions.md)
94
- * [命令行使用教程](assets/docs/sources/tutorial/2_command_line.md)
95
- * [插件机制](assets/docs/sources/tutorial/6_plugin.md)
96
- * [下载过滤器机制](assets/docs/sources/tutorial/5_filter.md)
97
-
98
- ## 项目特点
99
-
100
- - **绕过Cloudflare的反爬虫**
101
- - **实现禁漫APP接口最新的加解密算法 (1.6.3)**
102
- - 用法多样:
103
-
104
- - GitHub
105
- Actions:网页上直接输入本子id就能下载([教程:使用GitHub Actions下载禁漫本子](./assets/docs/sources/tutorial/1_github_actions.md))
106
- - 命令行:无需写Python代码,简单易用([教程:使用命令行下载禁漫本子](./assets/docs/sources/tutorial/2_command_line.md))
107
- - Python代码:最本质、最强大的使用方式,需要你有一定的python编程基础
108
- - 支持**网页端**和**移动端**两种客户端实现,可通过配置切换(**移动端不限ip兼容性好,网页端限制ip地区但效率高**)
109
- - 支持**自动重试和域名切换**机制
110
- - **多线程下载**(可细化到一图一线程,效率极高)
111
- - **可配置性强**
112
-
113
- - 不配置也能使用,十分方便
114
- - 配置可以从配置文件生成,支持多种文件格式
115
- - 配置点有:`请求域名` `客户端实现` `是否使用磁盘缓存` `同时下载的章节/图片数量` `图片格式转换` `下载路径规则` `请求元信息(headers,cookies,proxies)`
116
-
117
- - **可扩展性强**
118
-
119
- - 支持自定义本子/章节/图片下载前后的回调函数
120
- - 支持自定义类:`Downloader(负责调度)` `Option(负责配置)` `Client(负责请求)` `实体类`等
121
- - 支持自定义日志、异常监听器
122
- - **支持Plugin插件,可以方便地扩展功能,以及使用别人的插件,目前内置插件有**:
123
- - `登录插件`
124
- - `硬件占用监控插件`
125
- - `只下载新章插件`
126
- - `压缩文件插件`
127
- - `下载特定后缀图片插件`
128
- - `发送QQ邮件插件`
129
- - `日志主题过滤插件`
130
- - `自动使用浏览器cookies插件`
131
- - `jpg图片合成为一个pdf插件`
132
- - `导出收藏夹为csv文件插件`
133
-
134
- ## 使用小说明
135
-
136
- * Python >= 3.7
137
- * 个人项目,文档和示例会有不及时之处,可以Issue提问
138
-
139
- ## 项目文件夹介绍
140
-
141
- * .github:GitHub Actions配置文件
142
- * assets:存放一些非代码的资源文件
143
-
144
- * docs:项目文档
145
- * option:存放配置文件
146
-
147
- * src:存放源代码
148
-
149
- * jmcomic:`jmcomic`模块
150
-
151
- * tests:测试目录,存放测试代码,使用unittest
152
- * usage:用法目录,存放示例/使用代码
153
-
154
- ## 感谢以下项目
155
-
156
- ### 图片分割算法代码+禁漫移动端API
157
-
158
- [![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=tonquer&repo=JMComic-qt)](https://github.com/tonquer/JMComic-qt)
File without changes
File without changes
File without changes
File without changes