aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-10-18 09:19:37 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-10-22 04:42:44 +0530
commitef58c47637625089cc7dc7326e7ce67a9c15f5e0 (patch)
tree7da667d518bb2ec8a0c6318dbdce51408ef75670
parent19b824f6939b0c13c6de1297faee2e70206ce6c4 (diff)
downloadhypervideo-pre-ef58c47637625089cc7dc7326e7ce67a9c15f5e0.tar.lz
hypervideo-pre-ef58c47637625089cc7dc7326e7ce67a9c15f5e0.tar.xz
hypervideo-pre-ef58c47637625089cc7dc7326e7ce67a9c15f5e0.zip
[SponsorBlock] Obey `extractor-retries` and `sleep-requests`
-rw-r--r--yt_dlp/postprocessor/sponsorblock.py33
1 files changed, 23 insertions, 10 deletions
diff --git a/yt_dlp/postprocessor/sponsorblock.py b/yt_dlp/postprocessor/sponsorblock.py
index 7265a9de7..70c5462d1 100644
--- a/yt_dlp/postprocessor/sponsorblock.py
+++ b/yt_dlp/postprocessor/sponsorblock.py
@@ -1,6 +1,8 @@
+from hashlib import sha256
+import itertools
import json
import re
-from hashlib import sha256
+import time
from .ffmpeg import FFmpegPostProcessor
from ..compat import compat_urllib_parse_urlencode, compat_HTTPError
@@ -33,6 +35,7 @@ class SponsorBlockPP(FFmpegPostProcessor):
self.to_screen(f'SponsorBlock is not supported for {extractor}')
return [], info
+ self.to_screen('Fetching SponsorBlock segments')
info['sponsorblock_chapters'] = self._get_sponsor_chapters(info, info['duration'])
return [], info
@@ -79,18 +82,28 @@ class SponsorBlockPP(FFmpegPostProcessor):
'service': service,
'categories': json.dumps(self._categories),
})
+ self.write_debug(f'SponsorBlock query: {url}')
for d in self._get_json(url):
if d['videoID'] == video_id:
return d['segments']
return []
def _get_json(self, url):
- self.write_debug(f'SponsorBlock query: {url}')
- try:
- rsp = self._downloader.urlopen(sanitized_Request(url))
- except network_exceptions as e:
- if isinstance(e, compat_HTTPError) and e.code == 404:
- return []
- raise PostProcessingError(f'Unable to communicate with SponsorBlock API - {e}')
-
- return json.loads(rsp.read().decode(rsp.info().get_param('charset') or 'utf-8'))
+ # While this is not an extractor, it behaves similar to one and
+ # so obey extractor_retries and sleep_interval_requests
+ max_retries = self.get_param('extractor_retries', 3)
+ sleep_interval = self.get_param('sleep_interval_requests') or 0
+ for retries in itertools.count():
+ try:
+ rsp = self._downloader.urlopen(sanitized_Request(url))
+ return json.loads(rsp.read().decode(rsp.info().get_param('charset') or 'utf-8'))
+ except network_exceptions as e:
+ if isinstance(e, compat_HTTPError) and e.code == 404:
+ return []
+ if retries < max_retries:
+ self.report_warning(f'{e}. Retrying...')
+ if sleep_interval > 0:
+ self.to_screen(f'Sleeping {sleep_interval} seconds ...')
+ time.sleep(sleep_interval)
+ continue
+ raise PostProcessingError(f'Unable to communicate with SponsorBlock API: {e}')