mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 00:25:15 +00:00 
			
		
		
		
	[vimeo] fix album extraction(closes #23864)
This commit is contained in:
		@@ -841,33 +841,6 @@ class VimeoChannelIE(VimeoBaseInfoExtractor):
 | 
				
			|||||||
        return self._TITLE or self._html_search_regex(
 | 
					        return self._TITLE or self._html_search_regex(
 | 
				
			||||||
            self._TITLE_RE, webpage, 'list title', fatal=False)
 | 
					            self._TITLE_RE, webpage, 'list title', fatal=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _login_list_password(self, page_url, list_id, webpage):
 | 
					 | 
				
			||||||
        login_form = self._search_regex(
 | 
					 | 
				
			||||||
            r'(?s)<form[^>]+?id="pw_form"(.*?)</form>',
 | 
					 | 
				
			||||||
            webpage, 'login form', default=None)
 | 
					 | 
				
			||||||
        if not login_form:
 | 
					 | 
				
			||||||
            return webpage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        password = self._downloader.params.get('videopassword')
 | 
					 | 
				
			||||||
        if password is None:
 | 
					 | 
				
			||||||
            raise ExtractorError('This album is protected by a password, use the --video-password option', expected=True)
 | 
					 | 
				
			||||||
        fields = self._hidden_inputs(login_form)
 | 
					 | 
				
			||||||
        token, vuid = self._extract_xsrft_and_vuid(webpage)
 | 
					 | 
				
			||||||
        fields['token'] = token
 | 
					 | 
				
			||||||
        fields['password'] = password
 | 
					 | 
				
			||||||
        post = urlencode_postdata(fields)
 | 
					 | 
				
			||||||
        password_path = self._search_regex(
 | 
					 | 
				
			||||||
            r'action="([^"]+)"', login_form, 'password URL')
 | 
					 | 
				
			||||||
        password_url = compat_urlparse.urljoin(page_url, password_path)
 | 
					 | 
				
			||||||
        password_request = sanitized_Request(password_url, post)
 | 
					 | 
				
			||||||
        password_request.add_header('Content-type', 'application/x-www-form-urlencoded')
 | 
					 | 
				
			||||||
        self._set_vimeo_cookie('vuid', vuid)
 | 
					 | 
				
			||||||
        self._set_vimeo_cookie('xsrft', token)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return self._download_webpage(
 | 
					 | 
				
			||||||
            password_request, list_id,
 | 
					 | 
				
			||||||
            'Verifying the password', 'Wrong password')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def _title_and_entries(self, list_id, base_url):
 | 
					    def _title_and_entries(self, list_id, base_url):
 | 
				
			||||||
        for pagenum in itertools.count(1):
 | 
					        for pagenum in itertools.count(1):
 | 
				
			||||||
            page_url = self._page_url(base_url, pagenum)
 | 
					            page_url = self._page_url(base_url, pagenum)
 | 
				
			||||||
@@ -876,7 +849,6 @@ class VimeoChannelIE(VimeoBaseInfoExtractor):
 | 
				
			|||||||
                'Downloading page %s' % pagenum)
 | 
					                'Downloading page %s' % pagenum)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if pagenum == 1:
 | 
					            if pagenum == 1:
 | 
				
			||||||
                webpage = self._login_list_password(page_url, list_id, webpage)
 | 
					 | 
				
			||||||
                yield self._extract_list_title(webpage)
 | 
					                yield self._extract_list_title(webpage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Try extracting href first since not all videos are available via
 | 
					            # Try extracting href first since not all videos are available via
 | 
				
			||||||
@@ -923,7 +895,7 @@ class VimeoUserIE(VimeoChannelIE):
 | 
				
			|||||||
    _BASE_URL_TEMPL = 'https://vimeo.com/%s'
 | 
					    _BASE_URL_TEMPL = 'https://vimeo.com/%s'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VimeoAlbumIE(VimeoChannelIE):
 | 
					class VimeoAlbumIE(VimeoBaseInfoExtractor):
 | 
				
			||||||
    IE_NAME = 'vimeo:album'
 | 
					    IE_NAME = 'vimeo:album'
 | 
				
			||||||
    _VALID_URL = r'https://vimeo\.com/(?:album|showcase)/(?P<id>\d+)(?:$|[?#]|/(?!video))'
 | 
					    _VALID_URL = r'https://vimeo\.com/(?:album|showcase)/(?P<id>\d+)(?:$|[?#]|/(?!video))'
 | 
				
			||||||
    _TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>'
 | 
					    _TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>'
 | 
				
			||||||
@@ -973,13 +945,39 @@ class VimeoAlbumIE(VimeoChannelIE):
 | 
				
			|||||||
    def _real_extract(self, url):
 | 
					    def _real_extract(self, url):
 | 
				
			||||||
        album_id = self._match_id(url)
 | 
					        album_id = self._match_id(url)
 | 
				
			||||||
        webpage = self._download_webpage(url, album_id)
 | 
					        webpage = self._download_webpage(url, album_id)
 | 
				
			||||||
        webpage = self._login_list_password(url, album_id, webpage)
 | 
					        viewer = self._parse_json(self._search_regex(
 | 
				
			||||||
        api_config = self._extract_vimeo_config(webpage, album_id)['api']
 | 
					            r'bootstrap_data\s*=\s*({.+?})</script>',
 | 
				
			||||||
 | 
					            webpage, 'bootstrap data'), album_id)['viewer']
 | 
				
			||||||
 | 
					        jwt = viewer['jwt']
 | 
				
			||||||
 | 
					        album = self._download_json(
 | 
				
			||||||
 | 
					            'https://api.vimeo.com/albums/' + album_id,
 | 
				
			||||||
 | 
					            album_id, headers={'Authorization': 'jwt ' + jwt},
 | 
				
			||||||
 | 
					            query={'fields': 'description,name,privacy'})
 | 
				
			||||||
 | 
					        hashed_pass = None
 | 
				
			||||||
 | 
					        if try_get(album, lambda x: x['privacy']['view']) == 'password':
 | 
				
			||||||
 | 
					            password = self._downloader.params.get('videopassword')
 | 
				
			||||||
 | 
					            if not password:
 | 
				
			||||||
 | 
					                raise ExtractorError(
 | 
				
			||||||
 | 
					                    'This album is protected by a password, use the --video-password option',
 | 
				
			||||||
 | 
					                    expected=True)
 | 
				
			||||||
 | 
					            self._set_vimeo_cookie('vuid', viewer['vuid'])
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                hashed_pass = self._download_json(
 | 
				
			||||||
 | 
					                    'https://vimeo.com/showcase/%s/auth' % album_id,
 | 
				
			||||||
 | 
					                    album_id, 'Verifying the password', data=urlencode_postdata({
 | 
				
			||||||
 | 
					                        'password': password,
 | 
				
			||||||
 | 
					                        'token': viewer['xsrft'],
 | 
				
			||||||
 | 
					                    }), headers={
 | 
				
			||||||
 | 
					                        'X-Requested-With': 'XMLHttpRequest',
 | 
				
			||||||
 | 
					                    })['hashed_pass']
 | 
				
			||||||
 | 
					            except ExtractorError as e:
 | 
				
			||||||
 | 
					                if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:
 | 
				
			||||||
 | 
					                    raise ExtractorError('Wrong password', expected=True)
 | 
				
			||||||
 | 
					                raise
 | 
				
			||||||
        entries = OnDemandPagedList(functools.partial(
 | 
					        entries = OnDemandPagedList(functools.partial(
 | 
				
			||||||
            self._fetch_page, album_id, api_config['jwt'],
 | 
					            self._fetch_page, album_id, jwt, hashed_pass), self._PAGE_SIZE)
 | 
				
			||||||
            api_config.get('hashed_pass')), self._PAGE_SIZE)
 | 
					        return self.playlist_result(
 | 
				
			||||||
        return self.playlist_result(entries, album_id, self._html_search_regex(
 | 
					            entries, album_id, album.get('name'), album.get('description'))
 | 
				
			||||||
            r'<title>\s*(.+?)(?:\s+on Vimeo)?</title>', webpage, 'title', fatal=False))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VimeoGroupsIE(VimeoChannelIE):
 | 
					class VimeoGroupsIE(VimeoChannelIE):
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user