|
|
@ -30,6 +30,12 @@ class VikiBaseIE(InfoExtractor):
|
|
|
|
|
|
|
|
|
|
|
|
_token = None
|
|
|
|
_token = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ERRORS = {
|
|
|
|
|
|
|
|
'geo': 'Sorry, this content is not available in your region.',
|
|
|
|
|
|
|
|
'upcoming': 'Sorry, this content is not yet available.',
|
|
|
|
|
|
|
|
# 'paywall': 'paywall',
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _prepare_call(self, path, timestamp=None, post_data=None):
|
|
|
|
def _prepare_call(self, path, timestamp=None, post_data=None):
|
|
|
|
path += '?' if '?' not in path else '&'
|
|
|
|
path += '?' if '?' not in path else '&'
|
|
|
|
if not timestamp:
|
|
|
|
if not timestamp:
|
|
|
@ -67,6 +73,12 @@ class VikiBaseIE(InfoExtractor):
|
|
|
|
'%s returned error: %s' % (self.IE_NAME, error),
|
|
|
|
'%s returned error: %s' % (self.IE_NAME, error),
|
|
|
|
expected=True)
|
|
|
|
expected=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _check_errors(self, data):
|
|
|
|
|
|
|
|
for reason, status in data.get('blocking', {}).items():
|
|
|
|
|
|
|
|
if status and reason in self._ERRORS:
|
|
|
|
|
|
|
|
raise ExtractorError('%s said: %s' % (
|
|
|
|
|
|
|
|
self.IE_NAME, self._ERRORS[reason]), expected=True)
|
|
|
|
|
|
|
|
|
|
|
|
def _real_initialize(self):
|
|
|
|
def _real_initialize(self):
|
|
|
|
self._login()
|
|
|
|
self._login()
|
|
|
|
|
|
|
|
|
|
|
@ -193,6 +205,7 @@ class VikiIE(VikiBaseIE):
|
|
|
|
'timestamp': 1321985454,
|
|
|
|
'timestamp': 1321985454,
|
|
|
|
'description': 'md5:44b1e46619df3a072294645c770cef36',
|
|
|
|
'description': 'md5:44b1e46619df3a072294645c770cef36',
|
|
|
|
'title': 'Love In Magic',
|
|
|
|
'title': 'Love In Magic',
|
|
|
|
|
|
|
|
'age_limit': 13,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
|
@ -202,6 +215,8 @@ class VikiIE(VikiBaseIE):
|
|
|
|
video = self._call_api(
|
|
|
|
video = self._call_api(
|
|
|
|
'videos/%s.json' % video_id, video_id, 'Downloading video JSON')
|
|
|
|
'videos/%s.json' % video_id, video_id, 'Downloading video JSON')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._check_errors(video)
|
|
|
|
|
|
|
|
|
|
|
|
title = self.dict_selection(video.get('titles', {}), 'en')
|
|
|
|
title = self.dict_selection(video.get('titles', {}), 'en')
|
|
|
|
if not title:
|
|
|
|
if not title:
|
|
|
|
title = 'Episode %d' % video.get('number') if video.get('type') == 'episode' else video.get('id') or video_id
|
|
|
|
title = 'Episode %d' % video.get('number') if video.get('type') == 'episode' else video.get('id') or video_id
|
|
|
@ -262,8 +277,11 @@ class VikiIE(VikiBaseIE):
|
|
|
|
r'^(\d+)[pP]$', format_id, 'height', default=None))
|
|
|
|
r'^(\d+)[pP]$', format_id, 'height', default=None))
|
|
|
|
for protocol, format_dict in stream_dict.items():
|
|
|
|
for protocol, format_dict in stream_dict.items():
|
|
|
|
if format_id == 'm3u8':
|
|
|
|
if format_id == 'm3u8':
|
|
|
|
formats = self._extract_m3u8_formats(
|
|
|
|
m3u8_formats = self._extract_m3u8_formats(
|
|
|
|
format_dict['url'], video_id, 'mp4', m3u8_id='m3u8-%s' % protocol)
|
|
|
|
format_dict['url'], video_id, 'mp4', 'm3u8_native',
|
|
|
|
|
|
|
|
m3u8_id='m3u8-%s' % protocol, fatal=None)
|
|
|
|
|
|
|
|
if m3u8_formats:
|
|
|
|
|
|
|
|
formats.extend(m3u8_formats)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
formats.append({
|
|
|
|
formats.append({
|
|
|
|
'url': format_dict['url'],
|
|
|
|
'url': format_dict['url'],
|
|
|
@ -315,6 +333,8 @@ class VikiChannelIE(VikiBaseIE):
|
|
|
|
'containers/%s.json' % channel_id, channel_id,
|
|
|
|
'containers/%s.json' % channel_id, channel_id,
|
|
|
|
'Downloading channel JSON')
|
|
|
|
'Downloading channel JSON')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._check_errors(channel)
|
|
|
|
|
|
|
|
|
|
|
|
title = self.dict_selection(channel['titles'], 'en')
|
|
|
|
title = self.dict_selection(channel['titles'], 'en')
|
|
|
|
|
|
|
|
|
|
|
|
description = self.dict_selection(channel['descriptions'], 'en')
|
|
|
|
description = self.dict_selection(channel['descriptions'], 'en')
|
|
|
|