|  | @@ -75,25 +75,28 @@ class VimeoBaseInfoExtractor(InfoExtractor):
 | 
	
		
			
				|  |  |                      expected=True)
 | 
	
		
			
				|  |  |              raise ExtractorError('Unable to log in')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    def _verify_video_password(self, url, video_id, webpage):
 | 
	
		
			
				|  |  | +    def _get_video_password(self):
 | 
	
		
			
				|  |  |          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,
 | 
	
		
			
				|  |  | -        })
 | 
	
		
			
				|  |  | +            raise ExtractorError(
 | 
	
		
			
				|  |  | +                'This video is protected by a password, use the --video-password option',
 | 
	
		
			
				|  |  | +                expected=True)
 | 
	
		
			
				|  |  | +        return password
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _verify_video_password(self, url, video_id, password, token, vuid):
 | 
	
		
			
				|  |  |          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')
 | 
	
		
			
				|  |  | +            url + '/password', video_id, 'Verifying the password',
 | 
	
		
			
				|  |  | +            'Wrong password', data=urlencode_postdata({
 | 
	
		
			
				|  |  | +                'password': password,
 | 
	
		
			
				|  |  | +                'token': token,
 | 
	
		
			
				|  |  | +            }), headers={
 | 
	
		
			
				|  |  | +                'Content-Type': 'application/x-www-form-urlencoded',
 | 
	
		
			
				|  |  | +                'Referer': url,
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _extract_xsrft_and_vuid(self, webpage):
 | 
	
		
			
				|  |  |          xsrft = self._search_regex(
 | 
	
	
		
			
				|  | @@ -332,9 +335,9 @@ class VimeoIE(VimeoBaseInfoExtractor):
 | 
	
		
			
				|  |  |                  'id': '54469442',
 | 
	
		
			
				|  |  |                  'ext': 'mp4',
 | 
	
		
			
				|  |  |                  'title': 'Kathy Sierra: Building the minimum Badass User, Business of Software 2012',
 | 
	
		
			
				|  |  | -                'uploader': 'The BLN & Business of Software',
 | 
	
		
			
				|  |  | -                'uploader_url': r're:https?://(?:www\.)?vimeo\.com/theblnbusinessofsoftware',
 | 
	
		
			
				|  |  | -                'uploader_id': 'theblnbusinessofsoftware',
 | 
	
		
			
				|  |  | +                'uploader': 'Business of Software',
 | 
	
		
			
				|  |  | +                'uploader_url': r're:https?://(?:www\.)?vimeo\.com/businessofsoftware',
 | 
	
		
			
				|  |  | +                'uploader_id': 'businessofsoftware',
 | 
	
		
			
				|  |  |                  'duration': 3610,
 | 
	
		
			
				|  |  |                  'description': None,
 | 
	
		
			
				|  |  |              },
 | 
	
	
		
			
				|  | @@ -469,6 +472,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
 | 
	
		
			
				|  |  |                  'skip_download': True,
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |              'expected_warnings': ['Unable to download JSON metadata'],
 | 
	
		
			
				|  |  | +            'skip': 'this page is no longer available.',
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              'url': 'http://player.vimeo.com/video/68375962',
 | 
	
	
		
			
				|  | @@ -551,9 +555,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
 | 
	
		
			
				|  |  |          return urls[0] if urls else None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _verify_player_video_password(self, url, video_id, headers):
 | 
	
		
			
				|  |  | -        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)
 | 
	
		
			
				|  |  | +        password = self._get_video_password()
 | 
	
		
			
				|  |  |          data = urlencode_postdata({
 | 
	
		
			
				|  |  |              'password': base64.b64encode(password.encode()),
 | 
	
		
			
				|  |  |          })
 | 
	
	
		
			
				|  | @@ -697,7 +699,10 @@ class VimeoIE(VimeoBaseInfoExtractor):
 | 
	
		
			
				|  |  |              if re.search(r'<form[^>]+?id="pw_form"', webpage) is not None:
 | 
	
		
			
				|  |  |                  if '_video_password_verified' in data:
 | 
	
		
			
				|  |  |                      raise ExtractorError('video password verification failed!')
 | 
	
		
			
				|  |  | -                self._verify_video_password(redirect_url, video_id, webpage)
 | 
	
		
			
				|  |  | +                video_password = self._get_video_password()
 | 
	
		
			
				|  |  | +                token, vuid = self._extract_xsrft_and_vuid(webpage)
 | 
	
		
			
				|  |  | +                self._verify_video_password(
 | 
	
		
			
				|  |  | +                    redirect_url, video_id, video_password, token, vuid)
 | 
	
		
			
				|  |  |                  return self._real_extract(
 | 
	
		
			
				|  |  |                      smuggle_url(redirect_url, {'_video_password_verified': 'verified'}))
 | 
	
		
			
				|  |  |              else:
 | 
	
	
		
			
				|  | @@ -1091,10 +1096,23 @@ class VimeoReviewIE(VimeoBaseInfoExtractor):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _real_extract(self, url):
 | 
	
		
			
				|  |  |          page_url, video_id = re.match(self._VALID_URL, url).groups()
 | 
	
		
			
				|  |  | -        clip_data = self._download_json(
 | 
	
		
			
				|  |  | -            page_url.replace('/review/', '/review/data/'),
 | 
	
		
			
				|  |  | -            video_id)['clipData']
 | 
	
		
			
				|  |  | -        config_url = clip_data['configUrl']
 | 
	
		
			
				|  |  | +        data = self._download_json(
 | 
	
		
			
				|  |  | +            page_url.replace('/review/', '/review/data/'), video_id)
 | 
	
		
			
				|  |  | +        if data.get('isLocked') is True:
 | 
	
		
			
				|  |  | +            video_password = self._get_video_password()
 | 
	
		
			
				|  |  | +            viewer = self._download_json(
 | 
	
		
			
				|  |  | +                'https://vimeo.com/_rv/viewer', video_id)
 | 
	
		
			
				|  |  | +            webpage = self._verify_video_password(
 | 
	
		
			
				|  |  | +                'https://vimeo.com/' + video_id, video_id,
 | 
	
		
			
				|  |  | +                video_password, viewer['xsrft'], viewer['vuid'])
 | 
	
		
			
				|  |  | +            clip_page_config = self._parse_json(self._search_regex(
 | 
	
		
			
				|  |  | +                r'window\.vimeo\.clip_page_config\s*=\s*({.+?});',
 | 
	
		
			
				|  |  | +                webpage, 'clip page config'), video_id)
 | 
	
		
			
				|  |  | +            config_url = clip_page_config['player']['config_url']
 | 
	
		
			
				|  |  | +            clip_data = clip_page_config.get('clip') or {}
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            clip_data = data['clipData']
 | 
	
		
			
				|  |  | +            config_url = clip_data['configUrl']
 | 
	
		
			
				|  |  |          config = self._download_json(config_url, video_id)
 | 
	
		
			
				|  |  |          info_dict = self._parse_config(config, video_id)
 | 
	
		
			
				|  |  |          source_format = self._extract_original_format(
 |