mirror of https://github.com/yt-dlp/yt-dlp.git
Merge branch 'cn-verification-proxy'
This commit is contained in:
commit
938c3f65b6
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue