Compare commits

...

6 Commits

Author SHA1 Message Date
Paul Storkman
ba8994039a
Merge 716972da6b into 52c0ffe40a 2024-11-17 00:53:18 +01:00
Paul Storkman
716972da6b Formatting mistake 2024-10-31 14:31:23 +01:00
Paul Storkman
5c4df56d6d Start counting from zero. 2024-10-31 14:10:47 +01:00
Paul Storkman
9438d15dff Just return nothing on max retries, same as with extractor errors 2024-10-30 13:55:26 +01:00
Paul Storkman
87ad4d4774 Fix quotes 2024-10-29 16:02:57 +01:00
Paul Storkman
c6cc3a8ab2 Add option --wait-retries 2024-10-29 14:25:52 +01:00
4 changed files with 19 additions and 0 deletions

View File

@ -355,6 +355,10 @@ If you fork the project on GitHub, you can run your fork's [build workflow](.git
available. Pass the minimum number of available. Pass the minimum number of
seconds (or range) to wait between retries seconds (or range) to wait between retries
--no-wait-for-video Do not wait for scheduled streams (default) --no-wait-for-video Do not wait for scheduled streams (default)
--wait-retries RETRIES Number of retries while waiting for
scheduled streams to become available
(default is infinite). --wait-for-video must
also be set
--mark-watched Mark videos watched (even with --simulate) --mark-watched Mark videos watched (even with --simulate)
--no-mark-watched Do not mark videos watched (default) --no-mark-watched Do not mark videos watched (default)
--color [STREAM:]POLICY Whether to emit color codes in output, --color [STREAM:]POLICY Whether to emit color codes in output,

View File

@ -1619,17 +1619,26 @@ class YoutubeDL:
def _handle_extraction_exceptions(func): def _handle_extraction_exceptions(func):
@functools.wraps(func) @functools.wraps(func)
def wrapper(self, *args, **kwargs): def wrapper(self, *args, **kwargs):
wait_retries = 0
max_wait_retries = self.params.get('wait_retries')
while True: while True:
try: try:
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
except (CookieLoadError, DownloadCancelled, LazyList.IndexError, PagedList.IndexError): except (CookieLoadError, DownloadCancelled, LazyList.IndexError, PagedList.IndexError):
raise raise
except ReExtractInfo as e: except ReExtractInfo as e:
if wait_retries >= max_wait_retries:
if max_wait_retries > 0:
self.report_error(f'Giving up after {wait_retries} {"retries" if wait_retries > 1 else "retry"} while waiting.')
else:
self.report_error('Video is still unavailable after waiting.')
return
if e.expected: if e.expected:
self.to_screen(f'{e}; Re-extracting data') self.to_screen(f'{e}; Re-extracting data')
else: else:
self.to_stderr('\r') self.to_stderr('\r')
self.report_warning(f'{e}; Re-extracting data') self.report_warning(f'{e}; Re-extracting data')
wait_retries += 1
continue continue
except GeoRestrictedError as e: except GeoRestrictedError as e:
msg = e.msg msg = e.msg

View File

@ -267,6 +267,7 @@ def validate_options(opts):
opts.retries = parse_retries('download', opts.retries) opts.retries = parse_retries('download', opts.retries)
opts.fragment_retries = parse_retries('fragment', opts.fragment_retries) opts.fragment_retries = parse_retries('fragment', opts.fragment_retries)
opts.wait_retries = parse_retries('waiting', opts.wait_retries)
opts.extractor_retries = parse_retries('extractor', opts.extractor_retries) opts.extractor_retries = parse_retries('extractor', opts.extractor_retries)
opts.file_access_retries = parse_retries('file access', opts.file_access_retries) opts.file_access_retries = parse_retries('file access', opts.file_access_retries)
@ -927,6 +928,7 @@ def parse_options(argv=None):
'extract_flat': opts.extract_flat, 'extract_flat': opts.extract_flat,
'live_from_start': opts.live_from_start, 'live_from_start': opts.live_from_start,
'wait_for_video': opts.wait_for_video, 'wait_for_video': opts.wait_for_video,
'wait_retries': opts.wait_retries,
'mark_watched': opts.mark_watched, 'mark_watched': opts.mark_watched,
'merge_output_format': opts.merge_output_format, 'merge_output_format': opts.merge_output_format,
'final_ext': final_ext, 'final_ext': final_ext,

View File

@ -442,6 +442,10 @@ def create_parser():
'--no-wait-for-video', '--no-wait-for-video',
dest='wait_for_video', action='store_const', const=None, dest='wait_for_video', action='store_const', const=None,
help='Do not wait for scheduled streams (default)') help='Do not wait for scheduled streams (default)')
general.add_option(
'--wait-retries',
dest='wait_retries', metavar='RETRIES', default='infinite',
help='Number of retries while waiting for scheduled streams to become available (default is %default). --wait-for-video must also be set')
general.add_option( general.add_option(
'--mark-watched', '--mark-watched',
action='store_true', dest='mark_watched', default=False, action='store_true', dest='mark_watched', default=False,