mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	Merge branch 'cn-verification-proxy'
This commit is contained in:
		| @@ -54,6 +54,7 @@ from .utils import ( | |||||||
|     MaxDownloadsReached, |     MaxDownloadsReached, | ||||||
|     PagedList, |     PagedList, | ||||||
|     parse_filesize, |     parse_filesize, | ||||||
|  |     PerRequestProxyHandler, | ||||||
|     PostProcessingError, |     PostProcessingError, | ||||||
|     platform_name, |     platform_name, | ||||||
|     preferredencoding, |     preferredencoding, | ||||||
| @@ -183,6 +184,8 @@ class YoutubeDL(object): | |||||||
|     prefer_insecure:   Use HTTP instead of HTTPS to retrieve information. |     prefer_insecure:   Use HTTP instead of HTTPS to retrieve information. | ||||||
|                        At the moment, this is only supported by YouTube. |                        At the moment, this is only supported by YouTube. | ||||||
|     proxy:             URL of the proxy server to use |     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 |     socket_timeout:    Time to wait for unresponsive hosts, in seconds | ||||||
|     bidi_workaround:   Work around buggy terminals without bidirectional text |     bidi_workaround:   Work around buggy terminals without bidirectional text | ||||||
|                        support, using fridibi |                        support, using fridibi | ||||||
| @@ -1762,13 +1765,14 @@ class YoutubeDL(object): | |||||||
|             # Set HTTPS proxy to HTTP one if given (https://github.com/rg3/youtube-dl/issues/805) |             # 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: |             if 'http' in proxies and 'https' not in proxies: | ||||||
|                 proxies['https'] = proxies['http'] |                 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 |         debuglevel = 1 if self.params.get('debug_printtraffic') else 0 | ||||||
|         https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) |         https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) | ||||||
|         ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel) |         ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel) | ||||||
|         opener = compat_urllib_request.build_opener( |         opener = compat_urllib_request.build_opener( | ||||||
|             https_handler, proxy_handler, cookie_processor, ydlh) |             proxy_handler, https_handler, cookie_processor, ydlh) | ||||||
|  |  | ||||||
|         # Delete the default user-agent header, which would otherwise apply in |         # Delete the default user-agent header, which would otherwise apply in | ||||||
|         # cases where our custom HTTP handler doesn't come into play |         # cases where our custom HTTP handler doesn't come into play | ||||||
|         # (See https://github.com/rg3/youtube-dl/issues/1309 for details) |         # (See https://github.com/rg3/youtube-dl/issues/1309 for details) | ||||||
|   | |||||||
| @@ -364,6 +364,7 @@ def _real_main(argv=None): | |||||||
|         'ffmpeg_location': opts.ffmpeg_location, |         'ffmpeg_location': opts.ffmpeg_location, | ||||||
|         'hls_prefer_native': opts.hls_prefer_native, |         'hls_prefer_native': opts.hls_prefer_native, | ||||||
|         'external_downloader_args': external_downloader_args, |         'external_downloader_args': external_downloader_args, | ||||||
|  |         'cn_verification_proxy': opts.cn_verification_proxy, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     with YoutubeDL(ydl_opts) as ydl: |     with YoutubeDL(ydl_opts) as ydl: | ||||||
|   | |||||||
| @@ -7,8 +7,9 @@ import time | |||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
| from ..compat import ( | from ..compat import ( | ||||||
|     compat_urlparse, |  | ||||||
|     compat_urllib_parse, |     compat_urllib_parse, | ||||||
|  |     compat_urllib_request, | ||||||
|  |     compat_urlparse, | ||||||
| ) | ) | ||||||
| from ..utils import ( | from ..utils import ( | ||||||
|     determine_ext, |     determine_ext, | ||||||
| @@ -39,12 +40,20 @@ class LetvIE(InfoExtractor): | |||||||
|             'title': '美人天下01', |             'title': '美人天下01', | ||||||
|             'description': 'md5:f88573d9d7225ada1359eaf0dbf8bcda', |             'description': 'md5:f88573d9d7225ada1359eaf0dbf8bcda', | ||||||
|         }, |         }, | ||||||
|         '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', | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             'cn_verification_proxy': 'http://proxy.uku.im:8888' | ||||||
|  |         }, | ||||||
|     }] |     }] | ||||||
|     # http://www.letv.com/ptv/vplay/1118082.html |  | ||||||
|     # This video is available only in Mainland China |  | ||||||
|  |  | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def urshift(val, n): |     def urshift(val, n): | ||||||
| @@ -76,8 +85,14 @@ class LetvIE(InfoExtractor): | |||||||
|             'tkey': self.calc_time_key(int(time.time())), |             'tkey': self.calc_time_key(int(time.time())), | ||||||
|             'domain': 'www.letv.com' |             '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( |         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') |             media_id, 'playJson data') | ||||||
|  |  | ||||||
|         # Check for errors |         # Check for errors | ||||||
| @@ -114,7 +129,8 @@ class LetvIE(InfoExtractor): | |||||||
|  |  | ||||||
|                 url_info_dict = { |                 url_info_dict = { | ||||||
|                     'url': media_url, |                     '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': |                 if format_id[-1:] == 'p': | ||||||
| @@ -123,7 +139,7 @@ class LetvIE(InfoExtractor): | |||||||
|                 urls.append(url_info_dict) |                 urls.append(url_info_dict) | ||||||
|  |  | ||||||
|         publish_time = parse_iso8601(self._html_search_regex( |         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)) |             delimiter=' ', timezone=datetime.timedelta(hours=8)) | ||||||
|         description = self._html_search_meta('description', page, fatal=False) |         description = self._html_search_meta('description', page, fatal=False) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -195,6 +195,12 @@ def parseOpts(overrideArguments=None): | |||||||
|         action='store_const', const='::', dest='source_address', |         action='store_const', const='::', dest='source_address', | ||||||
|         help='Make all connections via IPv6 (experimental)', |         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 = optparse.OptionGroup(parser, 'Video Selection') | ||||||
|     selection.add_option( |     selection.add_option( | ||||||
|   | |||||||
| @@ -1768,3 +1768,24 @@ def match_filter_func(filter_str): | |||||||
|             video_title = info_dict.get('title', info_dict.get('id', 'video')) |             video_title = info_dict.get('title', info_dict.get('id', 'video')) | ||||||
|             return '%s does not pass filter %s, skipping ..' % (video_title, filter_str) |             return '%s does not pass filter %s, skipping ..' % (video_title, filter_str) | ||||||
|     return _match_func |     return _match_func | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PerRequestProxyHandler(compat_urllib_request.ProxyHandler): | ||||||
|  |     def __init__(self, proxies=None): | ||||||
|  |         # Set default handlers | ||||||
|  |         for type in ('http', 'https'): | ||||||
|  |             setattr(self, '%s_open' % type, | ||||||
|  |                     lambda r, proxy='__noproxy__', type=type, meth=self.proxy_open: | ||||||
|  |                         meth(r, proxy, type)) | ||||||
|  |         return compat_urllib_request.ProxyHandler.__init__(self, proxies) | ||||||
|  |  | ||||||
|  |     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'] | ||||||
|  |  | ||||||
|  |         if proxy == '__noproxy__': | ||||||
|  |             return None  # No Proxy | ||||||
|  |         return compat_urllib_request.ProxyHandler.proxy_open( | ||||||
|  |             self, req, proxy, type) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user