[letv] Add --cn-verification-proxy (Closes #5077)
authorPhilipp Hagemeister <phihag@phihag.de>
Mon, 2 Mar 2015 23:03:06 +0000 (00:03 +0100)
committerPhilipp Hagemeister <phihag@phihag.de>
Mon, 2 Mar 2015 23:03:06 +0000 (00:03 +0100)
youtube_dl/YoutubeDL.py
youtube_dl/__init__.py
youtube_dl/extractor/letv.py
youtube_dl/options.py
youtube_dl/utils.py

index e0baa98727b758538bfb66ee47d3207b02f1bc8e..915963d96a6b06fbc0c809d8c1afb73ba27770d0 100755 (executable)
@@ -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)
index 6056da1be873284f696f651d24da1043a9f1d304..a08ddd67097162989e3c5c82502d5654bbc4b0e0 100644 (file)
@@ -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:
index 583ce35b903dd5ee3214db7c7d3f0b604e0f4cf3..fd5fd260e9e40baf294815d9b42c363d0f482380 100644 (file)
@@ -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'发布时间&nbsp;([^<>]+) ', page, 'publish time', fatal=False),
+            r'发布时间&nbsp;([^<>]+) ', page, 'publish time', default=None),
             delimiter=' ', timezone=datetime.timedelta(hours=8))
         description = self._html_search_meta('description', page, fatal=False)
 
index df2be7b74fe9d534459d8929e49de7195f132a62..a4ca8adc42ba9222da13c581c08ae8e7af6794fe 100644 (file)
@@ -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(
index 1d3401bc2d9358b38aad8635ecf7dc5c4ab7a6fa..b568288faad1e3a0b09f240edfa1f89301799125 100644 (file)
@@ -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)