|
|
|
@ -416,26 +416,35 @@ class AfreecaTVLiveIE(AfreecaTVIE):
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
|
broadcaster_id, broadcast_no = self._match_valid_url(url).group('id', 'bno')
|
|
|
|
|
password = self.get_param('videopassword')
|
|
|
|
|
|
|
|
|
|
info = self._download_json(self._LIVE_API_URL, broadcaster_id, fatal=False,
|
|
|
|
|
data=urlencode_postdata({'bid': broadcaster_id})) or {}
|
|
|
|
|
channel_info = info.get('CHANNEL') or {}
|
|
|
|
|
broadcaster_id = channel_info.get('BJID') or broadcaster_id
|
|
|
|
|
broadcast_no = channel_info.get('BNO') or broadcast_no
|
|
|
|
|
password_protected = channel_info.get('BPWD')
|
|
|
|
|
if not broadcast_no:
|
|
|
|
|
raise ExtractorError(f'Unable to extract broadcast number ({broadcaster_id} may not be live)', expected=True)
|
|
|
|
|
if password_protected == 'Y' and password is None:
|
|
|
|
|
raise ExtractorError(
|
|
|
|
|
'This livestream is protected by a password, use the --video-password option',
|
|
|
|
|
expected=True)
|
|
|
|
|
|
|
|
|
|
formats = []
|
|
|
|
|
quality_key = qualities(self._QUALITIES)
|
|
|
|
|
for quality_str in self._QUALITIES:
|
|
|
|
|
params = {
|
|
|
|
|
'bno': broadcast_no,
|
|
|
|
|
'stream_type': 'common',
|
|
|
|
|
'type': 'aid',
|
|
|
|
|
'quality': quality_str,
|
|
|
|
|
}
|
|
|
|
|
if password is not None:
|
|
|
|
|
params['pwd'] = password
|
|
|
|
|
aid_response = self._download_json(
|
|
|
|
|
self._LIVE_API_URL, broadcast_no, fatal=False,
|
|
|
|
|
data=urlencode_postdata({
|
|
|
|
|
'bno': broadcast_no,
|
|
|
|
|
'stream_type': 'common',
|
|
|
|
|
'type': 'aid',
|
|
|
|
|
'quality': quality_str,
|
|
|
|
|
}),
|
|
|
|
|
data=urlencode_postdata(params),
|
|
|
|
|
note=f'Downloading access token for {quality_str} stream',
|
|
|
|
|
errnote=f'Unable to download access token for {quality_str} stream')
|
|
|
|
|
aid = traverse_obj(aid_response, ('CHANNEL', 'AID'))
|
|
|
|
|