aboutsummaryrefslogtreecommitdiff
path: root/yt_dlp/extractor/patreon.py
diff options
context:
space:
mode:
Diffstat (limited to 'yt_dlp/extractor/patreon.py')
-rw-r--r--yt_dlp/extractor/patreon.py17
1 files changed, 12 insertions, 5 deletions
diff --git a/yt_dlp/extractor/patreon.py b/yt_dlp/extractor/patreon.py
index 26ca84ab3..5dc46e317 100644
--- a/yt_dlp/extractor/patreon.py
+++ b/yt_dlp/extractor/patreon.py
@@ -2,6 +2,7 @@ import itertools
import urllib.parse
from .common import InfoExtractor
+from .sproutvideo import VidsIoIE
from .vimeo import VimeoIE
from ..networking.exceptions import HTTPError
from ..utils import (
@@ -12,6 +13,7 @@ from ..utils import (
int_or_none,
mimetype2ext,
parse_iso8601,
+ smuggle_url,
str_or_none,
traverse_obj,
url_or_none,
@@ -305,22 +307,27 @@ class PatreonIE(PatreonBaseIE):
'channel_follower_count': ('attributes', 'patron_count', {int_or_none}),
}))
+ # all-lowercase 'referer' so we can smuggle it to Generic, SproutVideo, Vimeo
+ headers = {'referer': 'https://patreon.com/'}
+
# handle Vimeo embeds
if traverse_obj(attributes, ('embed', 'provider')) == 'Vimeo':
v_url = urllib.parse.unquote(self._html_search_regex(
r'(https(?:%3A%2F%2F|://)player\.vimeo\.com.+app_id(?:=|%3D)+\d+)',
traverse_obj(attributes, ('embed', 'html', {str})), 'vimeo url', fatal=False) or '')
if url_or_none(v_url) and self._request_webpage(
- v_url, video_id, 'Checking Vimeo embed URL',
- headers={'Referer': 'https://patreon.com/'},
- fatal=False, errnote=False):
+ v_url, video_id, 'Checking Vimeo embed URL', headers=headers, fatal=False, errnote=False):
entries.append(self.url_result(
VimeoIE._smuggle_referrer(v_url, 'https://patreon.com/'),
VimeoIE, url_transparent=True))
embed_url = traverse_obj(attributes, ('embed', 'url', {url_or_none}))
- if embed_url and self._request_webpage(embed_url, video_id, 'Checking embed URL', fatal=False, errnote=False):
- entries.append(self.url_result(embed_url))
+ if embed_url and (urlh := self._request_webpage(
+ embed_url, video_id, 'Checking embed URL', headers=headers,
+ fatal=False, errnote=False, expected_status=403)):
+ # Password-protected vids.io embeds return 403 errors w/o --video-password or session cookie
+ if urlh.status != 403 or VidsIoIE.suitable(embed_url):
+ entries.append(self.url_result(smuggle_url(embed_url, headers)))
post_file = traverse_obj(attributes, ('post_file', {dict}))
if post_file: