diff options
| -rw-r--r-- | youtube_dl/extractor/vimeo.py | 72 | 
1 files changed, 50 insertions, 22 deletions
| diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index 4bdeb1187..d9c9852d4 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -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 | 
