mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 05:37:07 -05:00 
			
		
		
		
	Merge branch 'cn-verification-proxy'
This commit is contained in:
		@@ -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,13 +1765,14 @@ 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)
 | 
			
		||||
        ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel)
 | 
			
		||||
        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
 | 
			
		||||
        # cases where our custom HTTP handler doesn't come into play
 | 
			
		||||
        # (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,
 | 
			
		||||
        '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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -39,12 +40,20 @@ class LetvIE(InfoExtractor):
 | 
			
		||||
            'title': '美人天下01',
 | 
			
		||||
            '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
 | 
			
		||||
    def urshift(val, n):
 | 
			
		||||
@@ -76,8 +85,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 +129,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 +139,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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -1768,3 +1768,24 @@ 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 __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