未验证 提交 cdb0d3d1 编写于 作者: M Mort Yao

[bilibili] get alternative qualities for bangumi

上级 17d1597c
...@@ -208,58 +208,75 @@ class Bilibili(VideoExtractor): ...@@ -208,58 +208,75 @@ class Bilibili(VideoExtractor):
initial_state_text = match1(html_content, r'__INITIAL_STATE__=(.*?);\(function\(\)') # FIXME initial_state_text = match1(html_content, r'__INITIAL_STATE__=(.*?);\(function\(\)') # FIXME
initial_state = json.loads(initial_state_text) initial_state = json.loads(initial_state_text)
# set video title
self.title = initial_state['h1Title']
# warn if this bangumi has more than 1 video # warn if this bangumi has more than 1 video
epn = len(initial_state['epList']) epn = len(initial_state['epList'])
if epn > 1 and not kwargs.get('playlist'): if epn > 1 and not kwargs.get('playlist'):
log.w('This bangumi currently has %s videos. (use --playlist to download all videos.)' % epn) log.w('This bangumi currently has %s videos. (use --playlist to download all videos.)' % epn)
# set video title
self.title = initial_state['h1Title']
# construct playinfos
ep_id = initial_state['epInfo']['id'] ep_id = initial_state['epInfo']['id']
avid = initial_state['epInfo']['aid'] avid = initial_state['epInfo']['aid']
cid = initial_state['epInfo']['cid'] cid = initial_state['epInfo']['cid']
playinfos = []
api_url = self.bilibili_bangumi_api(avid, cid, ep_id) api_url = self.bilibili_bangumi_api(avid, cid, ep_id)
api_content = get_content(api_url, headers=self.bilibili_headers()) api_content = get_content(api_url, headers=self.bilibili_headers())
data = json.loads(api_content) api_playinfo = json.loads(api_content)
if data['code'] < 0: # error if api_playinfo['code'] == 0: # success
log.e(data['message']) playinfos.append(api_playinfo)
else:
log.e(api_playinfo['message'])
return return
current_quality = api_playinfo['result']['quality']
# get alternative formats from API
for qn in [80, 64, 32, 16]:
# automatic format for durl: qn=0
# for dash, qn does not matter
if qn != current_quality:
api_url = self.bilibili_bangumi_api(avid, cid, ep_id, qn=qn)
api_content = get_content(api_url, headers=self.bilibili_headers())
api_playinfo = json.loads(api_content)
if api_playinfo['code'] == 0: # success
playinfos.append(api_playinfo)
if 'durl' in data['result']: for playinfo in playinfos:
quality = data['result']['quality'] if 'durl' in playinfo['result']:
format_id = self.stream_qualities[quality]['id'] quality = playinfo['result']['quality']
container = self.stream_qualities[quality]['container'].lower() format_id = self.stream_qualities[quality]['id']
desc = self.stream_qualities[quality]['desc'] container = self.stream_qualities[quality]['container'].lower()
desc = self.stream_qualities[quality]['desc']
src, size = [], 0 src, size = [], 0
for durl in data['result']['durl']: for durl in playinfo['result']['durl']:
src.append(durl['url']) src.append(durl['url'])
size += durl['size'] size += durl['size']
self.streams[format_id] = {'container': container, 'quality': desc, 'size': size, 'src': src} self.streams[format_id] = {'container': container, 'quality': desc, 'size': size, 'src': src}
# DASH formats # DASH formats
if 'dash' in data['result']: if 'dash' in playinfo['result']:
for video in data['result']['dash']['video']: for video in playinfo['result']['dash']['video']:
quality = self.height_to_quality(video['height']) # convert height to quality code # playinfo['result']['quality'] does not reflect the correct quality of DASH stream
s = self.stream_qualities[quality] quality = self.height_to_quality(video['height']) # convert height to quality code
format_id = 'dash-' + s['id'] # prefix s = self.stream_qualities[quality]
container = 'mp4' # enforce MP4 container format_id = 'dash-' + s['id'] # prefix
desc = s['desc'] container = 'mp4' # enforce MP4 container
audio_quality = s['audio_quality'] desc = s['desc']
baseurl = video['baseUrl'] audio_quality = s['audio_quality']
size = url_size(baseurl, headers=self.bilibili_headers(referer=self.url)) baseurl = video['baseUrl']
size = url_size(baseurl, headers=self.bilibili_headers(referer=self.url))
# find matching audio track
audio_baseurl = data['result']['dash']['audio'][0]['baseUrl'] # find matching audio track
for audio in data['result']['dash']['audio']: audio_baseurl = playinfo['result']['dash']['audio'][0]['baseUrl']
if int(audio['id']) == audio_quality: for audio in playinfo['result']['dash']['audio']:
audio_baseurl = audio['baseUrl'] if int(audio['id']) == audio_quality:
break audio_baseurl = audio['baseUrl']
size += url_size(audio_baseurl, headers=self.bilibili_headers(referer=self.url)) break
size += url_size(audio_baseurl, headers=self.bilibili_headers(referer=self.url))
self.dash_streams[format_id] = {'container': container, 'quality': desc,
'src': [[baseurl], [audio_baseurl]], 'size': size} self.dash_streams[format_id] = {'container': container, 'quality': desc,
'src': [[baseurl], [audio_baseurl]], 'size': size}
# vc video # vc video
elif sort == 'vc': elif sort == 'vc':
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册