Skip to content

Commit 17fc58d

Browse files
authored
v2.6.16: 新增cli命令 jmv 用于快速提取JM车号和查询本子详情 (#521)
1 parent 39b1a2e commit 17fc58d

7 files changed

Lines changed: 403 additions & 11 deletions

File tree

README.md

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ jmcomic.download_album(123, option)
117117
### 3. 使用命令行
118118
> 如果只想下载本子,使用命令行会比上述方式更加简单直接
119119
>
120-
> 例如,在windows上,直接按下win+r键,输入jmcomic xxx就可以下载本子
120+
> 例如,在windows上,直接按下 win+R 键,输入`jmcomic xxx`就可以下载本子
121121
122122
示例:
123123

@@ -147,11 +147,67 @@ b. 配置环境变量 `JM_OPTION_PATH` 为option文件路径(推荐)
147147
jmcomic 123
148148
```
149149

150+
### 4. 查看本子详情(jmv 命令)
151+
152+
> `jmv` 命令用于快速查看本子详情,不做下载。
153+
>
154+
> **适用场景**:在某些网站上看到一串*神秘车号*,想快速看看具体是啥本子。此时只需copy原文本,按下 win+R,输入`jmv [粘贴内容]`即可
155+
>
156+
> 支持从任意文本中提取数字作为车号,方便直接粘贴各种格式的车号。
157+
158+
示例:
159+
160+
```sh
161+
# 直接输入车号
162+
jmv 350234
163+
164+
# 从混合文本中提取数字(提取出 350234)
165+
jmv 350谁还没看过234
166+
167+
# 指定option文件(也支持环境变量,用法同上)
168+
jmv 350234 --option="D:/a.yml"
169+
170+
# -y 参数:执行完毕后直接退出,无需按回车确认
171+
jmv 350234 -y
172+
```
173+
174+
输出效果:
175+
176+
```text
177+
🔍 正在查询 禁漫车号 - [350234] 的详情...
178+
179+
──────────────────────────────────────────────────
180+
📖 标题: xxx
181+
🆔 ID: JM350234
182+
🔗 链接: https://18comic.vip/album/350234/
183+
✍️ 作者: Author1, Author2
184+
──────────────────────────────────────────────────
185+
📅 发布日期: 2022-06-15
186+
📅 更新日期: 2023-01-01
187+
📄 总页数: 50
188+
👀 观看: 2M
189+
❤️ 点赞: 77K
190+
💬 评论: 9801
191+
──────────────────────────────────────────────────
192+
🏷️ 标签: 标签1, 标签2, ...
193+
🎭 人物: 角色A, 角色B, ...
194+
📚 作品: 作品1, 作品2, ...
195+
──────────────────────────────────────────────────
196+
📑 章节 (2):
197+
第1話 上 (id: 350234)
198+
第2話 下 (id: 350235)
199+
──────────────────────────────────────────────────
200+
201+
[运行结束] 请按回车键关闭窗口... (下次运行可附加 -y 参数跳过确认)
202+
```
203+
150204

151205

152206
## 进阶使用
153207

154-
请查阅文档首页→[jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/zh-cn/latest)
208+
请查阅文档首页 → [jmcomic.readthedocs.io](https://jmcomic.readthedocs.io/zh-cn/latest)
209+
210+
或者查看github仓库的文档 → [github-repo-docs](https://github.com/hect0x7/JMComic-Crawler-Python/blob/master/assets/docs/sources/tutorial/0_common_usage.md)
155211

156212
(提示:jmcomic提供了很多下载配置项,大部分的下载需求你都可以尝试寻找相关配置项或插件来实现。)
157213

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,91 @@
11
# 命令行教程
22

3-
## 1. 基本用法
3+
## 1. jmcomic - 下载本子
44

5-
```
5+
### 1.1 基本用法
6+
7+
```sh
68
# 下载album 123 456,下载photo 333。彼此之间使用空格间隔
79
jmcomic 123 456 p333
810
```
911

10-
## 2. 自定义option
12+
### 1.2 自定义option
1113

12-
### 2.1. 通过命令行
14+
#### 通过命令行参数
1315
使用 --option 参数指定option配置文件路径
1416

1517
```sh
1618
jmcomic 123 --option="D:/a.yml"
1719
```
1820

19-
### 2.2. 使用环境变量
21+
#### 使用环境变量
2022
配置环境变量 `JM_OPTION_PATH` 为option配置文件路径
2123

2224
> 请自行google配置环境变量的方式,或使用powershell命令: `setx JM_OPTION_PATH "D:/a.yml"` 重启后生效
2325
2426
```sh
2527
jmcomic 123
2628
```
29+
30+
## 2. jmv - 查看本子详情
31+
32+
`jmv` 命令用于快速查看本子详情,无需下载。支持从任意文本中提取数字作为车号。
33+
34+
### 2.1 基本用法
35+
36+
```sh
37+
# 直接输入车号
38+
jmv 350234
39+
40+
# 从混合文本中提取数字(提取出 350234)
41+
jmv 350谁还没看过234
42+
43+
# JM前缀也可以
44+
jmv JM350234
45+
```
46+
47+
### 2.2 附加参数
48+
49+
`jmcomic` 命令类似,支持 `--option` 参数和 `JM_OPTION_PATH` 环境变量:
50+
51+
```sh
52+
jmv 350234 --option="D:/a.yml"
53+
```
54+
55+
如果希望在执行完毕后立刻退出且不出现“请按回车键关闭窗口...”的停留提示(适用于自动化代码调用或常规终端使用时),可添加 `-y` 选项:
56+
57+
```sh
58+
jmv 350234 -y
59+
```
60+
61+
### 2.3 输出示例
62+
63+
```text
64+
🔍 正在查询 禁漫车号 - [350234] 的详情...
65+
66+
──────────────────────────────────────────────────
67+
📖 标题: xxx
68+
🆔 ID: JM350234
69+
🔗 链接: https://18comic.vip/album/350234/
70+
✍️ 作者: Author1, Author2
71+
──────────────────────────────────────────────────
72+
📅 发布日期: 2022-06-15
73+
📅 更新日期: 2023-01-01
74+
📄 总页数: 50
75+
👀 观看: 2M
76+
❤️ 点赞: 77K
77+
💬 评论: 9801
78+
──────────────────────────────────────────────────
79+
🏷️ 标签: 标签1, 标签2, ...
80+
🎭 人物: 角色A, 角色B, ...
81+
📚 作品: 作品1, 作品2, ...
82+
──────────────────────────────────────────────────
83+
📑 章节 (2):
84+
第1話 上 (id: 350234)
85+
第2話 下 (id: 350235)
86+
──────────────────────────────────────────────────
87+
88+
[运行结束] 请按回车键关闭窗口... (下次运行可附加 -y 参数跳过确认)
89+
```
90+
91+
> **说明**: 当作者、标签、人物、作品超过10个时,会自动截断并显示总数(如 `...等25个`)。

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@
4949
],
5050
entry_points={
5151
'console_scripts': [
52-
'jmcomic = jmcomic.cl:main'
52+
'jmcomic = jmcomic.cl:main',
53+
'jmv = jmcomic.cl:view_main',
5354
]
5455
}
5556
)

