[core] Deprecate internal `Youtubedl-no-compression` header (#6876)

Authored by: coletdjnz
pull/2175/merge
coletdjnz 1 year ago committed by GitHub
parent 69bec6730e
commit 955c89584b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2380,7 +2380,9 @@ class YoutubeDL:
def _calc_headers(self, info_dict): def _calc_headers(self, info_dict):
res = merge_headers(self.params['http_headers'], info_dict.get('http_headers') or {}) res = merge_headers(self.params['http_headers'], info_dict.get('http_headers') or {})
if 'Youtubedl-No-Compression' in res: # deprecated
res.pop('Youtubedl-No-Compression', None)
res['Accept-Encoding'] = 'identity'
cookies = self._calc_cookies(info_dict['url']) cookies = self._calc_cookies(info_dict['url'])
if cookies: if cookies:
res['Cookie'] = cookies res['Cookie'] = cookies

@ -23,7 +23,6 @@ from ..utils import (
encodeArgument, encodeArgument,
encodeFilename, encodeFilename,
find_available_port, find_available_port,
handle_youtubedl_headers,
remove_end, remove_end,
sanitized_Request, sanitized_Request,
traverse_obj, traverse_obj,
@ -529,10 +528,9 @@ class FFmpegFD(ExternalFD):
selected_formats = info_dict.get('requested_formats') or [info_dict] selected_formats = info_dict.get('requested_formats') or [info_dict]
for i, fmt in enumerate(selected_formats): for i, fmt in enumerate(selected_formats):
if fmt.get('http_headers') and re.match(r'^https?://', fmt['url']): if fmt.get('http_headers') and re.match(r'^https?://', fmt['url']):
headers_dict = handle_youtubedl_headers(fmt['http_headers'])
# Trailing \r\n after each HTTP header is important to prevent warning from ffmpeg/avconv: # Trailing \r\n after each HTTP header is important to prevent warning from ffmpeg/avconv:
# [http @ 00000000003d2fa0] No trailing CRLF found in HTTP header. # [http @ 00000000003d2fa0] No trailing CRLF found in HTTP header.
args.extend(['-headers', ''.join(f'{key}: {val}\r\n' for key, val in headers_dict.items())]) args.extend(['-headers', ''.join(f'{key}: {val}\r\n' for key, val in fmt['http_headers'].items())])
if start_time: if start_time:
args += ['-ss', str(start_time)] args += ['-ss', str(start_time)]

@ -45,8 +45,8 @@ class HttpFD(FileDownloader):
ctx.tmpfilename = self.temp_name(filename) ctx.tmpfilename = self.temp_name(filename)
ctx.stream = None ctx.stream = None
# Do not include the Accept-Encoding header # Disable compression
headers = {'Youtubedl-no-compression': 'True'} headers = {'Accept-Encoding': 'identity'}
add_headers = info_dict.get('http_headers') add_headers = info_dict.get('http_headers')
if add_headers: if add_headers:
headers.update(add_headers) headers.update(add_headers)

@ -113,7 +113,7 @@ class LiTVIE(InfoExtractor):
entry_protocol='m3u8_native', m3u8_id='hls') entry_protocol='m3u8_native', m3u8_id='hls')
for a_format in formats: for a_format in formats:
# LiTV HLS segments doesn't like compressions # LiTV HLS segments doesn't like compressions
a_format.setdefault('http_headers', {})['Youtubedl-no-compression'] = True a_format.setdefault('http_headers', {})['Accept-Encoding'] = 'identity'
title = program_info['title'] + program_info.get('secondaryMark', '') title = program_info['title'] + program_info.get('secondaryMark', '')
description = program_info.get('description') description = program_info.get('description')

@ -161,3 +161,13 @@ def register_socks_protocols():
for scheme in ('socks', 'socks4', 'socks4a', 'socks5'): for scheme in ('socks', 'socks4', 'socks4a', 'socks5'):
if scheme not in urllib.parse.uses_netloc: if scheme not in urllib.parse.uses_netloc:
urllib.parse.uses_netloc.append(scheme) urllib.parse.uses_netloc.append(scheme)
def handle_youtubedl_headers(headers):
filtered_headers = headers
if 'Youtubedl-no-compression' in filtered_headers:
filtered_headers = {k: v for k, v in filtered_headers.items() if k.lower() != 'accept-encoding'}
del filtered_headers['Youtubedl-no-compression']
return filtered_headers

@ -1308,25 +1308,12 @@ def _create_http_connection(ydl_handler, http_class, is_https, *args, **kwargs):
return hc return hc
def handle_youtubedl_headers(headers):
filtered_headers = headers
if 'Youtubedl-no-compression' in filtered_headers:
filtered_headers = {k: v for k, v in filtered_headers.items() if k.lower() != 'accept-encoding'}
del filtered_headers['Youtubedl-no-compression']
return filtered_headers
class YoutubeDLHandler(urllib.request.HTTPHandler): class YoutubeDLHandler(urllib.request.HTTPHandler):
"""Handler for HTTP requests and responses. """Handler for HTTP requests and responses.
This class, when installed with an OpenerDirector, automatically adds This class, when installed with an OpenerDirector, automatically adds
the standard headers to every HTTP request and handles gzipped and the standard headers to every HTTP request and handles gzipped, deflated and
deflated responses from web servers. If compression is to be avoided in brotli responses from web servers.
a particular request, the original request in the program code only has
to include the HTTP header "Youtubedl-no-compression", which will be
removed before making the real request.
Part of this code was copied from: Part of this code was copied from:
@ -1389,11 +1376,13 @@ class YoutubeDLHandler(urllib.request.HTTPHandler):
if h.capitalize() not in req.headers: if h.capitalize() not in req.headers:
req.add_header(h, v) req.add_header(h, v)
if 'Youtubedl-no-compression' in req.headers: # deprecated
req.headers.pop('Youtubedl-no-compression', None)
req.add_header('Accept-encoding', 'identity')
if 'Accept-encoding' not in req.headers: if 'Accept-encoding' not in req.headers:
req.add_header('Accept-encoding', ', '.join(SUPPORTED_ENCODINGS)) req.add_header('Accept-encoding', ', '.join(SUPPORTED_ENCODINGS))
req.headers = handle_youtubedl_headers(req.headers)
return super().do_request_(req) return super().do_request_(req)
def http_response(self, req, resp): def http_response(self, req, resp):

Loading…
Cancel
Save