|
@@ -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
|