]> jfr.im git - yt-dlp.git/commitdiff
[reddit] Fix 429 by generating a random `reddit_session`
authorpukkandan <redacted>
Sun, 26 Sep 2021 14:30:56 +0000 (20:00 +0530)
committerpukkandan <redacted>
Wed, 29 Sep 2021 22:02:44 +0000 (03:32 +0530)
Related: a76e2e0f8898c06939b6a123fa863ab8876cfa20, #1014, https://github.com/ytdl-org/youtube-dl/issues/29986
Original PR: https://github.com/ytdl-org/youtube-dl/pull/30017
Authored by: AjaxGb

yt_dlp/extractor/reddit.py

index 14592bc62cdae6410b5c9e84c98977fca059a3b0..e5a1f692052113b387e88987febc34dae3b33ea9 100644 (file)
@@ -1,5 +1,4 @@
-from __future__ import unicode_literals
-
+import random
 
 from .common import InfoExtractor
 from ..utils import (
@@ -49,7 +48,7 @@ def _real_extract(self, url):
 
 
 class RedditRIE(InfoExtractor):
-    _VALID_URL = r'https?://(?:[^/]+\.)?reddit(?:media)?\.com/r/(?P<slug>[^/]+/comments/(?P<id>[^/?#&]+))'
+    _VALID_URL = r'https?://(?P<subdomain>[^/]+\.)?reddit(?:media)?\.com/r/(?P<slug>[^/]+/comments/(?P<id>[^/?#&]+))'
     _TESTS = [{
         'url': 'https://www.reddit.com/r/videos/comments/6rrwyj/that_small_heart_attack/',
         'info_dict': {
@@ -99,13 +98,22 @@ class RedditRIE(InfoExtractor):
         'only_matching': True,
     }]
 
-    def _real_extract(self, url):
-        slug, video_id = self._match_valid_url(url).group('slug', 'id')
-
-        self._set_cookie('reddit.com', '_options', '%7B%22pref_quarantine_optin%22%3A%20true%7D')
-        data = self._download_json(
-            f'https://old.reddit.com/r/{slug}/.json', video_id)[0]['data']['children'][0]['data']
+    @staticmethod
+    def _gen_session_id():
+        id_length = 16
+        rand_max = 1 << (id_length * 4)
+        return '%0.*x' % (id_length, random.randrange(rand_max))
 
+    def _real_extract(self, url):
+        subdomain, slug, video_id = self._match_valid_url(url).group('subdomain', 'slug', 'id')
+
+        self._set_cookie('.reddit.com', 'reddit_session', self._gen_session_id())
+        self._set_cookie('.reddit.com', '_options', '%7B%22pref_quarantine_optin%22%3A%20true%7D')
+        data = self._download_json(f'https://{subdomain}.reddit.com/r/{slug}/.json', video_id, fatal=False)
+        if not data:
+            # Fall back to old.reddit.com in case the requested subdomain fails
+            data = self._download_json(f'https://old.reddit.com/r/{slug}/.json', video_id)
+        data = data[0]['data']['children'][0]['data']
         video_url = data['url']
 
         # Avoid recursing into the same reddit URL