]> jfr.im git - yt-dlp.git/commitdiff
[extractor/redgifs] Refresh auth token for 401 (#5352)
authorKevin Wood <redacted>
Sun, 6 Nov 2022 17:45:45 +0000 (09:45 -0800)
committerGitHub <redacted>
Sun, 6 Nov 2022 17:45:45 +0000 (23:15 +0530)
Closes #5351
Authored by: endotronic, pukkandan

yt_dlp/extractor/redgifs.py

index 24ac9420e0e9ca2e7a2850ebb830e8f936144072..92d996ca648755c4bb18dc920397833198e9aad8 100644 (file)
@@ -1,4 +1,5 @@
 import functools
+import urllib
 
 from .common import InfoExtractor
 from ..compat import compat_parse_qs
@@ -72,14 +73,20 @@ def _fetch_oauth_token(self, video_id):
         self._API_HEADERS['authorization'] = f'Bearer {auth["token"]}'
 
     def _call_api(self, ep, video_id, *args, **kwargs):
-        if 'authorization' not in self._API_HEADERS:
-            self._fetch_oauth_token(video_id)
-        assert 'authorization' in self._API_HEADERS
-
-        headers = dict(self._API_HEADERS)
-        headers['x-customheader'] = f'https://www.redgifs.com/watch/{video_id}'
-        data = self._download_json(
-            f'https://api.redgifs.com/v2/{ep}', video_id, headers=headers, *args, **kwargs)
+        for attempt in range(2):
+            if 'authorization' not in self._API_HEADERS:
+                self._fetch_oauth_token(video_id)
+            try:
+                headers = dict(self._API_HEADERS)
+                headers['x-customheader'] = f'https://www.redgifs.com/watch/{video_id}'
+                data = self._download_json(
+                    f'https://api.redgifs.com/v2/{ep}', video_id, headers=headers, *args, **kwargs)
+                break
+            except ExtractorError as e:
+                if not attempt and isinstance(e.cause, urllib.error.HTTPError) and e.cause.code == 401:
+                    del self._API_HEADERS['authorization']  # refresh the token
+                raise
+
         if 'error' in data:
             raise ExtractorError(f'RedGifs said: {data["error"]}', expected=True, video_id=video_id)
         return data