diff options
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 5 | ||||
| -rw-r--r-- | youtube_dl/__init__.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/letv.py | 34 | ||||
| -rw-r--r-- | youtube_dl/options.py | 6 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 10 | 
5 files changed, 49 insertions, 7 deletions
| diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index e0baa9872..915963d96 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -54,6 +54,7 @@ from .utils import (      MaxDownloadsReached,      PagedList,      parse_filesize, +    PerRequestProxyHandler,      PostProcessingError,      platform_name,      preferredencoding, @@ -183,6 +184,8 @@ class YoutubeDL(object):      prefer_insecure:   Use HTTP instead of HTTPS to retrieve information.                         At the moment, this is only supported by YouTube.      proxy:             URL of the proxy server to use +    cn_verification_proxy:  URL of the proxy to use for IP address verification +                       on Chinese sites. (Experimental)      socket_timeout:    Time to wait for unresponsive hosts, in seconds      bidi_workaround:   Work around buggy terminals without bidirectional text                         support, using fridibi @@ -1762,7 +1765,7 @@ class YoutubeDL(object):              # Set HTTPS proxy to HTTP one if given (https://github.com/rg3/youtube-dl/issues/805)              if 'http' in proxies and 'https' not in proxies:                  proxies['https'] = proxies['http'] -        proxy_handler = compat_urllib_request.ProxyHandler(proxies) +        proxy_handler = PerRequestProxyHandler(proxies)          debuglevel = 1 if self.params.get('debug_printtraffic') else 0          https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 6056da1be..a08ddd670 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -364,6 +364,7 @@ def _real_main(argv=None):          'ffmpeg_location': opts.ffmpeg_location,          'hls_prefer_native': opts.hls_prefer_native,          'external_downloader_args': external_downloader_args, +        'cn_verification_proxy': opts.cn_verification_proxy,      }      with YoutubeDL(ydl_opts) as ydl: diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index 583ce35b9..fd5fd260e 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -7,8 +7,9 @@ import time  from .common import InfoExtractor  from ..compat import ( -    compat_urlparse,      compat_urllib_parse, +    compat_urllib_request, +    compat_urlparse,  )  from ..utils import (      determine_ext, @@ -42,9 +43,23 @@ class LetvIE(InfoExtractor):          'expected_warnings': [              'publish time'          ] +    }, { +        'note': 'This video is available only in Mainland China, thus a proxy is needed', +        'url': 'http://www.letv.com/ptv/vplay/1118082.html', +        'md5': 'f80936fbe20fb2f58648e81386ff7927', +        'info_dict': { +            'id': '1118082', +            'ext': 'mp4', +            'title': '与龙共舞 完整版', +            'description': 'md5:7506a5eeb1722bb9d4068f85024e3986', +        }, +        'expected_warnings': [ +            'publish time' +        ], +        'params': { +            'cn_verification_proxy': 'proxy.uku.im:8888' +        },      }] -    # http://www.letv.com/ptv/vplay/1118082.html -    # This video is available only in Mainland China      @staticmethod      def urshift(val, n): @@ -76,8 +91,14 @@ class LetvIE(InfoExtractor):              'tkey': self.calc_time_key(int(time.time())),              'domain': 'www.letv.com'          } +        play_json_req = compat_urllib_request.Request( +            'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params) +        ) +        play_json_req.add_header( +            'Ytdl-Request-Proxy', +            self._downloader.params.get('cn_verification_proxy'))          play_json = self._download_json( -            'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params), +            play_json_req,              media_id, 'playJson data')          # Check for errors @@ -114,7 +135,8 @@ class LetvIE(InfoExtractor):                  url_info_dict = {                      'url': media_url, -                    'ext': determine_ext(dispatch[format_id][1]) +                    'ext': determine_ext(dispatch[format_id][1]), +                    'format_id': format_id,                  }                  if format_id[-1:] == 'p': @@ -123,7 +145,7 @@ class LetvIE(InfoExtractor):                  urls.append(url_info_dict)          publish_time = parse_iso8601(self._html_search_regex( -            r'发布时间 ([^<>]+) ', page, 'publish time', fatal=False), +            r'发布时间 ([^<>]+) ', page, 'publish time', default=None),              delimiter=' ', timezone=datetime.timedelta(hours=8))          description = self._html_search_meta('description', page, fatal=False) diff --git a/youtube_dl/options.py b/youtube_dl/options.py index df2be7b74..a4ca8adc4 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -195,6 +195,12 @@ def parseOpts(overrideArguments=None):          action='store_const', const='::', dest='source_address',          help='Make all connections via IPv6 (experimental)',      ) +    network.add_option( +        '--cn-verification-proxy', +        dest='cn_verification_proxy', default=None, metavar='URL', +        help='Use this proxy to verify the IP address for some Chinese sites. ' +        'The default proxy specified by --proxy (or none, if the options is not present) is used for the actual downloading. (experimental)' +    )      selection = optparse.OptionGroup(parser, 'Video Selection')      selection.add_option( diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 1d3401bc2..b568288fa 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1768,3 +1768,13 @@ def match_filter_func(filter_str):              video_title = info_dict.get('title', info_dict.get('id', 'video'))              return '%s does not pass filter %s, skipping ..' % (video_title, filter_str)      return _match_func + + +class PerRequestProxyHandler(compat_urllib_request.ProxyHandler): +    def proxy_open(self, req, proxy, type): +        req_proxy = req.headers.get('Ytdl-Request-Proxy') +        if req_proxy is not None: +            proxy = req_proxy +            del req.headers['Ytdl-Request-Proxy'] +        return compat_urllib_request.ProxyHandler.proxy_open( +            self, req, proxy, type) | 
