From a61e28dbcc7027352735a99a0af2541f7e4deb99 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Thu, 26 Feb 2015 17:14:10 +0800 Subject: [PATCH 01/11] [YoutubeDL] Add support for multiple proxies A test case is listed in youtube_dl/extractor/letv.py --- youtube_dl/YoutubeDL.py | 19 +++++++++++++++---- youtube_dl/__init__.py | 1 + youtube_dl/extractor/common.py | 9 +++++++++ youtube_dl/extractor/letv.py | 26 ++++++++++++++++++++++++-- youtube_dl/options.py | 5 +++++ 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 76fc394bc..2bc02f8ca 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -277,6 +277,7 @@ class YoutubeDL(object): self._num_downloads = 0 self._screen_file = [sys.stdout, sys.stderr][params.get('logtostderr', False)] self._err_file = sys.stderr + self._openers_pool = {} self.params = params self.cache = Cache(self) @@ -320,7 +321,7 @@ class YoutubeDL(object): if '%(stitle)s' in self.params.get('outtmpl', ''): self.report_warning('%(stitle)s is deprecated. Use the %(title)s and the --restrict-filenames flag(which also secures %(uploader)s et al) instead.') - self._setup_opener() + self._setup_openers() if auto_init: self.print_debug_header() @@ -1729,12 +1730,16 @@ class YoutubeDL(object): 'See https://yt-dl.org/update if you need help updating.' % latest_version) - def _setup_opener(self): + def _setup_openers(self): + self._setup_single_opener('default', self.params.get('proxy')) + self._setup_single_opener('alternative', self.params.get('alternative_proxy')) + self.use_opener('default') + + def _setup_single_opener(self, opener_name, opts_proxy): timeout_val = self.params.get('socket_timeout') self._socket_timeout = 600 if timeout_val is None else float(timeout_val) opts_cookiefile = self.params.get('cookiefile') - opts_proxy = self.params.get('proxy') if opts_cookiefile is None: self.cookiejar = compat_cookiejar.CookieJar() @@ -1767,7 +1772,13 @@ class YoutubeDL(object): # cases where our custom HTTP handler doesn't come into play # (See https://github.com/rg3/youtube-dl/issues/1309 for details) opener.addheaders = [] - self._opener = opener + self._openers_pool[opener_name] = opener + + def use_opener(self, opener_name): + if opener_name in self._openers_pool: + self._opener = self._openers_pool[opener_name] + else: + raise Exception('Invalid opener name ' + opener_name) def encode(self, s): if isinstance(s, bytes): diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 5ce201800..781033a9a 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -327,6 +327,7 @@ def _real_main(argv=None): 'nocheckcertificate': opts.no_check_certificate, 'prefer_insecure': opts.prefer_insecure, 'proxy': opts.proxy, + 'alternative_proxy': opts.alternative_proxy, 'socket_timeout': opts.socket_timeout, 'bidi_workaround': opts.bidi_workaround, 'debug_printtraffic': opts.debug_printtraffic, diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 7977fa8d0..65f29de8a 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1053,6 +1053,15 @@ class InfoExtractor(object): def _get_automatic_captions(self, *args, **kwargs): raise NotImplementedError("This method must be implemented by subclasses") + def _multiple_opener_supported(self): + return hasattr(self._downloader, 'use_opener') + + def _use_opener(self, opener_name): + if self._multiple_opener_supported(): + self._downloader.use_opener(opener_name) + else: + raise Exception('Multiple opener not supported') + class SearchInfoExtractor(InfoExtractor): """ diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index 583ce35b9..c3886125d 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -33,6 +33,7 @@ class LetvIE(InfoExtractor): } }, { 'url': 'http://www.letv.com/ptv/vplay/1415246.html', + 'md5': 'b4b0a9248ecf34d80ee52a2609627a88', 'info_dict': { 'id': '1415246', 'ext': 'mp4', @@ -42,9 +43,23 @@ class LetvIE(InfoExtractor): 'expected_warnings': [ 'publish time' ] + }, { + # 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': { + 'alternative_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,10 +91,17 @@ class LetvIE(InfoExtractor): 'tkey': self.calc_time_key(int(time.time())), 'domain': 'www.letv.com' } + + if self._multiple_opener_supported(): + self._use_opener('alternative') + play_json = self._download_json( 'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params), media_id, 'playJson data') + if self._multiple_opener_supported(): + self._use_opener('default') + # Check for errors playstatus = play_json['playstatus'] if playstatus['status'] == 0: diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 886ce9613..8cfa7ec7c 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -176,6 +176,11 @@ def parseOpts(overrideArguments=None): '--proxy', dest='proxy', default=None, metavar='URL', help='Use the specified HTTP/HTTPS proxy. Pass in an empty string (--proxy "") for direct connection') + network.add_option( + '--alternative-proxy', dest='alternative_proxy', + default=None, metavar='URL', + help='Use the specified HTTP/HTTPS address as the alternative proxy. Pass in an empty string (--alternative-proxy "") for direct connection' + ) network.add_option( '--socket-timeout', dest='socket_timeout', type=float, default=None, metavar='SECONDS', From 9c10fed4dbb042dca93ad01bd263ebce1ac7d1e2 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Thu, 26 Feb 2015 17:15:11 +0800 Subject: [PATCH 02/11] [Letv] Add format_id --- youtube_dl/extractor/letv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index c3886125d..59455b029 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -136,7 +136,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': From 9dadd38c22c531f0a2af17a5b7eb724bacd21c3a Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Fri, 27 Feb 2015 20:51:43 +0800 Subject: [PATCH 03/11] [YoutubeDL] Use the same proxy as the default one if the alternative one not specified --- youtube_dl/YoutubeDL.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 2bc02f8ca..608039f6c 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -1731,8 +1731,14 @@ class YoutubeDL(object): latest_version) def _setup_openers(self): - self._setup_single_opener('default', self.params.get('proxy')) - self._setup_single_opener('alternative', self.params.get('alternative_proxy')) + default_proxy = self.params.get('proxy') + alternative_proxy = self.params.get('alternative_proxy') + if not alternative_proxy: + alternative_proxy = default_proxy + + self._setup_single_opener('default', default_proxy) + self._setup_single_opener('alternative', alternative_proxy) + self.use_opener('default') def _setup_single_opener(self, opener_name, opts_proxy): From 5c9a26dae5a5667d073186698bb855479b0f634d Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Fri, 27 Feb 2015 21:45:46 +0800 Subject: [PATCH 04/11] [YoutubeDL] Print alternative proxy map in debug info --- youtube_dl/YoutubeDL.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 608039f6c..91b332dce 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -1713,11 +1713,8 @@ class YoutubeDL(object): exe_str = 'none' self._write_string('[debug] exe versions: %s\n' % exe_str) - proxy_map = {} - for handler in self._opener.handlers: - if hasattr(handler, 'proxies'): - proxy_map.update(handler.proxies) - self._write_string('[debug] Proxy map: ' + compat_str(proxy_map) + '\n') + self.dump_proxy_map('default', 'Proxy map') + self.dump_proxy_map('alternative', 'Alternative proxy map') if self.params.get('call_home', False): ipaddr = self.urlopen('https://yt-dl.org/ip').read().decode('utf-8') @@ -1730,6 +1727,13 @@ class YoutubeDL(object): 'See https://yt-dl.org/update if you need help updating.' % latest_version) + def dump_proxy_map(self, opener_name, prefix): + proxy_map = {} + for handler in self._openers_pool[opener_name].handlers: + if hasattr(handler, 'proxies'): + proxy_map.update(handler.proxies) + self._write_string('[debug] %s: %s\n' % (prefix, compat_str(proxy_map))) + def _setup_openers(self): default_proxy = self.params.get('proxy') alternative_proxy = self.params.get('alternative_proxy') From 603251c34d6421ff7c9069630c4abcfbde7b7e16 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sat, 28 Feb 2015 00:09:34 +0800 Subject: [PATCH 05/11] [common] Remove _multiple_opener_supported() Currently YoutubeDL is the only class used in extractors --- youtube_dl/extractor/common.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 65f29de8a..1ff38910e 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1053,14 +1053,8 @@ class InfoExtractor(object): def _get_automatic_captions(self, *args, **kwargs): raise NotImplementedError("This method must be implemented by subclasses") - def _multiple_opener_supported(self): - return hasattr(self._downloader, 'use_opener') - def _use_opener(self, opener_name): - if self._multiple_opener_supported(): - self._downloader.use_opener(opener_name) - else: - raise Exception('Multiple opener not supported') + self._downloader.use_opener(opener_name) class SearchInfoExtractor(InfoExtractor): From 00b621a8906791d251dd784982fa40db79ac36eb Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sat, 28 Feb 2015 00:15:21 +0800 Subject: [PATCH 06/11] [Letv] Removal of InfoExtractor._multiple_opener_supported() --- youtube_dl/extractor/letv.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index 59455b029..21b3ba43c 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -92,15 +92,13 @@ class LetvIE(InfoExtractor): 'domain': 'www.letv.com' } - if self._multiple_opener_supported(): - self._use_opener('alternative') + self._use_opener('alternative') play_json = self._download_json( 'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params), media_id, 'playJson data') - if self._multiple_opener_supported(): - self._use_opener('default') + self._use_opener('default') # Check for errors playstatus = play_json['playstatus'] From 1b92dc06cfdd5ab77644d658652433abf1ae910c Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sat, 28 Feb 2015 10:40:23 +0800 Subject: [PATCH 07/11] [YoutubeDL] Fix inconsistent self.cookiejar and more Idea: move common parts across openers out of _setup_single_opener() --- youtube_dl/YoutubeDL.py | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 91b332dce..fb789a8a2 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -321,6 +321,7 @@ class YoutubeDL(object): if '%(stitle)s' in self.params.get('outtmpl', ''): self.report_warning('%(stitle)s is deprecated. Use the %(title)s and the --restrict-filenames flag(which also secures %(uploader)s et al) instead.') + self._setup_cookiejar() self._setup_openers() if auto_init: @@ -1734,21 +1735,7 @@ class YoutubeDL(object): proxy_map.update(handler.proxies) self._write_string('[debug] %s: %s\n' % (prefix, compat_str(proxy_map))) - def _setup_openers(self): - default_proxy = self.params.get('proxy') - alternative_proxy = self.params.get('alternative_proxy') - if not alternative_proxy: - alternative_proxy = default_proxy - - self._setup_single_opener('default', default_proxy) - self._setup_single_opener('alternative', alternative_proxy) - - self.use_opener('default') - - def _setup_single_opener(self, opener_name, opts_proxy): - timeout_val = self.params.get('socket_timeout') - self._socket_timeout = 600 if timeout_val is None else float(timeout_val) - + def _setup_cookiejar(self): opts_cookiefile = self.params.get('cookiefile') if opts_cookiefile is None: @@ -1759,6 +1746,25 @@ class YoutubeDL(object): if os.access(opts_cookiefile, os.R_OK): self.cookiejar.load() + def _setup_openers(self): + timeout_val = self.params.get('socket_timeout') + self._socket_timeout = 600 if timeout_val is None else float(timeout_val) + + debuglevel = 1 if self.params.get('debug_printtraffic') else 0 + https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) + ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel) + + default_proxy = self.params.get('proxy') + alternative_proxy = self.params.get('alternative_proxy') + if not alternative_proxy: + alternative_proxy = default_proxy + + self._setup_single_opener('default', default_proxy, https_handler, ydlh) + self._setup_single_opener('alternative', alternative_proxy, https_handler, ydlh) + + self.use_opener('default') + + def _setup_single_opener(self, opener_name, opts_proxy, https_handler, ydlh): cookie_processor = compat_urllib_request.HTTPCookieProcessor( self.cookiejar) if opts_proxy is not None: @@ -1773,9 +1779,6 @@ class YoutubeDL(object): proxies['https'] = proxies['http'] proxy_handler = compat_urllib_request.ProxyHandler(proxies) - debuglevel = 1 if self.params.get('debug_printtraffic') else 0 - https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) - ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel) opener = compat_urllib_request.build_opener( https_handler, proxy_handler, cookie_processor, ydlh) # Delete the default user-agent header, which would otherwise apply in From 63367c442bb1cd0a9f90b4e8a18051ac26ee315f Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sat, 28 Feb 2015 11:09:46 +0800 Subject: [PATCH 08/11] [YoutubeDL] Eliminate implicit global states Note: it is previously used for the support of multiple proxies. Now opener_name should be specified for each download request. --- youtube_dl/YoutubeDL.py | 18 ++++++++---------- youtube_dl/extractor/common.py | 20 ++++++++++---------- youtube_dl/extractor/letv.py | 6 +----- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index fb789a8a2..f4db67fae 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -278,6 +278,7 @@ class YoutubeDL(object): self._screen_file = [sys.stdout, sys.stderr][params.get('logtostderr', False)] self._err_file = sys.stderr self._openers_pool = {} + self.DEFAULT_OPENER_NAME = 'default' self.params = params self.cache = Cache(self) @@ -1642,7 +1643,7 @@ class YoutubeDL(object): [[lang, ', '.join(f['ext'] for f in reversed(formats))] for lang, formats in subtitles.items()])) - def urlopen(self, req): + def urlopen(self, req, opener_name=None): """ Start an HTTP download """ # According to RFC 3986, URLs can not contain non-ASCII characters, however this is not @@ -1664,7 +1665,12 @@ class YoutubeDL(object): url_escaped, data=req.data, headers=req.headers, origin_req_host=req.origin_req_host, unverifiable=req.unverifiable) - return self._opener.open(req, timeout=self._socket_timeout) + if not opener_name: + opener_name = self.DEFAULT_OPENER_NAME + if opener_name not in self._openers_pool: + raise Exception('Invalid opener name "%s"' % compat_str(opener_name)) + + return self._openers_pool[opener_name].open(req, timeout=self._socket_timeout) def print_debug_header(self): if not self.params.get('verbose'): @@ -1762,8 +1768,6 @@ class YoutubeDL(object): self._setup_single_opener('default', default_proxy, https_handler, ydlh) self._setup_single_opener('alternative', alternative_proxy, https_handler, ydlh) - self.use_opener('default') - def _setup_single_opener(self, opener_name, opts_proxy, https_handler, ydlh): cookie_processor = compat_urllib_request.HTTPCookieProcessor( self.cookiejar) @@ -1787,12 +1791,6 @@ class YoutubeDL(object): opener.addheaders = [] self._openers_pool[opener_name] = opener - def use_opener(self, opener_name): - if opener_name in self._openers_pool: - self._opener = self._openers_pool[opener_name] - else: - raise Exception('Invalid opener name ' + opener_name) - def encode(self, s): if isinstance(s, bytes): return s # Already encoded diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 1ff38910e..61da1fda3 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -301,7 +301,7 @@ class InfoExtractor(object): def IE_NAME(self): return type(self).__name__[:-2] - def _request_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True): + def _request_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True, opener_name=None): """ Returns the response handle """ if note is None: self.report_download_webpage(video_id) @@ -311,7 +311,7 @@ class InfoExtractor(object): else: self.to_screen('%s: %s' % (video_id, note)) try: - return self._downloader.urlopen(url_or_request) + return self._downloader.urlopen(url_or_request, opener_name=opener_name) except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: if errnote is False: return False @@ -324,13 +324,13 @@ class InfoExtractor(object): self._downloader.report_warning(errmsg) return False - def _download_webpage_handle(self, url_or_request, video_id, note=None, errnote=None, fatal=True): + def _download_webpage_handle(self, url_or_request, video_id, note=None, errnote=None, fatal=True, opener_name=None): """ Returns a tuple (page content as string, URL handle) """ # Strip hashes from the URL (#1038) if isinstance(url_or_request, (compat_str, str)): url_or_request = url_or_request.partition('#')[0] - urlh = self._request_webpage(url_or_request, video_id, note, errnote, fatal) + urlh = self._request_webpage(url_or_request, video_id, note, errnote, fatal, opener_name=opener_name) if urlh is False: assert not fatal return False @@ -410,13 +410,13 @@ class InfoExtractor(object): return content - def _download_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True, tries=1, timeout=5): + def _download_webpage(self, url_or_request, video_id, note=None, errnote=None, fatal=True, tries=1, timeout=5, opener_name=None): """ Returns the data of the page as a string """ success = False try_count = 0 while success is False: try: - res = self._download_webpage_handle(url_or_request, video_id, note, errnote, fatal) + res = self._download_webpage_handle(url_or_request, video_id, note, errnote, fatal, opener_name=opener_name) success = True except compat_http_client.IncompleteRead as e: try_count += 1 @@ -431,10 +431,10 @@ class InfoExtractor(object): def _download_xml(self, url_or_request, video_id, note='Downloading XML', errnote='Unable to download XML', - transform_source=None, fatal=True): + transform_source=None, fatal=True, opener_name=None): """Return the xml as an xml.etree.ElementTree.Element""" xml_string = self._download_webpage( - url_or_request, video_id, note, errnote, fatal=fatal) + url_or_request, video_id, note, errnote, fatal=fatal, opener_name=opener_name) if xml_string is False: return xml_string if transform_source: @@ -445,9 +445,9 @@ class InfoExtractor(object): note='Downloading JSON metadata', errnote='Unable to download JSON metadata', transform_source=None, - fatal=True): + fatal=True, opener_name=None): json_string = self._download_webpage( - url_or_request, video_id, note, errnote, fatal=fatal) + url_or_request, video_id, note, errnote, fatal=fatal, opener_name=opener_name) if (not fatal) and json_string is False: return None return self._parse_json( diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index 21b3ba43c..d9846fda8 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -92,13 +92,9 @@ class LetvIE(InfoExtractor): 'domain': 'www.letv.com' } - self._use_opener('alternative') - play_json = self._download_json( 'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params), - media_id, 'playJson data') - - self._use_opener('default') + media_id, 'playJson data', opener_name='alternative') # Check for errors playstatus = play_json['playstatus'] From 3981ef4c2a7846217695261a64a0277f037ee447 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sun, 1 Mar 2015 18:54:10 +0800 Subject: [PATCH 09/11] [YoutubeDL] Rename alternative proxy to China verification proxy Documentations are updated as well to make the purpose of the new option more clear --- youtube_dl/YoutubeDL.py | 11 ++++++----- youtube_dl/extractor/letv.py | 4 ++-- youtube_dl/options.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index f4db67fae..7b5dca1b1 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -1721,7 +1721,7 @@ class YoutubeDL(object): self._write_string('[debug] exe versions: %s\n' % exe_str) self.dump_proxy_map('default', 'Proxy map') - self.dump_proxy_map('alternative', 'Alternative proxy map') + self.dump_proxy_map('cn_verification', 'China IP verification proxy map') if self.params.get('call_home', False): ipaddr = self.urlopen('https://yt-dl.org/ip').read().decode('utf-8') @@ -1761,12 +1761,13 @@ class YoutubeDL(object): ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel) default_proxy = self.params.get('proxy') - alternative_proxy = self.params.get('alternative_proxy') - if not alternative_proxy: - alternative_proxy = default_proxy + cn_verification_proxy = self.params.get('cn_verification_proxy') + + if not cn_verification_proxy: + cn_verification_proxy = default_proxy self._setup_single_opener('default', default_proxy, https_handler, ydlh) - self._setup_single_opener('alternative', alternative_proxy, https_handler, ydlh) + self._setup_single_opener('cn_verification', cn_verification_proxy, https_handler, ydlh) def _setup_single_opener(self, opener_name, opts_proxy, https_handler, ydlh): cookie_processor = compat_urllib_request.HTTPCookieProcessor( diff --git a/youtube_dl/extractor/letv.py b/youtube_dl/extractor/letv.py index d9846fda8..bd961b3c7 100644 --- a/youtube_dl/extractor/letv.py +++ b/youtube_dl/extractor/letv.py @@ -57,7 +57,7 @@ class LetvIE(InfoExtractor): 'publish time' ], 'params': { - 'alternative_proxy': 'proxy.uku.im:8888' + 'cn_verification_proxy': 'proxy.uku.im:8888' } }] @@ -94,7 +94,7 @@ class LetvIE(InfoExtractor): play_json = self._download_json( 'http://api.letv.com/mms/out/video/playJson?' + compat_urllib_parse.urlencode(params), - media_id, 'playJson data', opener_name='alternative') + media_id, 'playJson data', opener_name='cn_verification') # Check for errors playstatus = play_json['playstatus'] diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 8cfa7ec7c..1df9654e0 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -177,9 +177,9 @@ def parseOpts(overrideArguments=None): default=None, metavar='URL', help='Use the specified HTTP/HTTPS proxy. Pass in an empty string (--proxy "") for direct connection') network.add_option( - '--alternative-proxy', dest='alternative_proxy', + '--cn-verification-proxy', dest='cn_verification_proxy', default=None, metavar='URL', - help='Use the specified HTTP/HTTPS address as the alternative proxy. Pass in an empty string (--alternative-proxy "") for direct connection' + help='The proxy used in the China IP verification step. The default proxy specified by --proxy is used if this option is not given' ) network.add_option( '--socket-timeout', From 93a81b99f8a83a4528b88fcd8ccbb519fc167fc2 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sun, 1 Mar 2015 23:15:29 +0800 Subject: [PATCH 10/11] [YoutubeDL] Update help texts for --cn-verification-proxy again --- youtube_dl/options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 1df9654e0..b9ea3cb2e 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -179,7 +179,7 @@ def parseOpts(overrideArguments=None): network.add_option( '--cn-verification-proxy', dest='cn_verification_proxy', default=None, metavar='URL', - help='The proxy used in the China IP verification step. The default proxy specified by --proxy is used if this option is not given' + help='The proxy used in the China IP verification step of information extraction. The default proxy specified by --proxy is used if this option is not given' ) network.add_option( '--socket-timeout', From e9d4f95fb27c6ac6c740988ecad1afd6d73e6222 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Mon, 2 Mar 2015 00:24:48 +0800 Subject: [PATCH 11/11] [YoutubeDL] A missing change to cn_verification_proxy --- youtube_dl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 781033a9a..a924e7a41 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -327,7 +327,7 @@ def _real_main(argv=None): 'nocheckcertificate': opts.no_check_certificate, 'prefer_insecure': opts.prefer_insecure, 'proxy': opts.proxy, - 'alternative_proxy': opts.alternative_proxy, + 'cn_verification_proxy': opts.cn_verification_proxy, 'socket_timeout': opts.socket_timeout, 'bidi_workaround': opts.bidi_workaround, 'debug_printtraffic': opts.debug_printtraffic,