mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-10-02 13:04:54 +00:00
[cleanup] Misc fixes and cleanup
Closes #3780, Closes #3853, Closes #3850
This commit is contained in:
@@ -619,9 +619,9 @@ def sanitize_open(filename, open_mode):
|
||||
# Ref: https://github.com/yt-dlp/yt-dlp/issues/3124
|
||||
raise LockingUnsupportedError()
|
||||
stream = locked_file(filename, open_mode, block=False).__enter__()
|
||||
except LockingUnsupportedError:
|
||||
except OSError:
|
||||
stream = open(filename, open_mode)
|
||||
return (stream, filename)
|
||||
return stream, filename
|
||||
except OSError as err:
|
||||
if attempt or err.errno in (errno.EACCES,):
|
||||
raise
|
||||
@@ -815,12 +815,9 @@ def escapeHTML(text):
|
||||
|
||||
|
||||
def process_communicate_or_kill(p, *args, **kwargs):
|
||||
try:
|
||||
return p.communicate(*args, **kwargs)
|
||||
except BaseException: # Including KeyboardInterrupt
|
||||
p.kill()
|
||||
p.wait()
|
||||
raise
|
||||
write_string('DeprecationWarning: yt_dlp.utils.process_communicate_or_kill is deprecated '
|
||||
'and may be removed in a future version. Use yt_dlp.utils.Popen.communicate_or_kill instead')
|
||||
return Popen.communicate_or_kill(p, *args, **kwargs)
|
||||
|
||||
|
||||
class Popen(subprocess.Popen):
|
||||
@@ -834,7 +831,12 @@ class Popen(subprocess.Popen):
|
||||
super().__init__(*args, **kwargs, startupinfo=self._startupinfo)
|
||||
|
||||
def communicate_or_kill(self, *args, **kwargs):
|
||||
return process_communicate_or_kill(self, *args, **kwargs)
|
||||
try:
|
||||
return self.communicate(*args, **kwargs)
|
||||
except BaseException: # Including KeyboardInterrupt
|
||||
self.kill()
|
||||
self.wait()
|
||||
raise
|
||||
|
||||
|
||||
def get_subprocess_encoding():
|
||||
@@ -921,22 +923,23 @@ def make_HTTPS_handler(params, **kwargs):
|
||||
context.options |= 4 # SSL_OP_LEGACY_SERVER_CONNECT
|
||||
# Allow use of weaker ciphers in Python 3.10+. See https://bugs.python.org/issue43998
|
||||
context.set_ciphers('DEFAULT')
|
||||
|
||||
context.verify_mode = ssl.CERT_REQUIRED if opts_check_certificate else ssl.CERT_NONE
|
||||
if opts_check_certificate:
|
||||
if has_certifi and 'no-certifi' not in params.get('compat_opts', []):
|
||||
context.load_verify_locations(cafile=certifi.where())
|
||||
else:
|
||||
try:
|
||||
context.load_default_certs()
|
||||
# Work around the issue in load_default_certs when there are bad certificates. See:
|
||||
# https://github.com/yt-dlp/yt-dlp/issues/1060,
|
||||
# https://bugs.python.org/issue35665, https://bugs.python.org/issue45312
|
||||
except ssl.SSLError:
|
||||
# enum_certificates is not present in mingw python. See https://github.com/yt-dlp/yt-dlp/issues/1151
|
||||
if sys.platform == 'win32' and hasattr(ssl, 'enum_certificates'):
|
||||
for storename in ('CA', 'ROOT'):
|
||||
_ssl_load_windows_store_certs(context, storename)
|
||||
context.set_default_verify_paths()
|
||||
try:
|
||||
context.load_default_certs()
|
||||
# Work around the issue in load_default_certs when there are bad certificates. See:
|
||||
# https://github.com/yt-dlp/yt-dlp/issues/1060,
|
||||
# https://bugs.python.org/issue35665, https://bugs.python.org/issue45312
|
||||
except ssl.SSLError:
|
||||
# enum_certificates is not present in mingw python. See https://github.com/yt-dlp/yt-dlp/issues/1151
|
||||
if sys.platform == 'win32' and hasattr(ssl, 'enum_certificates'):
|
||||
for storename in ('CA', 'ROOT'):
|
||||
_ssl_load_windows_store_certs(context, storename)
|
||||
context.set_default_verify_paths()
|
||||
|
||||
client_certfile = params.get('client_certificate')
|
||||
if client_certfile:
|
||||
try:
|
||||
@@ -1885,11 +1888,11 @@ def platform_name():
|
||||
|
||||
@functools.cache
|
||||
def get_windows_version():
|
||||
''' Get Windows version. None if it's not running on Windows '''
|
||||
''' Get Windows version. returns () if it's not running on Windows '''
|
||||
if compat_os_name == 'nt':
|
||||
return version_tuple(platform.win32_ver()[1])
|
||||
else:
|
||||
return None
|
||||
return ()
|
||||
|
||||
|
||||
def write_string(s, out=None, encoding=None):
|
||||
@@ -1899,14 +1902,14 @@ def write_string(s, out=None, encoding=None):
|
||||
if compat_os_name == 'nt' and supports_terminal_sequences(out):
|
||||
s = re.sub(r'([\r\n]+)', r' \1', s)
|
||||
|
||||
enc = None
|
||||
enc, buffer = None, out
|
||||
if 'b' in getattr(out, 'mode', ''):
|
||||
enc = encoding or preferredencoding()
|
||||
elif hasattr(out, 'buffer'):
|
||||
out = out.buffer
|
||||
buffer = out.buffer
|
||||
enc = encoding or getattr(out, 'encoding', None) or preferredencoding()
|
||||
|
||||
out.write(s.encode(enc, 'ignore') if enc else s)
|
||||
buffer.write(s.encode(enc, 'ignore') if enc else s)
|
||||
out.flush()
|
||||
|
||||
|
||||
@@ -1925,7 +1928,7 @@ def intlist_to_bytes(xs):
|
||||
return compat_struct_pack('%dB' % len(xs), *xs)
|
||||
|
||||
|
||||
class LockingUnsupportedError(IOError):
|
||||
class LockingUnsupportedError(OSError):
|
||||
msg = 'File locking is not supported on this platform'
|
||||
|
||||
def __init__(self):
|
||||
@@ -5089,7 +5092,7 @@ WINDOWS_VT_MODE = False if compat_os_name == 'nt' else None
|
||||
@functools.cache
|
||||
def supports_terminal_sequences(stream):
|
||||
if compat_os_name == 'nt':
|
||||
if not WINDOWS_VT_MODE or get_windows_version() < (10, 0, 10586):
|
||||
if not WINDOWS_VT_MODE:
|
||||
return False
|
||||
elif not os.getenv('TERM'):
|
||||
return False
|
||||
@@ -5100,7 +5103,7 @@ def supports_terminal_sequences(stream):
|
||||
|
||||
|
||||
def windows_enable_vt_mode(): # TODO: Do this the proper way https://bugs.python.org/issue30075
|
||||
if compat_os_name != 'nt':
|
||||
if get_windows_version() < (10, 0, 10586):
|
||||
return
|
||||
global WINDOWS_VT_MODE
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
|
Reference in New Issue
Block a user