src/jmcomic/__init__.py

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

5-
__version__ = '2.6.15'
5+
__version__ = '2.6.16'
66

77
from .api import *
88
from .jm_plugin import *

src/jmcomic/cl.py

Lines changed: 137 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
"""
22
command-line usage
33
4-
for example, download album 123 456, photo 333:
4+
1. jmcomic - download album/photo:
55
6-
$ jmcomic 123 456 p333 --option="D:/option.yml"
6+
$ jmcomic 123 456 p333 --option="D:/option.yml"
77
8+
2. jmv - view album detail (extract digits from text as album id):
9+
10+
$ jmv 350234
11+
$ jmv 350谁还没看过234
12+
$ jmv abc123141 --option="D:/option.yml"
813
914
"""
1015
import os.path
@@ -119,3 +124,133 @@ def run(self, option):
119124

120125
def main():
121126
JmcomicUI().main()
127+
128+
129+
class JmViewUI:
130+
131+
def __init__(self) -> None:
132+
self.raw_text: str = ''
133+
self.option_path: Optional[str] = None
134+
self.auto_exit: bool = False
135+
136+
def parse_arg(self):
137+
import argparse
138+
parser = argparse.ArgumentParser(
139+
prog='jmv',
140+
description='JMComic Album Viewer - 从文本中提取数字作为album ID,查看本子详情',
141+
)
142+
parser.add_argument(
143+
'text',
144+
help='包含数字的禁漫车号,例如 "350谁还没看过234",会提取出 "350234" 作为 album ID',
145+
)
146+
parser.add_argument(
147+
'--option',
148+
help='option 文件路径,也可通过环境变量 JM_OPTION_PATH 指定',
149+
type=str,
150+
default=get_env('JM_OPTION_PATH', ''),
151+
)
152+
parser.add_argument(
153+
'-y', '--yes',
154+
action='store_true',
155+
help='执行完毕后直接退出,无需按回车确认',
156+
)
157+
158+
args = parser.parse_args()
159+
self.raw_text = args.text
160+
self.auto_exit = args.yes
161+
162+
option_str = args.option
163+
if len(option_str) == 0 or option_str == "''":
164+
self.option_path = None
165+
else:
166+
self.option_path = os.path.abspath(option_str)
167+
168+
def extract_album_id(self) -> str:
169+
import re
170+
numbers = re.findall(r'\d+', self.raw_text)
171+
if not numbers:
172+
from .api import jm_log
173+
jm_log('jmv', f'❌❌❌ 解析失败: 无法从 "{self.raw_text}" 中提取到任何数字 ❌❌❌')
174+
exit(1)
175+
album_id = ''.join(numbers)
176+
return album_id
177+
178+
@staticmethod
179+
def _truncate_list(items, limit=10):
180+
if len(items) <= limit:
181+
return ', '.join(items)
182+
return ', '.join(items[:limit]) + f' ...等{len(items)}个'
183+
184+
def print_album_detail(self, album):
185+
from jmcomic import JmcomicText
186+
187+
sep = '─' * 50
188+
189+
print(f'\n{sep}')
190+
print(f' 📖 标题: {album.name}')
191+
print(f' 🆔 ID: JM{album.album_id}')
192+
print(f' 🔗 链接: {JmcomicText.format_album_url(album.album_id)}')
193+
print(f' 🎨 封面: {JmcomicText.get_album_cover_url(album.album_id)}')
194+
print(f' ✍️ 作者: {self._truncate_list(album.authors) if album.authors else "未知"}')
195+
print(sep)
196+
197+
print(f' 📅 发布日期: {album.pub_date}')
198+
print(f' 📅 更新日期: {album.update_date}')
199+
print(f' 📄 总页数: {album.page_count}')
200+
print(f' 👀 观看: {album.views}')
201+
print(f' ❤️ 点赞: {album.likes}')
202+
print(f' 💬 评论: {album.comment_count}')
203+
print(sep)
204+
205+
if album.tags:
206+
print(f' 🏷️ 标签: {self._truncate_list(album.tags)}')
207+
if album.actors:
208+
print(f' 🎭 人物: {self._truncate_list(album.actors)}')
209+
if album.works:
210+
print(f' 📚 作品: {self._truncate_list(album.works)}')
211+
212+
if album.description:
213+
print(f' 📝 简介: {album.description}')
214+
215+
print(sep)
216+
episode_count = len(album.episode_list)
217+
print(f' 📑 章节 ({episode_count}):')
218+
for pid, pindex, pname in album.episode_list:
219+
pname = pname.strip()
220+
print(f' 第{pindex}{pname} (id: {pid})')
221+
222+
print(f'{sep}\n')
223+
224+
def _pause(self):
225+
if not self.auto_exit:
226+
input('\n[运行结束] 请按回车键关闭窗口... (下次运行可附加 -y 参数跳过确认)')
227+
228+
def main(self):
229+
self.parse_arg()
230+
231+
import atexit
232+
atexit.register(self._pause)
233+
234+
album_id = self.extract_album_id()
235+
236+
from .api import jm_log
237+
jm_log('jmv', f'🔍 正在查询 禁漫车号 - [{album_id}] 的详情...')
238+
239+
from .api import create_option, JmOption
240+
if self.option_path is not None:
241+
option = create_option(self.option_path)
242+
else:
243+
option = JmOption.default()
244+
245+
client = option.new_jm_client()
246+
try:
247+
album = client.get_album_detail(album_id)
248+
except Exception as e:
249+
jm_log('jmv', f'❌❌❌ 获取失败: album {album_id} 详情请求出错, 原因: {e}', e)
250+
exit(1)
251+
252+
self.print_album_detail(album)
253+
254+
255+
def view_main():
256+
JmViewUI().main()

src/jmcomic/jm_toolkit.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ def compare_versions(cls, v1: str, v2: str) -> int:
431431
else:
432432
return 0 # 相等
433433

434+
434435
# 支持dsl: #{???} -> os.getenv(???)
435436
JmcomicText.dsl_replacer.add_dsl_and_replacer(r'\$\{(.*?)\}', JmcomicText.match_os_env)
436437

0 commit comments

Comments
 (0)