[vimeo:review] Fix extraction for password-protected videos
Closes #9853
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user