diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index 61e7a66a7..7f16cd251 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -61,6 +61,52 @@ def download_subtitle(path, language, hi, providers, providers_auth, sceneName, language_hook=None """ + """ + throttle_callback: + + VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled) + + PROVIDER_THROTTLE_MAP = { + "default": { + TooManyRequests: (datetime.timedelta(hours=1), "1 hour"), + DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), + ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), + APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), + }, + "opensubtitles": { + TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), + DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), + APIThrottled: (datetime.timedelta(seconds=15), "15 seconds"), + }, + "addic7ed": { + DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), + TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), + } + } + + throttle_callback gist: + def provider_throttle(self, name, exception): + cls = getattr(exception, "__class__") + cls_name = getattr(cls, "__name__") + if cls not in VALID_THROTTLE_EXCEPTIONS: + for valid_cls in VALID_THROTTLE_EXCEPTIONS: + if isinstance(cls, valid_cls): + cls = valid_cls + + throttle_data = PROVIDER_THROTTLE_MAP.get(name, PROVIDER_THROTTLE_MAP["default"]).get(cls, None) or \ + PROVIDER_THROTTLE_MAP["default"].get(cls, None) + + if not throttle_data: + return + + throttle_delta, throttle_description = throttle_data + throttle_until = datetime.datetime.now() + throttle_delta + + # save throttle_until together with provider name somewhere, then implement dynamic provider_list based on + # that + + """ + try: if sceneName == "None" or use_scenename is False: used_sceneName = False