2 from __future__ 
import unicode_literals
 
   7 from .common 
import InfoExtractor
 
   9     compat_urllib_parse_urlencode
, 
  22 class DCNIE(InfoExtractor
): 
  23     _VALID_URL 
= r
'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?show/(?P<show_id>\d+)/[^/]+(?:/(?P<video_id>\d+)/(?P<season_id>\d+))?' 
  25     def _real_extract(self
, url
): 
  26         show_id
, video_id
, season_id 
= re
.match(self
._VALID
_URL
, url
).groups() 
  27         if video_id 
and int(video_id
) > 0: 
  28             return self
.url_result( 
  29                 'http://www.dcndigital.ae/media/%s' % video_id
, 'DCNVideo') 
  30         elif season_id 
and int(season_id
) > 0: 
  31             return self
.url_result(smuggle_url( 
  32                 'http://www.dcndigital.ae/program/season/%s' % season_id
, 
  33                 {'show_id': show_id
}), 'DCNSeason') 
  35             return self
.url_result( 
  36                 'http://www.dcndigital.ae/program/%s' % show_id
, 'DCNSeason') 
  39 class DCNBaseIE(InfoExtractor
): 
  40     def _extract_video_info(self
, video_data
, video_id
, is_live
): 
  41         title 
= video_data
.get('title_en') or video_data
['title_ar'] 
  42         img 
= video_data
.get('img') 
  43         thumbnail 
= 'http://admin.mangomolo.com/analytics/%s' % img 
if img 
else None 
  44         duration 
= int_or_none(video_data
.get('duration')) 
  45         description 
= video_data
.get('description_en') or video_data
.get('description_ar') 
  46         timestamp 
= parse_iso8601(video_data
.get('create_time'), ' ') 
  50             'title': self
._live
_title
(title
) if is_live 
else title
, 
  51             'description': description
, 
  52             'thumbnail': thumbnail
, 
  54             'timestamp': timestamp
, 
  58     def _extract_video_formats(self
, webpage
, video_id
, m3u8_entry_protocol
): 
  60         format_url_base 
= 'http' + self
._html
_search
_regex
( 
  62                 r
'file\s*:\s*"https?(://[^"]+)/playlist.m3u8', 
  63                 r
'<a[^>]+href="rtsp(://[^"]+)"' 
  64             ], webpage
, 'format url') 
  65         # TODO: Current DASH formats are broken - $Time$ pattern in 
  66         # <SegmentTemplate> not implemented yet 
  67         # formats.extend(self._extract_mpd_formats( 
  68         #     format_url_base + '/manifest.mpd', 
  69         #     video_id, mpd_id='dash', fatal=False)) 
  70         formats
.extend(self
._extract
_m
3u8_formats
( 
  71             format_url_base 
+ '/playlist.m3u8', video_id
, 'mp4', 
  72             m3u8_entry_protocol
, m3u8_id
='hls', fatal
=False)) 
  73         formats
.extend(self
._extract
_f
4m
_formats
( 
  74             format_url_base 
+ '/manifest.f4m', 
  75             video_id
, f4m_id
='hds', fatal
=False)) 
  76         self
._sort
_formats
(formats
) 
  80 class DCNVideoIE(DCNBaseIE
): 
  82     _VALID_URL 
= r
'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?(?:video(?:/[^/]+)?|media|catchup/[^/]+/[^/]+)/(?P<id>\d+)' 
  84         'url': 'http://www.dcndigital.ae/#/video/%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D8%B1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1/17375', 
  89             'title': 'رحلة العمر : الحلقة 1', 
  90             'description': 'md5:0156e935d870acb8ef0a66d24070c6d6', 
  92             'timestamp': 1227504126, 
  93             'upload_date': '20081124', 
  97             'skip_download': True, 
 100         'url': 'http://awaan.ae/video/26723981/%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D9%85:-%D8%AE%D9%8A%D8%B1-%D8%AF%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%86%D8%B5%D8%A7%D8%B1', 
 101         'only_matching': True, 
 104     def _real_extract(self
, url
): 
 105         video_id 
= self
._match
_id
(url
) 
 107         request 
