diff options
Diffstat (limited to 'youtube_dl/extractor/letv.py')
| -rw-r--r-- | youtube_dl/extractor/letv.py | 65 | 
1 files changed, 50 insertions, 15 deletions
| diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index 08bdae8a2..9665ece89 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -5,11 +5,13 @@ import datetime  import re  import time  import base64 +import hashlib  from .common import InfoExtractor  from ..compat import (      compat_urllib_parse,      compat_ord, +    compat_str,  )  from ..utils import (      determine_ext, @@ -258,6 +260,7 @@ class LetvCloudIE(InfoExtractor):          },      }, {          'url': 'http://yuntv.letv.com/bcloud.html?uu=p7jnfw5hw9&vu=ec93197892&pu=2c7cd40209&auto_play=1&gpcflag=1&width=640&height=360', +        'md5': 'e03d9cc8d9c13191e1caf277e42dbd31',          'info_dict': {              'id': 'p7jnfw5hw9_ec93197892',              'ext': 'mp4', @@ -265,6 +268,7 @@ class LetvCloudIE(InfoExtractor):          },      }, {          'url': 'http://yuntv.letv.com/bcloud.html?uu=p7jnfw5hw9&vu=187060b6fd', +        'md5': 'cb988699a776b22d4a41b9d43acfb3ac',          'info_dict': {              'id': 'p7jnfw5hw9_187060b6fd',              'ext': 'mp4', @@ -272,21 +276,37 @@ class LetvCloudIE(InfoExtractor):          },      }] -    def _real_extract(self, url): -        uu_mobj = re.search('uu=([\w]+)', url) -        vu_mobj = re.search('vu=([\w]+)', url) - -        if not uu_mobj or not vu_mobj: -            raise ExtractorError('Invalid URL: %s' % url, expected=True) - -        uu = uu_mobj.group(1) -        vu = vu_mobj.group(1) -        media_id = uu + '_' + vu - -        play_json_req = sanitized_Request( -            'http://api.letvcloud.com/gpc.php?cf=html5&sign=signxxxxx&ver=2.2&format=json&' + -            'uu=' + uu + '&vu=' + vu) -        play_json = self._download_json(play_json_req, media_id, 'Downloading playJson data') +    @staticmethod +    def sign_data(obj): +        if obj['cf'] == 'flash': +            salt = '2f9d6924b33a165a6d8b5d3d42f4f987' +            items = ['cf', 'format', 'ran', 'uu', 'ver', 'vu'] +        elif obj['cf'] == 'html5': +            salt = 'fbeh5player12c43eccf2bec3300344' +            items = ['cf', 'ran', 'uu', 'bver', 'vu'] +        input_data = ''.join([item + obj[item] for item in items]) + salt +        obj['sign'] = hashlib.md5(input_data.encode('utf-8')).hexdigest() + +    def _get_formats(self, cf, uu, vu, media_id): +        def get_play_json(cf, timestamp): +            data = { +                'cf': cf, +                'ver': '2.2', +                'bver': 'firefox44.0', +                'format': 'json', +                'uu': uu, +                'vu': vu, +                'ran': compat_str(timestamp), +            } +            self.sign_data(data) +            return self._download_json( +                'http://api.letvcloud.com/gpc.php?' + compat_urllib_parse.urlencode(data), +                media_id, 'Downloading playJson data for type %s' % cf) + +        play_json = get_play_json(cf, time.time()) +        # The server time may be different from local time +        if play_json.get('code') == 10071: +            play_json = get_play_json(cf, play_json['timestamp'])          if not play_json.get('data'):              if play_json.get('message'): @@ -312,6 +332,21 @@ class LetvCloudIE(InfoExtractor):                  'width': int_or_none(play_url.get('vwidth')),                  'height': int_or_none(play_url.get('vheight')),              }) + +        return formats + +    def _real_extract(self, url): +        uu_mobj = re.search('uu=([\w]+)', url) +        vu_mobj = re.search('vu=([\w]+)', url) + +        if not uu_mobj or not vu_mobj: +            raise ExtractorError('Invalid URL: %s' % url, expected=True) + +        uu = uu_mobj.group(1) +        vu = vu_mobj.group(1) +        media_id = uu + '_' + vu + +        formats = self._get_formats('flash', uu, vu, media_id) + self._get_formats('html5', uu, vu, media_id)          self._sort_formats(formats)          return { | 
