[vimeo:review] Fix extraction for password-protected videos
Closes #9853
This commit is contained in:
parent
fee70322d7
commit
c1ff6e1ad0
|
@ -16,6 +16,7 @@ from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
InAdvancePagedList,
|
InAdvancePagedList,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
|
NO_DEFAULT,
|
||||||
RegexNotFoundError,
|
RegexNotFoundError,
|
||||||
sanitized_Request,
|
sanitized_Request,
|
||||||
smuggle_url,
|
smuggle_url,
|
||||||
|
@ -56,6 +57,26 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
||||||
self._set_vimeo_cookie('vuid', vuid)
|
self._set_vimeo_cookie('vuid', vuid)
|
||||||
self._download_webpage(login_request, None, False, 'Wrong login info')
|
self._download_webpage(login_request, None, False, 'Wrong login info')
|
||||||
|
|
||||||
|
def _verify_video_password(self, url, video_id, webpage):
|
||||||
|
password = self._downloader.params.get('videopassword')
|
||||||
|
if password is None:
|
||||||
|
raise ExtractorError('This video is protected by a password, use the --video-password option', expected=True)
|
||||||
|
token, vuid = self._extract_xsrft_and_vuid(webpage)
|
||||||
|
data = urlencode_postdata({
|
||||||
|
'password': password,
|
||||||
|
'token': token,
|
||||||
|
})
|
||||||
|
if url.startswith('http://'):
|
||||||
|
# vimeo only supports https now, but the user can give an http url
|
||||||
|
url = url.replace('http://', 'https://')
|
||||||
|
password_request = sanitized_Request(url + '/password', data)
|
||||||
|
password_request.add_header('Content-Type', 'application/x-www-form-urlencoded')
|
||||||
|
password_request.add_header('Referer', url)
|
||||||
|
self._set_vimeo_cookie('vuid', vuid)
|
||||||
|
return self._download_webpage(
|
||||||
|
password_request, video_id,
|
||||||
|
'Verifying the password', 'Wrong password')
|
||||||
|
|
||||||
def _extract_xsrft_and_vuid(self, webpage):
|
def _extract_xsrft_and_vuid(self, webpage):
|
||||||
xsrft = self._search_regex(
|
xsrft = self._search_regex(
|
||||||
r'(?:(?P<q1>["\'])xsrft(?P=q1)\s*:|xsrft\s*[=:])\s*(?P<q>["\'])(?P<xsrft>.+?)(?P=q)',
|
r'(?:(?P<q1>["\'])xsrft(?P=q1)\s*:|xsrft\s*[=:])\s*(?P<q>["\'])(?P<xsrft>.+?)(?P=q)',
|
||||||
|
@ -344,26 +365,6 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||||
if mobj:
|
if mobj:
|
||||||
return mobj.group(1)
|
return mobj.group(1)
|
||||||
|
|
||||||
def _verify_video_password(self, url, video_id, webpage):
|
|
||||||
password = self._downloader.params.get('videopassword')
|
|
||||||
if password is None:
|
|
||||||
raise ExtractorError('This video is protected by a password, use the --video-password option', expected=True)
|
|
||||||
token, vuid = self._extract_xsrft_and_vuid(webpage)
|
|
||||||
data = urlencode_postdata({
|
|
||||||
'password': password,
|
|
||||||
'token': token,
|
|
||||||
})
|
|
||||||
if url.startswith('http://'):
|
|
||||||
# vimeo only supports https now, but the user can give an http url
|
|
||||||
url = url.replace('http://', 'https://')
|
|
||||||
password_request = sanitized_Request(url + '/password', data)
|
|
||||||
password_request.add_header('Content-Type', 'application/x-www-form-urlencoded')
|
|
||||||
password_request.add_header('Referer', url)
|
|
||||||
self._set_vimeo_cookie('vuid', vuid)
|
|
||||||
return self._download_webpage(
|
|
||||||
password_request, video_id,
|
|
||||||
'Verifying the password', 'Wrong password')
|
|
||||||
|
|
||||||
def _verify_player_video_password(self, url, video_id):
|
def _verify_player_video_password(self, url, video_id):
|
||||||
password = self._downloader.params.get('videopassword')
|
password = self._downloader.params.get('videopassword')
|
||||||
if password is None:
|
if password is None:
|
||||||
|
@ -791,12 +792,39 @@ class VimeoReviewIE(VimeoBaseInfoExtractor):
|
||||||
'thumbnail': 're:^https?://.*\.jpg$',
|
'thumbnail': 're:^https?://.*\.jpg$',
|
||||||
'uploader_id': 'user22258446',
|
'uploader_id': 'user22258446',
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
'note': 'Password protected',
|
||||||
|
'url': 'https://vimeo.com/user37284429/review/138823582/c4d865efde',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '138823582',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'EFFICIENT PICKUP MASTERCLASS MODULE 1',
|
||||||
|
'uploader': 'TMB',
|
||||||
|
'uploader_id': 'user37284429',
|
||||||
|
},
|
||||||
|
'params': {
|
||||||
|
'videopassword': 'holygrail',
|
||||||
|
},
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
def _real_initialize(self):
|
||||||
|
self._login()
|
||||||
|
|
||||||
|
def _get_config_url(self, webpage_url, video_id, video_password_verified=False):
|
||||||
|
webpage = self._download_webpage(webpage_url, video_id)
|
||||||
|
config_url = self._html_search_regex(
|
||||||
|
r'data-config-url="([^"]+)"', webpage, 'config URL',
|
||||||
|
default=NO_DEFAULT if video_password_verified else None)
|
||||||
|
if config_url is None:
|
||||||
|
self._verify_video_password(webpage_url, video_id, webpage)
|
||||||
|
config_url = self._get_config_url(
|
||||||
|
webpage_url, video_id, video_password_verified=True)
|
||||||
|
return config_url
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
config = self._download_json(
|
config_url = self._get_config_url(url, video_id)
|
||||||
'https://player.vimeo.com/video/%s/config' % video_id, video_id)
|
config = self._download_json(config_url, video_id)
|
||||||
info_dict = self._parse_config(config, video_id)
|
info_dict = self._parse_config(config, video_id)
|
||||||
self._vimeo_sort_formats(info_dict['formats'])
|
self._vimeo_sort_formats(info_dict['formats'])
|
||||||
info_dict['id'] = video_id
|
info_dict['id'] = video_id
|
||||||
|
|
Loading…
Reference in New Issue