Merge branch 'dcn' of github.com:remitamine/youtube-dl into remitamine-dcn
authorremitamine <remitamine@gmail.com>
Mon, 28 Dec 2015 09:38:31 +0000 (10:38 +0100)
committerremitamine <remitamine@gmail.com>
Mon, 28 Dec 2015 09:38:31 +0000 (10:38 +0100)
1  2 
youtube_dl/extractor/__init__.py
youtube_dl/extractor/dcn.py

index c1dbf9f2102f69bdeccf7919021984c34a07c449,abf36caf3f8dd67b5bb9dc112a7589b238ac69ef..971047ad4d27bdbde1c7f92cace36339da3c4177
@@@ -135,10 -118,14 +135,15 @@@ from .dailymotion import 
  )
  from .daum import DaumIE
  from .dbtv import DBTVIE
- from .dcn import DCNIE
+ from .dcn import (
+     DCNIE,
+     DCNVideoIE,
+     DCNLiveIE,
+     DCNSeasonIE,
+ )
  from .dctp import DctpTvIE
  from .deezer import DeezerPlaylistIE
 +from .democracynow import DemocracynowIE
  from .dfb import DFBIE
  from .dhm import DHMIE
  from .dotsub import DotsubIE
index 9737cff14b86849a7a4b4bd838902a4d71278c93,d9485cd8677f296070e6b80859ff91da4267b389..0d140f12fd8ea81d1c486f470bd4f83a2edf82d9
@@@ -1,12 -1,19 +1,17 @@@
  # coding: utf-8
  from __future__ import unicode_literals
  
+ import re
+ import base64
  from .common import InfoExtractor
 -from ..compat import (
 -    compat_urllib_parse,
 -    compat_urllib_request,
 -)
 +from ..compat import compat_urllib_parse
  from ..utils import (
      int_or_none,
      parse_iso8601,
 +    sanitized_Request,
+     smuggle_url,
+     unsmuggle_url,
  )
  
  
@@@ -34,12 -99,11 +97,11 @@@ class DCNVideoIE(DCNBaseIE)
      def _real_extract(self, url):
          video_id = self._match_id(url)
  
 -        request = compat_urllib_request.Request(
 +        request = sanitized_Request(
              'http://admin.mangomolo.com/analytics/index.php/plus/video?id=%s' % video_id,
              headers={'Origin': 'http://www.dcndigital.ae'})
-         video = self._download_json(request, video_id)
-         title = video.get('title_en') or video['title_ar']
+         video_data = self._download_json(request, video_id)
+         info = self._extract_video_info(video_data, video_id, False)
  
          webpage = self._download_webpage(
              'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' +
                  'countries': 'Q0M=',
                  'filter': 'DENY',
              }), video_id)
+         info['formats'] = self._extract_video_formats(webpage, video_id, 'm3u8_native')
+         return info
  
-         m3u8_url = self._html_search_regex(r'file:\s*"([^"]+)', webpage, 'm3u8 url')
-         formats = self._extract_m3u8_formats(
-             m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls')
  
-         rtsp_url = self._search_regex(
-             r'<a[^>]+href="(rtsp://[^"]+)"', webpage, 'rtsp url', fatal=False)
-         if rtsp_url:
-             formats.append({
-                 'url': rtsp_url,
-                 'format_id': 'rtsp',
+ class DCNLiveIE(DCNBaseIE):
+     IE_NAME = 'dcn:live'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?live/(?P<id>\d+)'
+     def _real_extract(self, url):
+         channel_id = self._match_id(url)
 -        request = compat_urllib_request.Request(
++        request = sanitized_Request(
+             'http://admin.mangomolo.com/analytics/index.php/plus/getchanneldetails?channel_id=%s' % channel_id,
+             headers={'Origin': 'http://www.dcndigital.ae'})
+         channel_data = self._download_json(request, channel_id)
+         info = self._extract_video_info(channel_data, channel_id, True)
+         webpage = self._download_webpage(
+             'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' +
+             compat_urllib_parse.urlencode({
+                 'id': base64.b64encode(channel_data['user_id'].encode()).decode(),
+                 'channelid': base64.b64encode(channel_data['id'].encode()).decode(),
+                 'signature': channel_data['signature'],
+                 'countries': 'Q0M=',
+                 'filter': 'DENY',
+             }), channel_id)
+         info['formats'] = self._extract_video_formats(webpage, channel_id, 'm3u8')
+         return info
+ class DCNSeasonIE(InfoExtractor):
+     IE_NAME = 'dcn:season'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?program/(?:(?P<show_id>\d+)|season/(?P<season_id>\d+))'
+     _TEST = {
+         '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',
+         'info_dict':
+         {
+             'id': '7910',
+             'title': 'محاضرات الشيخ الشعراوي',
+         },
+         'playlist_mincount': 27,
+     }
+     def _real_extract(self, url):
+         url, smuggled_data = unsmuggle_url(url, {})
+         show_id, season_id = re.match(self._VALID_URL, url).groups()
+         data = {}
+         if season_id:
+             data['season'] = season_id
+             show_id = smuggled_data.get('show_id')
+             if show_id is None:
 -                request = compat_urllib_request.Request(
++                request = sanitized_Request(
+                     'http://admin.mangomolo.com/analytics/index.php/plus/season_info?id=%s' % season_id,
+                     headers={'Origin': 'http://www.dcndigital.ae'})
+                 season = self._download_json(request, season_id)
+                 show_id = season['id']
+         data['show_id'] = show_id
 -        request = compat_urllib_request.Request(
++        request = sanitized_Request(
+             'http://admin.mangomolo.com/analytics/index.php/plus/show',
+             compat_urllib_parse.urlencode(data),
+             {
+                 'Origin': 'http://www.dcndigital.ae',
+                 'Content-Type': 'application/x-www-form-urlencoded'
              })
  
-         self._sort_formats(formats)
+         show = self._download_json(request, show_id)
+         if not season_id:
+             season_id = show['default_season']
+         for season in show['seasons']:
+             if season['id'] == season_id:
+                 title = season.get('title_en') or season['title_ar']
  
-         img = video.get('img')
-         thumbnail = 'http://admin.mangomolo.com/analytics/%s' % img if img else None
-         duration = int_or_none(video.get('duration'))
-         description = video.get('description_en') or video.get('description_ar')
-         timestamp = parse_iso8601(video.get('create_time') or video.get('update_time'), ' ')
+                 entries = []
+                 for video in show['videos']:
+                     entries.append(self.url_result(
+                         'http://www.dcndigital.ae/media/%s' % video['id'], 'DCNVideo'))
  
-         return {
-             'id': video_id,
-             'title': title,
-             'description': description,
-             'thumbnail': thumbnail,
-             'duration': duration,
-             'timestamp': timestamp,
-             'formats': formats,
-         }
+                 return self.playlist_result(entries, season_id, title)