|
|
@ -841,33 +841,6 @@ class VimeoChannelIE(VimeoBaseInfoExtractor): |
|
|
|
return self._TITLE or self._html_search_regex( |
|
|
|
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): |
|
|
|
for pagenum in itertools.count(1): |
|
|
|
page_url = self._page_url(base_url, pagenum) |
|
|
@ -876,7 +849,6 @@ class VimeoChannelIE(VimeoBaseInfoExtractor): |
|
|
|
'Downloading page %s' % pagenum) |
|
|
|
|
|
|
|
if pagenum == 1: |
|
|
|
webpage = self._login_list_password(page_url, list_id, webpage) |
|
|
|
yield self._extract_list_title(webpage) |
|
|
|
|
|
|
|
# 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' |
|
|
|
|
|
|
|
|
|
|
|
class VimeoAlbumIE(VimeoChannelIE): |
|
|
|
class VimeoAlbumIE(VimeoBaseInfoExtractor): |
|
|
|
IE_NAME = 'vimeo:album' |
|
|
|
_VALID_URL = r'https://vimeo\.com/(?:album|showcase)/(?P<id>\d+)(?:$|[?#]|/(?!video))' |
|
|
|
_TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>' |
|
|
@ -973,13 +945,39 @@ class VimeoAlbumIE(VimeoChannelIE): |
|
|
|
def _real_extract(self, url): |
|
|
|
album_id = self._match_id(url) |
|
|
|
webpage = self._download_webpage(url, album_id) |
|
|
|
webpage = self._login_list_password(url, album_id, webpage) |
|
|
|
api_config = self._extract_vimeo_config(webpage, album_id)['api'] |
|
|
|
viewer = self._parse_json(self._search_regex( |
|
|
|
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( |
|
|
|
self._fetch_page, album_id, api_config['jwt'], |
|
|
|
api_config.get('hashed_pass')), self._PAGE_SIZE) |
|
|
|
return self.playlist_result(entries, album_id, self._html_search_regex( |
|
|
|
r'<title>\s*(.+?)(?:\s+on Vimeo)?</title>', webpage, 'title', fatal=False)) |
|
|
|
self._fetch_page, album_id, jwt, hashed_pass), self._PAGE_SIZE) |
|
|
|
return self.playlist_result( |
|
|
|
entries, album_id, album.get('name'), album.get('description')) |
|
|
|
|
|
|
|
|
|
|
|
class VimeoGroupsIE(VimeoChannelIE): |
|
|
|