[kaltura] add support for embeds specifying a kaltura session

This commit is contained in:
Joseph Spiros 2017-10-28 12:25:31 -04:00
parent 8e01f3ca81
commit 168fe21aca

View File

@ -110,6 +110,17 @@ class KalturaIE(InfoExtractor):
def _extract_url(webpage): def _extract_url(webpage):
# Embed codes: https://knowledge.kaltura.com/embedding-kaltura-media-players-your-site # Embed codes: https://knowledge.kaltura.com/embedding-kaltura-media-players-your-site
mobj = ( mobj = (
re.search(
r"""(?xs)
kWidget\.(?:thumb)?[Ee]mbed\(
\{.*?
(?P<q1>['"])wid(?P=q1)\s*:\s*
(?P<q2>['"])_?(?P<partner_id>(?:(?!(?P=q2)).)+)(?P=q2),.*?
(?P<q3>['"])entry_?[Ii]d(?P=q3)\s*:\s*
(?P<q4>['"])(?P<id>(?:(?!(?P=q4)).)+)(?P=q4),.*?
(?P<q5>['"])ks(?P=q5)\s*:\s*
(?P<q6>['"])(?P<ks>(?:(?!(?P=q6)).)+)(?P=q6)(?:,|\s*\})
""", webpage) or
re.search( re.search(
r"""(?xs) r"""(?xs)
kWidget\.(?:thumb)?[Ee]mbed\( kWidget\.(?:thumb)?[Ee]mbed\(
@ -142,12 +153,20 @@ class KalturaIE(InfoExtractor):
if mobj: if mobj:
embed_info = mobj.groupdict() embed_info = mobj.groupdict()
url = 'kaltura:%(partner_id)s:%(id)s' % embed_info url = 'kaltura:%(partner_id)s:%(id)s' % embed_info
smuggled_data = {}
if 'ks' in embed_info:
smuggled_data['ks'] = embed_info['ks']
escaped_pid = re.escape(embed_info['partner_id']) escaped_pid = re.escape(embed_info['partner_id'])
service_url = re.search( service_url = re.search(
r'<script[^>]+src=["\']((?:https?:)?//.+?)/p/%s/sp/%s00/embedIframeJs' % (escaped_pid, escaped_pid), r'<script[^>]+src=["\']((?:https?:)?//.+?)/p/%s/sp/%s00/embedIframeJs' % (escaped_pid, escaped_pid),
webpage) webpage)
if service_url: if service_url:
url = smuggle_url(url, {'service_url': service_url.group(1)}) smuggled_data['service_url'] = service_url.group(1)
if smuggled_data:
url = smuggle_url(url, smuggled_data)
return url return url
def _kaltura_api_call(self, video_id, actions, service_url=None, *args, **kwargs): def _kaltura_api_call(self, video_id, actions, service_url=None, *args, **kwargs):
@ -168,7 +187,7 @@ class KalturaIE(InfoExtractor):
return data return data
def _get_video_info(self, video_id, partner_id, service_url=None): def _get_video_info(self, video_id, partner_id, service_url=None, ks=None):
actions = [ actions = [
{ {
'action': 'null', 'action': 'null',
@ -187,19 +206,19 @@ class KalturaIE(InfoExtractor):
'action': 'get', 'action': 'get',
'entryId': video_id, 'entryId': video_id,
'service': 'baseentry', 'service': 'baseentry',
'ks': '{1:result:ks}', 'ks': ks or '{1:result:ks}',
}, },
{ {
'action': 'getbyentryid', 'action': 'getbyentryid',
'entryId': video_id, 'entryId': video_id,
'service': 'flavorAsset', 'service': 'flavorAsset',
'ks': '{1:result:ks}', 'ks': ks or '{1:result:ks}',
}, },
{ {
'action': 'list', 'action': 'list',
'filter:entryIdEqual': video_id, 'filter:entryIdEqual': video_id,
'service': 'caption_captionasset', 'service': 'caption_captionasset',
'ks': '{1:result:ks}', 'ks': ks or '{1:result:ks}',
}, },
] ]
return self._kaltura_api_call( return self._kaltura_api_call(
@ -210,10 +229,10 @@ class KalturaIE(InfoExtractor):
mobj = re.match(self._VALID_URL, url) mobj = re.match(self._VALID_URL, url)
partner_id, entry_id = mobj.group('partner_id', 'id') partner_id, entry_id = mobj.group('partner_id', 'id')
ks = None ks = smuggled_data.get('ks')
captions = None captions = None
if partner_id and entry_id: if partner_id and entry_id:
_, info, flavor_assets, captions = self._get_video_info(entry_id, partner_id, smuggled_data.get('service_url')) _, info, flavor_assets, captions = self._get_video_info(entry_id, partner_id, smuggled_data.get('service_url'), ks)
else: else:
path, query = mobj.group('path', 'query') path, query = mobj.group('path', 'query')
if not path and not query: if not path and not query: