You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
7.0 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. import re
  4. import base64
  5. from .common import InfoExtractor
  6. from ..compat import (
  7. compat_urllib_parse_urlencode,
  8. compat_str,
  9. )
  10. from ..utils import (
  11. int_or_none,
  12. parse_iso8601,
  13. smuggle_url,
  14. unsmuggle_url,
  15. urlencode_postdata,
  16. )
  17. class AWAANIE(InfoExtractor):
  18. _VALID_URL = r'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?show/(?P<show_id>\d+)/[^/]+(?:/(?P<video_id>\d+)/(?P<season_id>\d+))?'
  19. def _real_extract(self, url):
  20. show_id, video_id, season_id = re.match(self._VALID_URL, url).groups()
  21. if video_id and int(video_id) > 0:
  22. return self.url_result(
  23. 'http://awaan.ae/media/%s' % video_id, 'AWAANVideo')
  24. elif season_id and int(season_id) > 0:
  25. return self.url_result(smuggle_url(
  26. 'http://awaan.ae/program/season/%s' % season_id,
  27. {'show_id': show_id}), 'AWAANSeason')
  28. else:
  29. return self.url_result(
  30. 'http://awaan.ae/program/%s' % show_id, 'AWAANSeason')
  31. class AWAANBaseIE(InfoExtractor):
  32. def _parse_video_data(self, video_data, video_id, is_live):
  33. title = video_data.get('title_en') or video_data['title_ar']
  34. img = video_data.get('img')
  35. return {
  36. 'id': video_id,
  37. 'title': self._live_title(title) if is_live else title,
  38. 'description': video_data.get('description_en') or video_data.get('description_ar'),
  39. 'thumbnail': 'http://admin.mangomolo.com/analytics/%s' % img if img else None,
  40. 'duration': int_or_none(video_data.get('duration')),
  41. 'timestamp': parse_iso8601(video_data.get('create_time'), ' '),
  42. 'is_live': is_live,
  43. }
  44. class AWAANVideoIE(AWAANBaseIE):
  45. IE_NAME = 'awaan:video'
  46. _VALID_URL = r'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?(?:video(?:/[^/]+)?|media|catchup/[^/]+/[^/]+)/(?P<id>\d+)'
  47. _TESTS = [{
  48. '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',
  49. 'md5': '5f61c33bfc7794315c671a62d43116aa',
  50. 'info_dict':
  51. {
  52. 'id': '17375',
  53. 'ext': 'mp4',
  54. 'title': 'رحلة العمر : الحلقة 1',
  55. 'description': 'md5:0156e935d870acb8ef0a66d24070c6d6',
  56. 'duration': 2041,
  57. 'timestamp': 1227504126,
  58. 'upload_date': '20081124',
  59. 'uploader_id': '71',
  60. },
  61. }, {
  62. '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',
  63. 'only_matching': True,
  64. }]
  65. def _real_extract(self, url):
  66. video_id = self._match_id(url)
  67. video_data = self._download_json(
  68. 'http://admin.mangomolo.com/analytics/index.php/plus/video?id=%s' % video_id,
  69. video_id, headers={'Origin': 'http://awaan.ae'})
  70. info = self._parse_video_data(video_data, video_id, False)
  71. embed_url = 'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' + compat_urllib_parse_urlencode({
  72. 'id': video_data['id'],
  73. 'user_id': video_data['user_id'],
  74. 'signature': video_data['signature'],
  75. 'countries': 'Q0M=',
  76. 'filter': 'DENY',
  77. })
  78. info.update({
  79. '_type': 'url_transparent',
  80. 'url': embed_url,
  81. 'ie_key': 'MangomoloVideo',
  82. })
  83. return info
  84. class AWAANLiveIE(AWAANBaseIE):
  85. IE_NAME = 'awaan:live'
  86. _VALID_URL = r'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?live/(?P<id>\d+)'
  87. _TEST = {
  88. 'url': 'http://awaan.ae/live/6/dubai-tv',
  89. 'info_dict': {
  90. 'id': '6',
  91. 'ext': 'mp4',
  92. 'title': 're:Dubai Al Oula [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
  93. 'upload_date': '20150107',
  94. 'timestamp': 1420588800,
  95. },
  96. 'params': {
  97. # m3u8 download
  98. 'skip_download': True,
  99. },
  100. }
  101. def _real_extract(self, url):
  102. channel_id = self._match_id(url)
  103. channel_data = self._download_json(
  104. 'http://admin.mangomolo.com/analytics/index.php/plus/getchanneldetails?channel_id=%s' % channel_id,
  105. channel_id, headers={'Origin': 'http://awaan.ae'})
  106. info = self._parse_video_data(channel_data, channel_id, True)
  107. embed_url = 'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' + compat_urllib_parse_urlencode({
  108. 'id': base64.b64encode(channel_data['user_id'].encode()).decode(),
  109. 'channelid': base64.b64encode(channel_data['id'].encode()).decode(),
  110. 'signature': channel_data['signature'],
  111. 'countries': 'Q0M=',
  112. 'filter': 'DENY',
  113. })
  114. info.update({
  115. '_type': 'url_transparent',
  116. 'url': embed_url,
  117. 'ie_key': 'MangomoloLive',
  118. })
  119. return info
  120. class AWAANSeasonIE(InfoExtractor):
  121. IE_NAME = 'awaan:season'
  122. _VALID_URL = r'https?://(?:www\.)?(?:awaan|dcndigital)\.ae/(?:#/)?program/(?:(?P<show_id>\d+)|season/(?P<season_id>\d+))'
  123. _TEST = {
  124. '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',
  125. 'info_dict':
  126. {
  127. 'id': '7910',
  128. 'title': 'محاضرات الشيخ الشعراوي',
  129. },
  130. 'playlist_mincount': 27,
  131. }
  132. def _real_extract(self, url):
  133. url, smuggled_data = unsmuggle_url(url, {})
  134. show_id, season_id = re.match(self._VALID_URL, url).groups()
  135. data = {}
  136. if season_id:
  137. data['season'] = season_id
  138. show_id = smuggled_data.get('show_id')
  139. if show_id is None:
  140. season = self._download_json(
  141. 'http://admin.mangomolo.com/analytics/index.php/plus/season_info?id=%s' % season_id,
  142. season_id, headers={'Origin': 'http://awaan.ae'})
  143. show_id = season['id']
  144. data['show_id'] = show_id
  145. show = self._download_json(
  146. 'http://admin.mangomolo.com/analytics/index.php/plus/show',
  147. show_id, data=urlencode_postdata(data), headers={
  148. 'Origin': 'http://awaan.ae',
  149. 'Content-Type': 'application/x-www-form-urlencoded'
  150. })
  151. if not season_id:
  152. season_id = show['default_season']
  153. for season in show['seasons']:
  154. if season['id'] == season_id:
  155. title = season.get('title_en') or season['title_ar']
  156. entries = []
  157. for video in show['videos']:
  158. video_id = compat_str(video['id'])
  159. entries.append(self.url_result(
  160. 'http://awaan.ae/media/%s' % video_id, 'AWAANVideo', video_id))
  161. return self.playlist_result(entries, season_id, title)