[reddit] Fix 429 by generating a random reddit_session
Related: a76e2e0f88
, #1014, https://github.com/ytdl-org/youtube-dl/issues/29986
Original PR: https://github.com/ytdl-org/youtube-dl/pull/30017
Authored by: AjaxGb
This commit is contained in:
parent
80c03fa98f
commit
8e3fd7e034
1 changed files with 16 additions and 8 deletions
|
@ -1,5 +1,4 @@
|
||||||
from __future__ import unicode_literals
|
import random
|
||||||
|
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
|
@ -49,7 +48,7 @@ class RedditIE(InfoExtractor):
|
||||||
|
|
||||||
|
|
||||||
class RedditRIE(InfoExtractor):
|
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 = [{
|
_TESTS = [{
|
||||||
'url': 'https://www.reddit.com/r/videos/comments/6rrwyj/that_small_heart_attack/',
|
'url': 'https://www.reddit.com/r/videos/comments/6rrwyj/that_small_heart_attack/',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
|
@ -99,13 +98,22 @@ class RedditRIE(InfoExtractor):
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
@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):
|
def _real_extract(self, url):
|
||||||
slug, video_id = self._match_valid_url(url).group('slug', 'id')
|
subdomain, slug, video_id = self._match_valid_url(url).group('subdomain', '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']
|
|
||||||
|
|
||||||
|
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']
|
video_url = data['url']
|
||||||
|
|
||||||
# Avoid recursing into the same reddit URL
|
# Avoid recursing into the same reddit URL
|
||||||
|
|
Loading…
Reference in a new issue