= sanitized_Request( 
 108             'http://admin.mangomolo.com/analytics/index.php/plus/video?id=%s' % video_id
, 
 109             headers
={'Origin': 'http://www.dcndigital.ae'}) 
 110         video_data 
= self
._download
_json
(request
, video_id
) 
 111         info 
= self
._extract
_video
_info
(video_data
, video_id
, False) 
 113         webpage 
= self
._download
_webpage
( 
 114             'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' + 
 115             compat_urllib_parse_urlencode({ 
 116                 'id': video_data
['id'], 
 117                 'user_id': video_data
['user_id'], 
 118                 'signature': video_data
['signature'], 
 122         info
['formats'] = self
._extract
_video
_formats
(webpage
, video_id
, 'm3u8_native') 
 126 class DCNLiveIE(DCNBaseIE
): 
 128     _VALID_URL 
= r
'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?live/(?P<id>\d+)' 
 130     def _real_extract(self
, url
): 
 131         channel_id 
= self
._match
_id
(url
) 
 133         request 
= sanitized_Request( 
 134             'http://admin.mangomolo.com/analytics/index.php/plus/getchanneldetails?channel_id=%s' % channel_id
, 
 135             headers
={'Origin': 'http://www.dcndigital.ae'}) 
 137         channel_data 
= self
._download
_json
(request
, channel_id
) 
 138         info 
= self
._extract
_video
_info
(channel_data
, channel_id
, True) 
 140         webpage 
= self
._download
_webpage
( 
 141             'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' + 
 142             compat_urllib_parse_urlencode({ 
 143                 'id': base64
.b64encode(channel_data
['user_id'].encode()).decode(), 
 144                 'channelid': base64
.b64encode(channel_data
['id'].encode()).decode(), 
 145                 'signature': channel_data
['signature'], 
 149         info
['formats'] = self
._extract
_video
_formats
(webpage
, channel_id
, 'm3u8') 
 153 class DCNSeasonIE(InfoExtractor
): 
 154     IE_NAME 
= 'dcn:season' 
 155     _VALID_URL 
= r
'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?program/(?:(?P<show_id>\d+)|season/(?P<season_id>\d+))' 
 157         'url': 'http://dcndigital.ae/#/program/205024/%D9%85%D8%AD%D8%A7%D8%B6%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D8%AE-%D8%A7%D9%84%D8%B4%D8%B9%D8%B1%D8%A7%D9%88%D9%8A', 
 161             'title': 'محاضرات الشيخ الشعراوي', 
 163         'playlist_mincount': 27, 
 166     def _real_extract(self
, url
): 
 167         url
, smuggled_data 
= unsmuggle_url(url
, {}) 
 168         show_id
, season_id 
= re
.match(self
._VALID
_URL
, url
).groups() 
 172             data
['season'] = season_id
 
 173             show_id 
= smuggled_data
.get('show_id') 
 175                 request 
= sanitized_Request( 
 176                     'http://admin.mangomolo.com/analytics/index.php/plus/season_info?id=%s' % season_id
, 
 177                     headers
={'Origin': 'http://www.dcndigital.ae'}) 
 178                 season 
= self
._download
_json
(request
, season_id
) 
 179                 show_id 
= season
['id'] 
 180         data
['show_id'] = show_id
 
 181         request 
= sanitized_Request( 
 182             'http://admin.mangomolo.com/analytics/index.php/plus/show', 
 183             urlencode_postdata(data
), 
 185                 'Origin': 'http://www.dcndigital.ae', 
 186                 'Content-Type': 'application/x-www-form-urlencoded' 
 189         show 
= self
._download
_json
(request
, show_id
) 
 191             season_id 
= show
['default_season'] 
 192         for season 
in show
['seasons']: 
 193             if season
['id'] == season_id
: 
 194                 title 
= season
.get('title_en') or season
['title_ar'] 
 197                 for video 
in show
['videos']: 
 198                     video_id 
= compat_str(video
['id']) 
 199                     entries
.append(self
.url_result( 
 200                         'http://www.dcndigital.ae/media/%s' % video_id
, 'DCNVideo', video_id
)) 
 202                 return self
.playlist_result(entries
, season_id
, title
)