@@ -48,6 +48,7 @@ def __init__(self,
4848 img_file_name ,
4949 img_file_suffix ,
5050 from_photo = None ,
51+ query_params = None ,
5152 ) -> None :
5253 self .aid : str = aid
5354 self .scramble_id : str = scramble_id
@@ -56,17 +57,31 @@ def __init__(self,
5657 self .img_file_suffix : str = img_file_suffix
5758
5859 self .from_photo : Optional [JmPhotoDetail ] = from_photo
60+ self .query_params : StrNone = query_params
5961
6062 @property
61- def filename (self ):
63+ def filename (self ) -> str :
6264 return self .img_file_name + self .img_file_suffix
6365
66+ @property
67+ def download_url (self ) -> str :
68+ """
69+ 图片的下载路径
70+ 与 self.img_url 的唯一不同是,在最后会带上 ?{self.query_params}
71+ @return:
72+ """
73+ if self .query_params is None :
74+ return self .img_url
75+
76+ return f'{ self .img_url } ?{ self .query_params } '
77+
6478 @classmethod
6579 def of (cls ,
6680 photo_id : str ,
6781 scramble_id : str ,
6882 data_original : str ,
6983 from_photo = None ,
84+ query_params = None ,
7085 ) -> 'JmImageDetail' :
7186 """
7287 该方法用于创建 JmImageDetail 对象
@@ -85,6 +100,7 @@ def of(cls,
85100 img_file_name = data_original [x + 1 :y ],
86101 img_file_suffix = data_original [y :],
87102 from_photo = from_photo ,
103+ query_params = query_params ,
88104 )
89105
90106
@@ -99,6 +115,7 @@ def __init__(self,
99115 sort ,
100116 page_arr = None ,
101117 data_original_domain = None ,
118+ data_original_0 = None ,
102119 author = None ,
103120 from_album = None ,
104121 ):
@@ -111,17 +128,28 @@ def __init__(self,
111128
112129 self ._author : StrNone = author
113130 self .from_album : Optional [JmAlbumDetail ] = from_album
131+ self .index = self .album_index
114132
115133 # 下面的属性和图片url有关
116134 if isinstance (page_arr , str ):
117135 import json
118136 page_arr = json .loads (page_arr )
119137
120- # 该photo的所有图片名 img_name
138+ # page_arr存放了该photo的所有图片文件名 img_name
121139 self .page_arr : List [str ] = page_arr
122- # 图片域名
140+ # 图片的cdn域名
123141 self .data_original_domain : StrNone = data_original_domain
124- self .index = self .album_index
142+ # 第一张图的URL
143+ self .data_original_0 = data_original_0
144+
145+ # 2023-07-14
146+ # 禁漫的图片url加上了一个参数v,如果没有带上这个参数v,图片会返回空数据
147+ # 参数v的特点:
148+ # 1. 值似乎是该photo的更新时间的时间戳,因此所有图片都使用同一个值
149+ # 2. 值目前在网页端只在photo页面的图片标签的data-original属性出现
150+ # 这里的模拟思路是,获取到第一个图片标签的data-original,
151+ # 取出其query参数 → self.data_original_query_params, 该值未来会传递给 JmImageDetail
152+ self .data_original_query_params = self .get_data_original_query_params (data_original_0 )
125153
126154 @property
127155 def is_single_album (self ) -> bool :
@@ -179,7 +207,8 @@ def create_image_detail(self, index) -> JmImageDetail:
179207 self .photo_id ,
180208 self .scramble_id ,
181209 data_original ,
182- from_photo = self
210+ from_photo = self ,
211+ query_params = self .data_original_query_params ,
183212 )
184213
185214 def get_img_data_original (self , img_name : str ) -> str :
@@ -194,6 +223,17 @@ def get_img_data_original(self, img_name: str) -> str:
194223
195224 return f'https://{ data_original_domain } /media/photos/{ self .photo_id } /{ img_name } '
196225
226+ # noinspection PyMethodMayBeStatic
227+ def get_data_original_query_params (self , data_original_0 : StrNone ) -> str :
228+ if data_original_0 is None :
229+ return f'v={ time_stamp ()} '
230+
231+ index = data_original_0 .rfind ('?' )
232+ if index == - 1 :
233+ return f'v={ time_stamp ()} '
234+
235+ return data_original_0 [index + 1 :]
236+
197237 def __getitem__ (self , item ) -> JmImageDetail :
198238 return self .create_image_detail (item )
199239
0 commit comments