parse_duration,
qualities,
str_to_int,
+ traverse_obj,
try_get,
unified_timestamp,
urlencode_postdata,
}]
def _real_extract(self, url):
- uploader_id, video_id = re.match(self._VALID_URL, url).groups()
+ uploader_id, video_id = self._match_valid_url(url).groups()
video_password = self.get_param('videopassword')
request_data = None
'Downloading live info', fatal=False)
is_live = 'data-status="online"' in webpage
+
+ if not traverse_obj(stream_server_data, 'llfmp4') and is_live:
+ self.raise_login_required(method='cookies')
+
formats = []
if is_live and not m3u8_url:
m3u8_url = 'https://twitcasting.tv/%s/metastream.m3u8' % uploader_id
if is_live and has_websockets and stream_server_data:
qq = qualities(['base', 'mobilesource', 'main'])
- for mode, ws_url in stream_server_data['llfmp4']['streams'].items():
+ streams = traverse_obj(stream_server_data, ('llfmp4', 'streams')) or {}
+ for mode, ws_url in streams.items():
formats.append({
'url': ws_url,
'format_id': 'ws-%s' % mode,