Skip to content

Commit d8349d8

Browse files
authored
v1.2.0: 给JmPhotoDetail增加属性 章节序号(从1开始)、并增加相应测试、优化代码。 (#9)
1 parent b38ee83 commit d8349d8

File tree

7 files changed

+87
-37
lines changed

7 files changed

+87
-37
lines changed

src/jmcomic/__init__.py

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

5-
__version__ = '1.1.0'
5+
__version__ = '1.2.0'
66

77
from .api import *

src/jmcomic/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def download_by_photo_detail(photo_detail: JmPhotoDetail,
9898
jm_client.update(photo_detail)
9999

100100
# 下载每个图片的函数
101-
def download_image(index,img_detail, debug_topic='download_images_of_photo'):
101+
def download_image(index, img_detail, debug_topic='download_images_of_photo'):
102102
img_save_path = option.decide_image_filepath(photo_detail, index)
103103

104104
# 已下载过,缓存命中

src/jmcomic/jm_entity.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def get_title(self) -> str:
3838
def __len__(self):
3939
raise NotImplementedError
4040

41-
def __getitem__(self, item):
41+
def __getitem__(self, item) -> Union['JmAlbumDetail', 'JmPhotoDetail']:
4242
raise NotImplementedError
4343

4444

@@ -99,6 +99,7 @@ def __init__(self,
9999
title,
100100
keywords,
101101
series_id,
102+
sort,
102103
page_arr=None,
103104
data_original_domain=None,
104105
author=None,
@@ -107,6 +108,7 @@ def __init__(self,
107108
self.photo_id: str = photo_id
108109
self.scramble_id: str = scramble_id
109110
self.title: str = title
111+
self.sort: int = int(sort)
110112
self._keywords: str = keywords
111113
self._series_id: int = int(series_id)
112114

@@ -120,8 +122,10 @@ def __init__(self,
120122

121123
# 该photo的所有图片名 img_name
122124
self.page_arr: List[str] = page_arr
123-
self.data_original_domain = data_original_domain
125+
# 图片域名
126+
self.data_original_domain: StrNone = data_original_domain
124127

128+
@property
125129
def is_single_album(self) -> bool:
126130
return self._series_id == 0
127131

@@ -131,7 +135,20 @@ def keyword_list(self) -> List[str]:
131135

132136
@property
133137
def album_id(self) -> str:
134-
return self.photo_id if self.is_single_album() else self._series_id
138+
return self.photo_id if self.is_single_album else self._series_id
139+
140+
@property
141+
def album_index(self) -> int:
142+
"""
143+
返回这个章节在本子中的序号,从1开始
144+
"""
145+
146+
# 如果是单章本子,JM给的sort为2。
147+
# 这里返回1比较符合语义定义
148+
if self.is_single_album and self.sort == 2:
149+
return 1
150+
151+
return self.sort
135152

136153
@property
137154
def author(self) -> str:
@@ -167,7 +184,11 @@ def get_img_data_original(self, img_name: str) -> str:
167184
例如:img_name = 01111.webp
168185
返回:https://cdn-msp2.18comic.org/media/photos/147643/01111.webp
169186
"""
170-
return f'https://{self.data_original_domain}/media/photos/{self.photo_id}/{img_name}'
187+
data_original_domain = self.data_original_domain
188+
if data_original_domain is None:
189+
raise AssertionError(f'图片域名为空: {self.__dict__}')
190+
191+
return f'https://{data_original_domain}/media/photos/{self.photo_id}/{img_name}'
171192

172193
def __getitem__(self, item) -> JmImageDetail:
173194
return self.create_image_detail(item)
@@ -224,6 +245,7 @@ def create_photo_detail(self, index) -> Tuple[JmPhotoDetail, Tuple]:
224245
title=photo_title,
225246
keywords='',
226247
series_id=self.album_id,
248+
sort=index + 1,
227249
author=self.author,
228250
from_album=self,
229251
page_arr=None,

src/jmcomic/jm_option.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ class DownloadDirTree:
8282
# 根目录 / Photo号 / 图片文件
8383
Bd_Id_Image = 5
8484

85-
AdditionalHandler = Callable[[Optional[JmAlbumDetail], JmPhotoDetail], str]
85+
AdditionalHandler = Callable[
86+
['DownloadDirTree', Optional[JmAlbumDetail], JmPhotoDetail],
87+
str
88+
]
8689
additional_tree_flag_handler_mapping: Dict[int, AdditionalHandler] = {}
8790

8891
dsl_support = {
@@ -164,7 +167,7 @@ def photo_dir(flag_for_title):
164167

165168
else:
166169
if flag in self.additional_tree_flag_handler_mapping:
167-
return self.additional_tree_flag_handler_mapping[flag](album, photo)
170+
return self.additional_tree_flag_handler_mapping[flag](self, album, photo)
168171
else:
169172
raise NotImplementedError
170173

src/jmcomic/jm_toolkit.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class JmcomicText:
1414
pattern_html_photo_data_original_domain = compile('src="https://(.*?)/media/albums/blank')
1515
pattern_html_photo_keywords = compile('<meta name="keywords" content="(.*?)" />')
1616
pattern_html_photo_series_id = compile('var series_id = (\d+);')
17+
pattern_html_photo_sort = compile('var sort = (\d+);')
1718
pattern_html_photo_page_arr = compile('var page_arr = (.*?);')
1819

1920
pattern_html_album_album_id = compile('<span class="number">.*?:JM(\d+)</span>')

tests/test_jmcomic/test_dir_tree.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

tests/test_jmcomic/test_jm_api.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,56 @@ def decide_image_filepath(self,
6060
option = JmOption.default()
6161
option.register_advice(MyAdvice())
6262
jmcomic.download_album('366867', option)
63+
64+
def test_photo_sort(self):
65+
client = JmOption.default().build_jm_client()
66+
67+
# 测试用例 - 单章本子
68+
single_photo_album_is = str_to_list('''
69+
430371
70+
438696
71+
432888
72+
''')
73+
74+
# 测试用例 - 多章本子
75+
multi_photo_album_is = str_to_list('''
76+
400222
77+
122061
78+
''')
79+
80+
photo_dict: Dict[str, JmPhotoDetail] = multi_call(client.get_photo_detail, single_photo_album_is)
81+
album_dict: Dict[str, JmAlbumDetail] = multi_call(client.get_album_detail, single_photo_album_is)
82+
83+
for each in photo_dict.values():
84+
each: JmPhotoDetail
85+
self.assertEqual(each.album_index, 1)
86+
87+
for each in album_dict.values():
88+
each: JmAlbumDetail
89+
self.assertEqual(each[0].album_index, 1)
90+
91+
print_eye_catching('【通过】测试用例 - 单章本子')
92+
multi_photo_album_dict: Dict[JmAlbumDetail, List[JmPhotoDetail]] = {}
93+
94+
def run(aid):
95+
album = client.get_album_detail(aid)
96+
97+
photo_dict = multi_call(
98+
client.get_photo_detail,
99+
(photo.photo_id for photo in album),
100+
launcher=thread_pool_executor,
101+
)
102+
103+
multi_photo_album_dict[album] = list(photo_dict.values())
104+
105+
multi_thread_launcher(
106+
iter_objs=multi_photo_album_is,
107+
apply_each_obj_func=run,
108+
)
109+
110+
for album, photo_ls in multi_photo_album_dict.items():
111+
self.assertListEqual(
112+
sorted([each.sort for each in album]),
113+
sorted([ans.sort for ans in photo_ls]),
114+
album.album_id
115+
)

0 commit comments

Comments
 (0)