|
@@ -2,12 +2,17 @@
|
|
from __future__ import unicode_literals
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
import re
|
|
import re
|
|
|
|
+import base64
|
|
|
|
|
|
from .common import InfoExtractor
|
|
from .common import InfoExtractor
|
|
-from ..compat import compat_urllib_parse
|
|
|
|
|
|
+from ..compat import (
|
|
|
|
+ compat_urllib_parse,
|
|
|
|
+ compat_urlparse,
|
|
|
|
+)
|
|
from ..utils import (
|
|
from ..utils import (
|
|
ExtractorError,
|
|
ExtractorError,
|
|
int_or_none,
|
|
int_or_none,
|
|
|
|
+ unsmuggle_url,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
@@ -121,24 +126,40 @@ class KalturaIE(InfoExtractor):
|
|
video_id, actions, note='Downloading video info JSON')
|
|
video_id, actions, note='Downloading video info JSON')
|
|
|
|
|
|
def _real_extract(self, url):
|
|
def _real_extract(self, url):
|
|
|
|
+ url, smuggled_data = unsmuggle_url(url, {})
|
|
|
|
+
|
|
mobj = re.match(self._VALID_URL, url)
|
|
mobj = re.match(self._VALID_URL, url)
|
|
partner_id = mobj.group('partner_id_s') or mobj.group('partner_id') or mobj.group('partner_id_html5')
|
|
partner_id = mobj.group('partner_id_s') or mobj.group('partner_id') or mobj.group('partner_id_html5')
|
|
entry_id = mobj.group('id_s') or mobj.group('id') or mobj.group('id_html5')
|
|
entry_id = mobj.group('id_s') or mobj.group('id') or mobj.group('id_html5')
|
|
|
|
|
|
info, source_data = self._get_video_info(entry_id, partner_id)
|
|
info, source_data = self._get_video_info(entry_id, partner_id)
|
|
|
|
|
|
- formats = [{
|
|
|
|
- 'format_id': '%(fileExt)s-%(bitrate)s' % f,
|
|
|
|
- 'ext': f['fileExt'],
|
|
|
|
- 'tbr': f['bitrate'],
|
|
|
|
- 'fps': f.get('frameRate'),
|
|
|
|
- 'filesize_approx': int_or_none(f.get('size'), invscale=1024),
|
|
|
|
- 'container': f.get('containerFormat'),
|
|
|
|
- 'vcodec': f.get('videoCodecId'),
|
|
|
|
- 'height': f.get('height'),
|
|
|
|
- 'width': f.get('width'),
|
|
|
|
- 'url': '%s/flavorId/%s' % (info['dataUrl'], f['id']),
|
|
|
|
- } for f in source_data['flavorAssets']]
|
|
|
|
|
|
+ source_url = smuggled_data.get('source_url')
|
|
|
|
+ if source_url:
|
|
|
|
+ referrer = base64.b64encode(
|
|
|
|
+ '://'.join(compat_urlparse.urlparse(source_url)[:2])
|
|
|
|
+ .encode('utf-8')).decode('utf-8')
|
|
|
|
+ else:
|
|
|
|
+ referrer = None
|
|
|
|
+
|
|
|
|
+ formats = []
|
|
|
|
+ for f in source_data['flavorAssets']:
|
|
|
|
+ video_url = '%s/flavorId/%s' % (info['dataUrl'], f['id'])
|
|
|
|
+ if referrer:
|
|
|
|
+ video_url += '?referrer=%s' % referrer
|
|
|
|
+ formats.append({
|
|
|
|
+ 'format_id': '%(fileExt)s-%(bitrate)s' % f,
|
|
|
|
+ 'ext': f['fileExt'],
|
|
|
|
+ 'tbr': f['bitrate'],
|
|
|
|
+ 'fps': f.get('frameRate'),
|
|
|
|
+ 'filesize_approx': int_or_none(f.get('size'), invscale=1024),
|
|
|
|
+ 'container': f.get('containerFormat'),
|
|
|
|
+ 'vcodec': f.get('videoCodecId'),
|
|
|
|
+ 'height': f.get('height'),
|
|
|
|
+ 'width': f.get('width'),
|
|
|
|
+ 'url': video_url,
|
|
|
|
+ })
|
|
|
|
+ self._check_formats(formats, entry_id)
|
|
self._sort_formats(formats)
|
|
self._sort_formats(formats)
|
|
|
|
|
|
return {
|
|
return {
|