Fix bilibili vip user bangumi download error

This commit is contained in:
FSpark 2019-04-27 00:19:40 +08:00
parent d6f9fefe42
commit 58e3d897c5

View File

@ -281,15 +281,27 @@ class Bilibili(VideoExtractor):
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 # set video title
self.title = initial_state['h1Title'] # need a better way to judge whether it is a vip
if 'epPayMent' in initial_state:
is_vip = False
elif 'epStat' in initial_state:
is_vip = True
else:
is_vip = False
if is_vip :
self.title = '%s:第%s%s' % (initial_state['mediaInfo']['title'],initial_state['epInfo']['index'],initial_state['epInfo']['index_title'])
ep_id = initial_state['epInfo']['ep_id']
else:
self.title = initial_state['h1Title']
ep_id = initial_state['epInfo']['id']
# construct playinfos # construct playinfos
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 = [] 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(referer=self.url))
api_playinfo = json.loads(api_content) api_playinfo = json.loads(api_content)
if api_playinfo['code'] == 0: # success if api_playinfo['code'] == 0: # success
playinfos.append(api_playinfo) playinfos.append(api_playinfo)
@ -298,12 +310,13 @@ class Bilibili(VideoExtractor):
return return
current_quality = api_playinfo['result']['quality'] current_quality = api_playinfo['result']['quality']
# get alternative formats from API # get alternative formats from API
for qn in [80, 64, 32, 16]: for qn in [112, 80, 64, 32, 16]:
# automatic format for durl: qn=0 # automatic format for durl: qn=0
# for dash, qn does not matter # for dash, qn does not matter
if qn != current_quality: if qn != current_quality:
api_url = self.bilibili_bangumi_api(avid, cid, ep_id, qn=qn) api_url = self.bilibili_bangumi_api(avid, cid, ep_id, qn=qn)
api_content = get_content(api_url, headers=self.bilibili_headers()) # to get higher qualities,referer is required
api_content = get_content(api_url, headers=self.bilibili_headers(referer=self.url))
api_playinfo = json.loads(api_content) api_playinfo = json.loads(api_content)
if api_playinfo['code'] == 0: # success if api_playinfo['code'] == 0: # success
playinfos.append(api_playinfo) playinfos.append(api_playinfo)
@ -325,7 +338,9 @@ class Bilibili(VideoExtractor):
if 'dash' in playinfo['result']: if 'dash' in playinfo['result']:
for video in playinfo['result']['dash']['video']: for video in playinfo['result']['dash']['video']:
# playinfo['result']['quality'] does not reflect the correct quality of DASH stream # playinfo['result']['quality'] does not reflect the correct quality of DASH stream
quality = self.height_to_quality(video['height']) # convert height to quality code # quality = self.height_to_quality(video['height']) # convert height to quality code
# but now playinfo['result']['dash']['video']['id'] seems working well
quality = video['id']
s = self.stream_qualities[quality] s = self.stream_qualities[quality]
format_id = 'dash-' + s['id'] # prefix format_id = 'dash-' + s['id'] # prefix
container = 'mp4' # enforce MP4 container container = 'mp4' # enforce MP4 container
@ -484,7 +499,11 @@ class Bilibili(VideoExtractor):
epn, i = len(initial_state['epList']), 0 epn, i = len(initial_state['epList']), 0
for ep in initial_state['epList']: for ep in initial_state['epList']:
i += 1; log.w('Extracting %s of %s videos ...' % (i, epn)) i += 1; log.w('Extracting %s of %s videos ...' % (i, epn))
ep_id = ep['id'] #The difference between vip and non-vip
if ep.__contains__('id'):
ep_id = ep['id']
elif ep.__contains__('ep_id'):
ep_id = ep['ep_id']
epurl = 'https://www.bilibili.com/bangumi/play/ep%s/' % ep_id epurl = 'https://www.bilibili.com/bangumi/play/ep%s/' % ep_id
self.__class__().download_by_url(epurl, **kwargs) self.__class__().download_by_url(epurl, **kwargs)