|
|
@ -16,6 +16,7 @@ from ..utils import ( |
|
|
|
ExtractorError, |
|
|
|
InAdvancePagedList, |
|
|
|
int_or_none, |
|
|
|
NO_DEFAULT, |
|
|
|
RegexNotFoundError, |
|
|
|
sanitized_Request, |
|
|
|
smuggle_url, |
|
|
@ -56,6 +57,26 @@ class VimeoBaseInfoExtractor(InfoExtractor): |
|
|
|
self._set_vimeo_cookie('vuid', vuid) |
|
|
|
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): |
|
|
|
xsrft = self._search_regex( |
|
|
|
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: |
|
|
|
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): |
|
|
|
password = self._downloader.params.get('videopassword') |
|
|
|
if password is None: |
|
|
@ -791,12 +792,39 @@ class VimeoReviewIE(VimeoBaseInfoExtractor): |
|
|
|
'thumbnail': 're:^https?://.*\.jpg$', |
|
|
|
'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): |
|
|
|
video_id = self._match_id(url) |
|
|
|
config = self._download_json( |
|
|
|
'https://player.vimeo.com/video/%s/config' % video_id, video_id) |
|
|
|
config_url = self._get_config_url(url, video_id) |
|
|
|
config = self._download_json(config_url, video_id) |
|
|
|
info_dict = self._parse_config(config, video_id) |
|
|
|
self._vimeo_sort_formats(info_dict['formats']) |
|
|
|
info_dict['id'] = video_id |
|
|
|