From 38d79fd16c741ae9e460bc5adbbdb9972347b6be Mon Sep 17 00:00:00 2001 From: pukkandan Date: Mon, 6 Dec 2021 23:30:33 +0530 Subject: [PATCH] Use `parse_duration` for `--wait-for-video` and some minor fix --- yt_dlp/YoutubeDL.py | 4 ++-- yt_dlp/__init__.py | 9 ++++----- yt_dlp/utils.py | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 2270986566..57b36b0505 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -1371,11 +1371,11 @@ class YoutubeDL(object): min_wait, max_wait = self.params.get('wait_for_video') diff = try_get(ie_result, lambda x: x['release_timestamp'] - time.time()) if diff is None and ie_result.get('live_status') == 'is_upcoming': - diff = random.randrange(min_wait or 0, max_wait) if max_wait else min_wait + diff = random.randrange(min_wait, max_wait) if (max_wait and min_wait) else (max_wait or min_wait) self.report_warning('Release time of video is not known') elif (diff or 0) <= 0: self.report_warning('Video should already be available according to extracted info') - diff = min(max(diff, min_wait or 0), max_wait or float('inf')) + diff = min(max(diff or 0, min_wait or 0), max_wait or float('inf')) self.to_screen(f'[wait] Waiting for {format_dur(diff)} - Press Ctrl+C to try now') wait_till = time.time() + diff diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 5d20ad8c31..3dccdb186f 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -197,12 +197,11 @@ def _real_main(argv=None): if opts.concurrent_fragment_downloads <= 0: parser.error('Concurrent fragments must be positive') if opts.wait_for_video is not None: - mobj = re.match(r'(?P\d+)(?:-(?P\d+))?$', opts.wait_for_video) - if not mobj: - parser.error('Invalid time range to wait') - min_wait, max_wait = map(int_or_none, mobj.group('min', 'max')) - if max_wait is not None and max_wait < min_wait: + min_wait, max_wait, *_ = map(parse_duration, opts.wait_for_video.split('-', 1) + [None]) + if min_wait is None or (max_wait is None and '-' in opts.wait_for_video): parser.error('Invalid time range to wait') + elif max_wait is not None and max_wait < min_wait: + parser.error('Minimum time range to wait must not be longer than the maximum') opts.wait_for_video = (min_wait, max_wait) def parse_retries(retries, name=''): diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index 7ac7a106bd..6831f0773d 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -3972,8 +3972,9 @@ def strftime_or_none(timestamp, date_format, default=None): def parse_duration(s): if not isinstance(s, compat_basestring): return None - s = s.strip() + if not s: + return None days, hours, mins, secs, ms = [None] * 5 m = re.match(r'(?:(?:(?:(?P[0-9]+):)?(?P[0-9]+):)?(?P[0-9]+):)?(?P[0-9]+)(?P\.[0-9]+)?Z?$', s)