From a5155b4ea631ed823afbde3e5eb14fa389320375 Mon Sep 17 00:00:00 2001 From: Dawid Cywka Date: Mon, 28 Dec 2015 00:55:38 -0500 Subject: [PATCH 1/2] [vimeo] support private videos in password-protected albums (fixes #8030) --- youtube_dl/extractor/__init__.py | 1 + youtube_dl/extractor/vimeo.py | 59 ++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index c1dbf9f21..0e16f9f9a 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -778,6 +778,7 @@ from .viidea import ViideaIE from .vimeo import ( VimeoIE, VimeoAlbumIE, + VimeoAlbumVideoIE, VimeoChannelIE, VimeoGroupsIE, VimeoLikesIE, diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index ce08e6955..6cef776b9 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -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|(?Pplayer))\.)? + vimeo(?Ppro)?\.com/ + album/(?P[0-9]+)/video/ + (?P[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[^/?#]+)/?(?:$|[?#])' @@ -569,7 +597,7 @@ class VimeoUserIE(VimeoChannelIE): class VimeoAlbumIE(VimeoChannelIE): IE_NAME = 'vimeo:album' - _VALID_URL = r'https://vimeo\.com/album/(?P\d+)' + _VALID_URL = r'https://vimeo\.com/album/(?P\d+)/?(?:$|[?#])' _TITLE_RE = r'