1 from .common
import InfoExtractor
4 compat_urllib_parse_unquote
,
6 from ..utils
import classproperty
, int_or_none
9 class MangomoloBaseIE(InfoExtractor
):
10 _BASE_REGEX
= r
'(?:https?:)?//(?:admin\.mangomolo\.com/analytics/index\.php/customers/embed/|player\.mangomolo\.com/v1/)'
15 return f
'{cls._BASE_REGEX}{cls._SLUG}'
18 def _EMBED_REGEX(cls
):
19 return [rf
'<iframe[^>]+src=(["\'])(?P<url>{cls._VALID_URL}.+?)\1']
21 def _extract_from_webpage(self
, url
, webpage
):
22 for res
in super()._extract
_from
_webpage
(url
, webpage
):
25 '_type': 'url_transparent',
26 'id': self
._search
_regex
(self
._SLUG
, res
['url'], 'id', group
='id'),
27 'uploader': self
._search
_regex
(r
'^(?:https?://)?([^/]*)/.*', url
, 'video uploader'),
30 def _get_real_id(self
, page_id
):
33 def _real_extract(self
, url
):
34 page_id
= self
._get
_real
_id
(self
._match
_id
(url
))
35 webpage
= self
._download
_webpage
(
36 'https://player.mangomolo.com/v1/%s?%s' % (self
._TYPE
, url
.split('?')[1]), page_id
)
37 hidden_inputs
= self
._hidden
_inputs
(webpage
)
38 m3u8_entry_protocol
= 'm3u8' if self
._IS
_LIVE
else 'm3u8_native'
40 format_url
= self
._html
_search
_regex
(
42 r
'(?:file|src)\s*:\s*"(https?://[^"]+?/playlist\.m3u8)',
43 r
'<a[^>]+href="(rtsp://[^"]+)"'
44 ], webpage
, 'format url')
45 formats
= self
._extract
_wowza
_formats
(
46 format_url
, page_id
, m3u8_entry_protocol
, ['smil'])
51 'uploader_id': hidden_inputs
.get('userid'),
52 'duration': int_or_none(hidden_inputs
.get('duration')),
53 'is_live': self
._IS
_LIVE
,
58 class MangomoloVideoIE(MangomoloBaseIE
):
60 IE_NAME
= 'mangomolo:' + _TYPE
61 _SLUG
= r
'video\?.*?\bid=(?P<id>\d+)'
66 class MangomoloLiveIE(MangomoloBaseIE
):
68 IE_NAME
= 'mangomolo:' + _TYPE
69 _SLUG
= r
'(?:live|index)\?.*?\bchannelid=(?P<id>(?:[A-Za-z0-9+/=]|%2B|%2F|%3D)+)'
72 def _get_real_id(self
, page_id
):
73 return compat_b64decode(compat_urllib_parse_unquote(page_id
)).decode()