2 from __future__ 
import unicode_literals
 
   4 from .common 
import InfoExtractor
 
   7     compat_urllib_parse_unquote
, 
   9 from ..utils 
import int_or_none
 
  12 class MangomoloBaseIE(InfoExtractor
): 
  13     _BASE_REGEX 
= r
'https?://(?:admin\.mangomolo\.com/analytics/index\.php/customers/embed/|player\.mangomolo\.com/v1/)' 
  15     def _get_real_id(self
, page_id
): 
  18     def _real_extract(self
, url
): 
  19         page_id 
= self
._get
_real
_id
(self
._match
_id
(url
)) 
  20         webpage 
= self
._download
_webpage
( 
  21             'https://player.mangomolo.com/v1/%s?%s' % (self
._TYPE
, url
.split('?')[1]), page_id
) 
  22         hidden_inputs 
= self
._hidden
_inputs
(webpage
) 
  23         m3u8_entry_protocol 
= 'm3u8' if self
._IS
_LIVE 
else 'm3u8_native' 
  25         format_url 
= self
._html
_search
_regex
( 
  27                 r
'(?:file|src)\s*:\s*"(https?://[^"]+?/playlist\.m3u8)', 
  28                 r
'<a[^>]+href="(rtsp://[^"]+)"' 
  29             ], webpage
, 'format url') 
  30         formats 
= self
._extract
_wowza
_formats
( 
  31             format_url
, page_id
, m3u8_entry_protocol
, ['smil']) 
  32         self
._sort
_formats
(formats
) 
  36             'title': self
._live
_title
(page_id
) if self
._IS
_LIVE 
else page_id
, 
  37             'uploader_id': hidden_inputs
.get('userid'), 
  38             'duration': int_or_none(hidden_inputs
.get('duration')), 
  39             'is_live': self
._IS
_LIVE
, 
  44 class MangomoloVideoIE(MangomoloBaseIE
): 
  46     IE_NAME 
= 'mangomolo:' + _TYPE
 
  47     _VALID_URL 
= MangomoloBaseIE
._BASE
_REGEX 
+ r
'video\?.*?\bid=(?P<id>\d+)' 
  51 class MangomoloLiveIE(MangomoloBaseIE
): 
  53     IE_NAME 
= 'mangomolo:' + _TYPE
 
  54     _VALID_URL 
= MangomoloBaseIE
._BASE
_REGEX 
+ r
'(live|index)\?.*?\bchannelid=(?P<id>(?:[A-Za-z0-9+/=]|%2B|%2F|%3D)+)' 
  57     def _get_real_id(self
, page_id
): 
  58         return compat_b64decode(compat_urllib_parse_unquote(page_id
)).decode()