mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 03:17:07 -05:00 
			
		
		
		
	[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