-
-
Notifications
You must be signed in to change notification settings - Fork 11k
Expand file tree
/
Copy pathapi.py
More file actions
140 lines (106 loc) · 4.83 KB
/
Copy pathapi.py
File metadata and controls
140 lines (106 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from .jm_downloader import *
__DOWNLOAD_API_RET = Tuple[JmAlbumDetail, JmDownloader]
def download_batch(download_api,
jm_id_iter: Union[Iterable, Generator],
option=None,
downloader=None,
**kwargs,
) -> Set[__DOWNLOAD_API_RET]:
"""
批量下载 album / photo
一个album/photo,对应一个线程,对应一个option
:param download_api: 下载api
:param jm_id_iter: jmid (album_id, photo_id) 的迭代器
:param option: 下载选项,所有的jmid共用一个option
:param downloader: 下载器类
"""
from common import multi_thread_launcher
if option is None:
option = JmModuleConfig.option_class().default()
result = set()
def callback(*ret):
result.add(ret)
multi_thread_launcher(
iter_objs=set(
JmcomicText.parse_to_jm_id(jmid)
for jmid in jm_id_iter
),
apply_each_obj_func=lambda aid: download_api(aid,
option,
downloader,
callback=callback,
**kwargs,
),
wait_finish=True
)
return result
def download_album(jm_album_id,
option=None,
downloader=None,
callback=None,
check_exception=True,
extra=None,
) -> Union[__DOWNLOAD_API_RET, Set[__DOWNLOAD_API_RET]]:
"""
下载一个本子(album),包含其所有的章节(photo)
当jm_album_id不是str或int时,视为批量下载,相当于调用 download_batch(download_album, jm_album_id, option, downloader)
:param jm_album_id: 本子的禁漫车号
:param option: 下载选项
:param downloader: 下载器类
:param callback: 返回值回调函数,可以拿到 album 和 downloader
:param check_exception: 是否检查异常, 如果为True,会检查downloader是否有下载异常,并上抛PartialDownloadFailedException
:param extra: 下载特性(Feature),下载时动态挂载的附加行为上下文。会自动根据上下文(如 album/photo 来源)自适应参数行为。支持单个 Feature、FeatureChain、或列表
:return: 对于的本子实体类,下载器(如果是上述的批量情况,返回值为download_batch的返回值)
"""
if not isinstance(jm_album_id, (str, int)):
return download_batch(download_album, jm_album_id, option, downloader, extra=extra)
with new_downloader(option, downloader) as dler:
# 注册 Feature 及来源,由 downloader 在 after_album 钩子中自动执行
dler.add_features(extra, 'download_album')
album = dler.download_album(jm_album_id)
if callback is not None:
callback(album, dler)
if check_exception:
dler.raise_if_has_exception()
return album, dler
def download_photo(jm_photo_id,
option=None,
downloader=None,
callback=None,
check_exception=True,
extra=None,
):
"""
下载一个章节(photo),参数同 download_album
"""
if not isinstance(jm_photo_id, (str, int)):
return download_batch(download_photo, jm_photo_id, option, downloader, extra=extra)
with new_downloader(option, downloader) as dler:
# 注册 Feature 及来源,由 downloader 在 after_photo 钩子中自动执行
dler.add_features(extra, 'download_photo')
photo = dler.download_photo(jm_photo_id)
if callback is not None:
callback(photo, dler)
if check_exception:
dler.raise_if_has_exception()
return photo, dler
def new_downloader(option=None, downloader=None) -> JmDownloader:
if option is None:
option = JmModuleConfig.option_class().default()
if downloader is None:
downloader = JmModuleConfig.downloader_class()
return downloader(option)
def create_option_by_file(filepath):
return JmModuleConfig.option_class().from_file(filepath)
def create_option_by_env(env_name='JM_OPTION_PATH'):
from .cl import get_env
filepath = get_env(env_name, None)
ExceptionTool.require_true(filepath is not None,
f'未配置环境变量: {env_name},请配置为option的文件路径')
return create_option_by_file(filepath)
def create_option_by_str(text: str, mode=None):
if mode is None:
mode = PackerUtil.mode_yml
data = PackerUtil.unpack_by_str(text, mode)[0]
return JmModuleConfig.option_class().construct(data)
create_option = create_option_by_file