From 459ef828576ff73bb9a92150f633c94abf63c33f Mon Sep 17 00:00:00 2001 From: _Grqz <173015200+grqz@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:50:52 +1200 Subject: [PATCH] better err handling --- yt_dlp/extractor/bilibili.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/yt_dlp/extractor/bilibili.py b/yt_dlp/extractor/bilibili.py index 4f9dd0e96e..57d45d6317 100644 --- a/yt_dlp/extractor/bilibili.py +++ b/yt_dlp/extractor/bilibili.py @@ -205,7 +205,7 @@ def get_of(scroll_top=10, scroll_left=10): 'dm_img_inter': json.dumps({'ds': [], 'wh': get_wh(*self.__screen_dimensions()), 'of': get_of(random.randint(0, 100), 0)}).replace(' ', ''), } - def _download_playinfo(self, bvid, cid, headers=None, query=None): + def _download_playinfo(self, bvid, cid, headers=None, query=None, fatal=True): params = {'bvid': bvid, 'cid': cid, 'fnval': 4048, **(query or {})} if self.is_logged_in: params.pop('try_look', None) @@ -214,14 +214,23 @@ def _download_playinfo(self, bvid, cid, headers=None, query=None): else: note = f'Downloading video formats for cid {cid}' - playurl_data = self._download_json( + playurl_raw = self._download_json( 'https://api.bilibili.com/x/player/wbi/playurl', bvid, - query=self._sign_wbi(merge_dicts(params, self._dm_params), bvid), headers=headers, note=note)['data'] - if playurl_data.get('v_voucher'): - self.report_warning('Received a captcha from Bilibili while downloading play info') - return None + query=self._sign_wbi(merge_dicts(params, self._dm_params), bvid), headers=headers, note=note) + code = -playurl_raw['code'] + if code == 0: + return playurl_raw['data'] else: - return playurl_data + breakpoint() + err_desc = playurl_raw['message'] + msg = f'Unable to download video info({code}: {err_desc})' + expected = code in (401, 352) + if expected: + msg += ', please wait and try later' + if fatal: + raise ExtractorError(msg, expected=expected) + else: + self.report_warning(msg) def json2srt(self, json_data): srt_data = '' @@ -768,7 +777,7 @@ def _real_extract(self, url): self._search_json(r'window\.__playinfo__\s*=', webpage, 'play info', video_id, default=None), ('data', {dict})) if not self.is_logged_in or not play_info: - if dl_play_info := self._download_playinfo(video_id, cid, headers=headers, query={'try_look': 1}): + if dl_play_info := self._download_playinfo(video_id, cid, headers=headers, query={'try_look': 1}, fatal=False): play_info = dl_play_info if not play_info: raise ExtractorError('Unable to download play info')