[ie/bilibili] Fix chapters and subtitles extraction (#11099)

Closes #11089
Authored by: bashonly
This commit is contained in:
bashonly 2024-09-26 18:20:14 -05:00 committed by GitHub
parent 5a8a05aebb
commit a2000bc857
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -46,6 +46,7 @@
class BilibiliBaseIE(InfoExtractor): class BilibiliBaseIE(InfoExtractor):
_HEADERS = {'Referer': 'https://www.bilibili.com/'}
_FORMAT_ID_RE = re.compile(r'-(\d+)\.m4s\?') _FORMAT_ID_RE = re.compile(r'-(\d+)\.m4s\?')
_WBI_KEY_CACHE_TIMEOUT = 30 # exact expire timeout is unclear, use 30s for one session _WBI_KEY_CACHE_TIMEOUT = 30 # exact expire timeout is unclear, use 30s for one session
_wbi_key_cache = {} _wbi_key_cache = {}
@ -192,7 +193,7 @@ def _get_subtitles(self, video_id, cid, aid=None):
video_info = self._download_json( video_info = self._download_json(
'https://api.bilibili.com/x/player/v2', video_id, 'https://api.bilibili.com/x/player/v2', video_id,
query={'aid': aid, 'cid': cid} if aid else {'bvid': video_id, 'cid': cid}, query={'aid': aid, 'cid': cid} if aid else {'bvid': video_id, 'cid': cid},
note=f'Extracting subtitle info {cid}') note=f'Extracting subtitle info {cid}', headers=self._HEADERS)
if traverse_obj(video_info, ('data', 'need_login_subtitle')): if traverse_obj(video_info, ('data', 'need_login_subtitle')):
self.report_warning( self.report_warning(
f'Subtitles are only available when logged in. {self._login_hint()}', only_once=True) f'Subtitles are only available when logged in. {self._login_hint()}', only_once=True)
@ -207,7 +208,7 @@ def _get_subtitles(self, video_id, cid, aid=None):
def _get_chapters(self, aid, cid): def _get_chapters(self, aid, cid):
chapters = aid and cid and self._download_json( chapters = aid and cid and self._download_json(
'https://api.bilibili.com/x/player/v2', aid, query={'aid': aid, 'cid': cid}, 'https://api.bilibili.com/x/player/v2', aid, query={'aid': aid, 'cid': cid},
note='Extracting chapters', fatal=False) note='Extracting chapters', fatal=False, headers=self._HEADERS)
return traverse_obj(chapters, ('data', 'view_points', ..., { return traverse_obj(chapters, ('data', 'view_points', ..., {
'title': 'content', 'title': 'content',
'start_time': 'from', 'start_time': 'from',
@ -1021,8 +1022,6 @@ def _real_extract(self, url):
class BilibiliCheeseBaseIE(BilibiliBaseIE): class BilibiliCheeseBaseIE(BilibiliBaseIE):
_HEADERS = {'Referer': 'https://www.bilibili.com/'}
def _extract_episode(self, season_info, ep_id): def _extract_episode(self, season_info, ep_id):
episode_info = traverse_obj(season_info, ( episode_info = traverse_obj(season_info, (
'episodes', lambda _, v: v['id'] == int(ep_id)), get_all=False) 'episodes', lambda _, v: v['id'] == int(ep_id)), get_all=False)