[dl] improve maximum 'rate' detection (#7638)

This commit is contained in:
Mike Fährmann
2025-06-09 12:15:39 +02:00
parent 5f41ac4257
commit 7a48b696a6
3 changed files with 9 additions and 9 deletions

View File

@@ -69,11 +69,11 @@ class HttpDownloader(DownloaderBase):
self.chunk_size = chunk_size self.chunk_size = chunk_size
if self.rate: if self.rate:
func = util.build_selection_func(self.rate, 0, text.parse_bytes) func = util.build_selection_func(self.rate, 0, text.parse_bytes)
value = func() rmax = func.args[1] if hasattr(func, "args") else func()
if value: if rmax:
# wrong when func() returns from a range if rmax < self.chunk_size:
if value < self.chunk_size: # reduce chunk_size to allow for one iteration each second
self.chunk_size = value self.chunk_size = rmax
self.rate = func self.rate = func
self.receive = self._receive_rate self.receive = self._receive_rate
else: else:

View File

@@ -906,18 +906,17 @@ def build_selection_func(value, min=0.0, conv=float):
if isinstance(value, str): if isinstance(value, str):
lower, _, upper = value.partition("-") lower, _, upper = value.partition("-")
lower = conv(lower)
else: else:
try: try:
lower, upper = value lower, upper = value
except TypeError: except TypeError:
lower, upper = value, None lower, upper = value, None
lower = conv(lower) lower = conv(lower)
if upper: if upper:
upper = conv(upper) upper = conv(upper)
return functools.partial( return functools.partial(
random.uniform if min.__class__ is float else random.randint, random.uniform if lower.__class__ is float else random.randint,
lower if lower > min else min, lower if lower > min else min,
upper if upper > min else min, upper if upper > min else min,
) )

View File

@@ -54,7 +54,8 @@ def construct_YoutubeDL(module, obj, user_opts, system_opts=None):
rate = config("rate") rate = config("rate")
if rate: if rate:
func = util.build_selection_func(rate, 0, text.parse_bytes) func = util.build_selection_func(rate, 0, text.parse_bytes)
opts["ratelimit"] = func() or None rmax = func.args[1] if hasattr(func, "args") else func()
opts["ratelimit"] = rmax or None
else: else:
opts["ratelimit"] = None opts["ratelimit"] = None
if opts.get("min_filesize") is None: if opts.get("min_filesize") is None: