diff options
| author | Yen Chi Hsuan <yan12125@gmail.com> | 2018-01-09 18:13:11 +0800 | 
|---|---|---|
| committer | Yen Chi Hsuan <yan12125@gmail.com> | 2018-01-09 18:13:11 +0800 | 
| commit | 4df1098c3f580a20a9afc627171945389f3de312 (patch) | |
| tree | 33f943aeba470289433e2627d2a687777d7dca0b /youtube_dl/extractor/weibo.py | |
| parent | 8005dc68cbdfc15b6353a071ef87d7e57d69ff59 (diff) | |
| parent | 5eca00a2e33a6ca26a7f52589e5d77bab7e5edf4 (diff) | |
Merge branch 'sprhawk-weibo'
Diffstat (limited to 'youtube_dl/extractor/weibo.py')
| -rw-r--r-- | youtube_dl/extractor/weibo.py | 140 | 
1 files changed, 140 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/weibo.py b/youtube_dl/extractor/weibo.py new file mode 100644 index 000000000..3cb4d71a6 --- /dev/null +++ b/youtube_dl/extractor/weibo.py @@ -0,0 +1,140 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor + +import json +import random +import re + +from ..compat import ( +    compat_parse_qs, +    compat_str, +) +from ..utils import ( +    js_to_json, +    strip_jsonp, +    urlencode_postdata, +) + + +class WeiboIE(InfoExtractor): +    _VALID_URL = r'https?://weibo\.com/[0-9]+/(?P<id>[a-zA-Z0-9]+)' +    _TEST = { +        'url': 'https://weibo.com/6275294458/Fp6RGfbff?type=comment', +        'info_dict': { +            'id': 'Fp6RGfbff', +            'ext': 'mp4', +            'title': 'You should have servants to massage you,... 来自Hosico_猫 - 微博', +        } +    } + +    def _real_extract(self, url): +        video_id = self._match_id(url) +        # to get Referer url for genvisitor +        webpage, urlh = self._download_webpage_handle(url, video_id) + +        visitor_url = urlh.geturl() + +        if 'passport.weibo.com' in visitor_url: +            # first visit +            visitor_data = self._download_json( +                'https://passport.weibo.com/visitor/genvisitor', video_id, +                note='Generating first-visit data', +                transform_source=strip_jsonp, +                headers={'Referer': visitor_url}, +                data=urlencode_postdata({ +                    'cb': 'gen_callback', +                    'fp': json.dumps({ +                        'os': '2', +                        'browser': 'Gecko57,0,0,0', +                        'fonts': 'undefined', +                        'screenInfo': '1440*900*24', +                        'plugins': '', +                    }), +                })) + +            tid = visitor_data['data']['tid'] +            cnfd = '%03d' % visitor_data['data']['confidence'] + +            self._download_webpage( +                'https://passport.weibo.com/visitor/visitor', video_id, +                note='Running first-visit callback', +                query={ +                    'a': 'incarnate', +                    't': tid, +                    'w': 2, +                    'c': cnfd, +                    'cb': 'cross_domain', +                    'from': 'weibo', +                    '_rand': random.random(), +                }) + +            webpage = self._download_webpage( +                url, video_id, note='Revisiting webpage') + +        title = self._html_search_regex( +            r'<title>(.+?)</title>', webpage, 'title') + +        video_formats = compat_parse_qs(self._search_regex( +            r'video-sources=\\\"(.+?)\"', webpage, 'video_sources')) + +        formats = [] +        supported_resolutions = (480, 720) +        for res in supported_resolutions: +            vid_urls = video_formats.get(compat_str(res)) +            if not vid_urls or not isinstance(vid_urls, list): +                continue + +            vid_url = vid_urls[0] +            formats.append({ +                'url': vid_url, +                'height': res, +            }) + +        self._sort_formats(formats) + +        uploader = self._og_search_property( +            'nick-name', webpage, 'uploader', default=None) + +        return { +            'id': video_id, +            'title': title, +            'uploader': uploader, +            'formats': formats +        } + + +class WeiboMobileIE(InfoExtractor): +    _VALID_URL = r'https?://m\.weibo\.cn/status/(?P<id>[0-9]+)(\?.+)?' +    _TEST = { +        'url': 'https://m.weibo.cn/status/4189191225395228?wm=3333_2001&sourcetype=weixin&featurecode=newtitle&from=singlemessage&isappinstalled=0', +        'info_dict': { +            'id': '4189191225395228', +            'ext': 'mp4', +            'title': '午睡当然是要甜甜蜜蜜的啦', +            'uploader': '柴犬柴犬' +        } +    } + +    def _real_extract(self, url): +        video_id = self._match_id(url) +        # to get Referer url for genvisitor +        webpage = self._download_webpage(url, video_id, note='visit the page') + +        weibo_info = self._parse_json(self._search_regex( +            r'var\s+\$render_data\s*=\s*\[({.*})\]\[0\]\s*\|\|\s*{};', +            webpage, 'js_code', flags=re.DOTALL), +            video_id, transform_source=js_to_json) + +        status_data = weibo_info.get('status', {}) +        page_info = status_data.get('page_info') +        title = status_data['status_title'] +        uploader = status_data.get('user', {}).get('screen_name') + +        return { +            'id': video_id, +            'title': title, +            'uploader': uploader, +            'url': page_info['media_info']['stream_url'] +        } | 
