[vimeo] support private videos in password-protected albums (fixes #8030)
This commit is contained in:
parent
bd3f9ecabe
commit
a5155b4ea6
@ -778,6 +778,7 @@ from .viidea import ViideaIE
|
||||
from .vimeo import (
|
||||
VimeoIE,
|
||||
VimeoAlbumIE,
|
||||
VimeoAlbumVideoIE,
|
||||
VimeoChannelIE,
|
||||
VimeoGroupsIE,
|
||||
VimeoLikesIE,
|
||||
|
@ -237,7 +237,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||
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 = sanitized_Request(url, data)
|
||||
password_request.add_header('Content-Type', 'application/x-www-form-urlencoded')
|
||||
password_request.add_header('Referer', url)
|
||||
self._set_vimeo_cookie('vuid', vuid)
|
||||
@ -261,6 +261,15 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||
def _real_initialize(self):
|
||||
self._login()
|
||||
|
||||
def _extract_download_urls(self, mobj):
|
||||
video_id = mobj.group('id')
|
||||
if mobj.group('pro') or mobj.group('player'):
|
||||
url = 'https://player.vimeo.com/video/' + video_id
|
||||
else:
|
||||
url = 'https://vimeo.com/' + video_id
|
||||
json_url = 'https://vimeo.com/%s?action=load_download_config' % video_id
|
||||
return url, json_url
|
||||
|
||||
def _real_extract(self, url):
|
||||
url, data = unsmuggle_url(url)
|
||||
headers = std_headers
|
||||
@ -274,10 +283,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||
mobj = re.match(self._VALID_URL, url)
|
||||
video_id = mobj.group('id')
|
||||
orig_url = url
|
||||
if mobj.group('pro') or mobj.group('player'):
|
||||
url = 'https://player.vimeo.com/video/' + video_id
|
||||
else:
|
||||
url = 'https://vimeo.com/' + video_id
|
||||
url, json_url = self._extract_download_urls(mobj)
|
||||
|
||||
# Retrieve video webpage to extract further information
|
||||
request = sanitized_Request(url, None, headers)
|
||||
@ -407,7 +413,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||
comment_count = None
|
||||
|
||||
formats = []
|
||||
download_request = sanitized_Request('https://vimeo.com/%s?action=load_download_config' % video_id, headers={
|
||||
download_request = sanitized_Request(json_url, headers={
|
||||
'X-Requested-With': 'XMLHttpRequest'})
|
||||
download_data = self._download_json(download_request, video_id, fatal=False)
|
||||
if download_data:
|
||||
@ -472,6 +478,28 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||
}
|
||||
|
||||
|
||||
class VimeoAlbumVideoIE(VimeoIE):
|
||||
_VALID_URL = r'''(?x)
|
||||
https?://
|
||||
(?:(?:www|(?P<player>player))\.)?
|
||||
vimeo(?P<pro>pro)?\.com/
|
||||
album/(?P<list_id>[0-9]+)/video/
|
||||
(?P<id>[0-9]+)
|
||||
/?(?:[?&].*)?(?:[#].*)?$'''
|
||||
IE_NAME = 'vimeo:album_video'
|
||||
_TESTS = []
|
||||
|
||||
def _extract_download_urls(self, mobj):
|
||||
video_id = mobj.group('id')
|
||||
list_id = mobj.group('list_id')
|
||||
if mobj.group('pro') or mobj.group('player'):
|
||||
url = 'https://player.vimeo.com/video/' + video_id
|
||||
else:
|
||||
url = 'https://vimeo.com/album/' + list_id + '/video/' + video_id
|
||||
json_url = 'https://vimeo.com/album/%s/video/%s?action=load_download_config' % (list_id, video_id)
|
||||
return url, json_url
|
||||
|
||||
|
||||
class VimeoChannelIE(VimeoBaseInfoExtractor):
|
||||
IE_NAME = 'vimeo:channel'
|
||||
_VALID_URL = r'https://vimeo\.com/channels/(?P<id>[^/?#]+)/?(?:$|[?#])'
|
||||
@ -569,7 +597,7 @@ class VimeoUserIE(VimeoChannelIE):
|
||||
|
||||
class VimeoAlbumIE(VimeoChannelIE):
|
||||
IE_NAME = 'vimeo:album'
|
||||
_VALID_URL = r'https://vimeo\.com/album/(?P<id>\d+)'
|
||||
_VALID_URL = r'https://vimeo\.com/album/(?P<id>\d+)/?(?:$|[?#])'
|
||||
_TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>'
|
||||
_TESTS = [{
|
||||
'url': 'https://vimeo.com/album/2632481',
|
||||
@ -598,6 +626,23 @@ class VimeoAlbumIE(VimeoChannelIE):
|
||||
album_id = self._match_id(url)
|
||||
return self._extract_videos(album_id, 'https://vimeo.com/album/%s' % album_id)
|
||||
|
||||
def _title_and_entries(self, list_id, base_url):
|
||||
for pagenum in itertools.count(1):
|
||||
page_url = self._page_url(base_url, pagenum)
|
||||
webpage = self._download_webpage(
|
||||
page_url, list_id,
|
||||
'Downloading page %s' % pagenum)
|
||||
|
||||
if pagenum == 1:
|
||||
webpage = self._login_list_password(page_url, list_id, webpage)
|
||||
yield self._extract_list_title(webpage)
|
||||
|
||||
for video_id in re.findall(r'id="clip_(\d+?)"', webpage):
|
||||
yield self.url_result('https://vimeo.com/album/%s/video/%s' % (list_id, video_id), 'VimeoAlbumVideo')
|
||||
|
||||
if re.search(self._MORE_PAGES_INDICATOR, webpage, re.DOTALL) is None:
|
||||
break
|
||||
|
||||
|
||||
class VimeoGroupsIE(VimeoAlbumIE):
|
||||
IE_NAME = 'vimeo:group'
|
||||
|
Loading…
x
Reference in New Issue
Block a user