@@ -138,11 +138,6 @@ async def async_download_webtoon(self, *args, **kwargs):
138138 self ._shuffled_directory / "information.json" ,
139139 )
140140
141- async def fetch_all (self , reload : bool = False ) -> None :
142- await super ().fetch_all (reload )
143- with suppress (AuthenticationError ):
144- await self .fetch_user_information (reload = reload )
145-
146141 async def _download_episodes (self , download_range , webtoon_directory : Path ) -> None :
147142 if self .is_shuffled and self .unshuffle_immediately :
148143 _load_unshuffler ()
@@ -204,13 +199,16 @@ async def fetch_episode_information(self, *, reload: bool = False) -> None:
204199
205200 thumbnail_url = res .single ('meta[property="og:image"]' ).attrs .get ("content" )
206201 assert thumbnail_url is not None
207- script_string = res .match ("script" )[- 1 ].text ()
208- try :
209- raw_data = re .match (r"self\.__next_.\.push\(\[\d,(.*)\]\)$" , script_string )[1 ] # type: ignore
210- data_raw = json .loads (json .loads (raw_data )[2 :])
211- data = data_raw [1 ][3 ]["entity" ]
212- except Exception as exc :
213- raise WebtoonIdError .from_webtoon_id (self .webtoon_id , LezhinComicsScraper ) from exc
202+ next_data = res .next_data ()
203+ for possible_data in next_data .values ():
204+ try :
205+ data = possible_data [1 ][3 ]["entity" ]
206+ except Exception :
207+ pass
208+ else :
209+ break
210+ else :
211+ raise WebtoonIdError .from_webtoon_id (self .webtoon_id , LezhinComicsScraper )
214212
215213 selector = "body > div.lzCntnr > div > div > ul > li > a" # cspell: ignore Cntnr
216214 episode_dates : list [str ] = []
@@ -245,33 +243,21 @@ async def fetch_episode_information(self, *, reload: bool = False) -> None:
245243 self .author : str = author
246244
247245 self ._parse_episode_information (data ["meta" ]["episodes" ])
246+ self ._parse_user_information (data ["stateByUser" ])
248247
249- @async_reload_manager
250- async def fetch_user_information (self , * , reload : bool = False ) -> None :
251- await self .fetch_episode_information ()
252- self .purchased_episodes = [False ] * len (self .episode_int_ids )
253- return # FIXME: 현재 작동하지 않는 관계로 스킵
254-
255- user_int_id = self .user_int_id or random .Random (self .webtoon_id ).randrange (5000000000000000 , 6000000000000000 )
256- url = f"https://www.lezhin.com/lz-api/v2/users/{ user_int_id } /contents/{ self .webtoon_int_id } "
257- try :
258- res = await self .client .get (url )
259- except HTTPStatusError :
260- raise AuthenticationError ("Cookie is invalid. Failed to fetch user information." ) from None
261- data : dict = res .json ()["data" ]
262- view_episodes_set = {int (episode_int_id ) for episode_int_id in data ["history" ] or []}
263- purchased_episodes_set = {int (episode_int_id ) for episode_int_id in data ["purchased" ] or []}
248+ def _parse_user_information (self , data ) -> None :
249+ episode_data_dict = {episode ['id' ]: episode for episode in data ["episodes" ]}
264250
265- raw_last_viewed_episode = data .get ("latestViewedEpisode" , 0 )
266- self .last_viewed_episode_int_id : int | None = int (raw_last_viewed_episode ) if raw_last_viewed_episode else None
251+ self .last_viewed_episode_int_id : int | None = data ["latestViewedEpisodeId" ]
267252
268253 # 계정 상태
269- self .is_subscribed = data ["subscribed " ]
254+ self .is_subscribed = data ["isSubscribed " ]
270255 self .does_get_notifications = data ["notification" ]
271256 self .is_preferred : bool | None = data ["preferred" ] if data ["preferred" ] != "none" else None
272257 # 에피소드 관련
273- self .purchased_episodes = [episode_id in purchased_episodes_set for episode_id in self .episode_int_ids ]
274- self .viewed_episodes = [episode_id in view_episodes_set for episode_id in self .episode_int_ids ]
258+ default = {"isCollected" : False , "isViewed" : False }
259+ self .purchased_episodes = [episode_data_dict .get (episode_id , default )["isCollected" ] for episode_id in self .episode_int_ids ]
260+ self .viewed_episodes = [episode_data_dict .get (episode_id , default )["isViewed" ] for episode_id in self .episode_int_ids ]
275261 if self .is_fhd_downloaded is None :
276262 self .is_fhd_downloaded = any (self .purchased_episodes )
277263
0 commit comments