1
0
Fork 0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2024-05-19 11:39:28 +00:00
This commit is contained in:
Justin Keogh 2024-02-22 07:39:36 -08:00 committed by GitHub
commit b26d3bbaea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2076,7 +2076,8 @@ def sanitize_open(filename, open_mode):
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
return (sys.stdout.buffer if hasattr(sys.stdout, 'buffer') else sys.stdout, filename)
stream = open(encodeFilename(filename), open_mode)
stream = locked_file(encodeFilename(filename), open_mode, block=False)
stream = stream.__enter__()
return (stream, filename)
except (IOError, OSError) as err:
if err.errno in (errno.EACCES,):
@ -2088,7 +2089,8 @@ def sanitize_open(filename, open_mode):
raise
else:
# An exception here should be caught in the caller
stream = open(encodeFilename(alt_filename), open_mode)
stream = locked_file(encodeFilename(filename), open_mode, block=False)
stream = stream.__enter__()
return (stream, alt_filename)
@ -3499,15 +3501,18 @@ else:
try:
import fcntl
def _lock_file(f, exclusive):
fcntl.flock(f, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH)
def _lock_file(f, exclusive, block):
if block:
fcntl.flock(f, fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH)
else:
fcntl.flock(f, fcntl.LOCK_EX|fcntl.LOCK_NB if exclusive else fcntl.LOCK_SH)
def _unlock_file(f):
fcntl.flock(f, fcntl.LOCK_UN)
except ImportError:
UNSUPPORTED_MSG = 'file locking is not supported on this platform'
def _lock_file(f, exclusive):
def _lock_file(f, exclusive, block):
raise IOError(UNSUPPORTED_MSG)
def _unlock_file(f):
@ -3515,15 +3520,16 @@ else:
class locked_file(object):
def __init__(self, filename, mode, encoding=None):
assert mode in ['r', 'a', 'w']
def __init__(self, filename, mode, block=True, encoding=None):
assert mode in ['r', 'rb', 'a', 'ab', 'w', 'wb']
self.f = io.open(filename, mode, encoding=encoding)
self.mode = mode
self.block = block
def __enter__(self):
exclusive = self.mode != 'r'
exclusive = self.mode not in ['r', 'rb']
try:
_lock_file(self.f, exclusive)
_lock_file(self.f, exclusive, self.block)
except IOError:
self.f.close()
raise
@ -3544,6 +3550,11 @@ class locked_file(object):
def read(self, *args):
return self.f.read(*args)
def flush(self, *args):
self.f.flush()
def close(self, *args):
self.__exit__(self, *args, value=False, traceback=False)
def get_filesystem_encoding():
encoding = sys.getfilesystemencoding()