diff options
Diffstat (limited to 'youtube_dl/extractor/vimeo.py')
| -rw-r--r-- | youtube_dl/extractor/vimeo.py | 64 | 
1 files changed, 41 insertions, 23 deletions
| diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index 5800962ea..a90cf0630 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -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( | 
