mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[extractor/vimeo] Add VimeoProIE (#5596)
				
					
				
			* Add support for VimeoPro URLs not containing a Vimeo video ID * Add support for password-protected VimeoPro pages Closes #5594 Authored by: bashonly, pukkandan
This commit is contained in:
		| @@ -2,6 +2,7 @@ import base64 | ||||
| import functools | ||||
| import re | ||||
| import itertools | ||||
| import urllib.error | ||||
| 
 | ||||
| from .common import InfoExtractor | ||||
| from ..compat import ( | ||||
| @@ -311,7 +312,7 @@ class VimeoIE(VimeoBaseInfoExtractor): | ||||
|                             ) | ||||
|                             \. | ||||
|                         )? | ||||
|                         vimeo(?:pro)?\.com/ | ||||
|                         vimeo\.com/ | ||||
|                         (?!(?:channels|album|showcase)/[^/?#]+/?(?:$|[?#])|[^/]+/review/|ondemand/) | ||||
|                         (?:[^/]+/)*? | ||||
|                         (?: | ||||
| @@ -355,31 +356,6 @@ class VimeoIE(VimeoBaseInfoExtractor): | ||||
|             }, | ||||
|             'skip': 'No longer available' | ||||
|         }, | ||||
|         { | ||||
|             'url': 'http://vimeopro.com/openstreetmapus/state-of-the-map-us-2013/video/68093876', | ||||
|             'md5': '3b5ca6aa22b60dfeeadf50b72e44ed82', | ||||
|             'note': 'Vimeo Pro video (#1197)', | ||||
|             'info_dict': { | ||||
|                 'id': '68093876', | ||||
|                 'ext': 'mp4', | ||||
|                 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/openstreetmapus', | ||||
|                 'uploader_id': 'openstreetmapus', | ||||
|                 'uploader': 'OpenStreetMap US', | ||||
|                 'title': 'Andy Allan - Putting the Carto into OpenStreetMap Cartography', | ||||
|                 'description': 'md5:2c362968038d4499f4d79f88458590c1', | ||||
|                 'duration': 1595, | ||||
|                 'upload_date': '20130610', | ||||
|                 'timestamp': 1370893156, | ||||
|                 'license': 'by', | ||||
|                 'thumbnail': 'https://i.vimeocdn.com/video/440260469-19b0d92fca3bd84066623b53f1eb8aaa3980c6c809e2d67b6b39ab7b4a77a344-d_960', | ||||
|                 'view_count': int, | ||||
|                 'comment_count': int, | ||||
|                 'like_count': int, | ||||
|             }, | ||||
|             'params': { | ||||
|                 'format': 'best[protocol=https]', | ||||
|             }, | ||||
|         }, | ||||
|         { | ||||
|             'url': 'http://player.vimeo.com/video/54469442', | ||||
|             'md5': 'b3e7f4d2cbb53bd7dc3bb6ff4ed5cfbd', | ||||
| @@ -837,15 +813,7 @@ class VimeoIE(VimeoBaseInfoExtractor): | ||||
|         if unlisted_hash: | ||||
|             return self._extract_from_api(video_id, unlisted_hash) | ||||
| 
 | ||||
|         orig_url = url | ||||
|         is_pro = 'vimeopro.com/' in url | ||||
|         if is_pro: | ||||
|             # some videos require portfolio_id to be present in player url | ||||
|             # https://github.com/ytdl-org/youtube-dl/issues/20070 | ||||
|             url = self._extract_url(url, self._download_webpage(url, video_id)) | ||||
|             if not url: | ||||
|                 url = 'https://vimeo.com/' + video_id | ||||
|         elif any(p in url for p in ('play_redirect_hls', 'moogaloop.swf')): | ||||
|         if any(p in url for p in ('play_redirect_hls', 'moogaloop.swf')): | ||||
|             url = 'https://vimeo.com/' + video_id | ||||
| 
 | ||||
|         self._try_album_password(url) | ||||
| @@ -947,14 +915,6 @@ class VimeoIE(VimeoBaseInfoExtractor): | ||||
|             video_description = self._html_search_meta( | ||||
|                 ['description', 'og:description', 'twitter:description'], | ||||
|                 webpage, default=None) | ||||
|         if not video_description and is_pro: | ||||
|             orig_webpage = self._download_webpage( | ||||
|                 orig_url, video_id, | ||||
|                 note='Downloading webpage for description', | ||||
|                 fatal=False) | ||||
|             if orig_webpage: | ||||
|                 video_description = self._html_search_meta( | ||||
|                     'description', orig_webpage, default=None) | ||||
|         if not video_description: | ||||
|             self.report_warning('Cannot find video description') | ||||
| 
 | ||||
| @@ -1393,3 +1353,89 @@ class VHXEmbedIE(VimeoBaseInfoExtractor): | ||||
|         info = self._parse_config(config, video_id) | ||||
|         info['id'] = video_id | ||||
|         return info | ||||
| 
 | ||||
| 
 | ||||
| class VimeoProIE(VimeoBaseInfoExtractor): | ||||
|     IE_NAME = 'vimeo:pro' | ||||
|     _VALID_URL = r'https?://(?:www\.)?vimeopro\.com/[^/?#]+/(?P<slug>[^/?#]+)(?:(?:/videos?/(?P<id>[0-9]+)))?' | ||||
|     _TESTS = [{ | ||||
|         # Vimeo URL derived from video_id | ||||
|         'url': 'http://vimeopro.com/openstreetmapus/state-of-the-map-us-2013/video/68093876', | ||||
|         'md5': '3b5ca6aa22b60dfeeadf50b72e44ed82', | ||||
|         'note': 'Vimeo Pro video (#1197)', | ||||
|         'info_dict': { | ||||
|             'id': '68093876', | ||||
|             'ext': 'mp4', | ||||
|             'uploader_url': r're:https?://(?:www\.)?vimeo\.com/openstreetmapus', | ||||
|             'uploader_id': 'openstreetmapus', | ||||
|             'uploader': 'OpenStreetMap US', | ||||
|             'title': 'Andy Allan - Putting the Carto into OpenStreetMap Cartography', | ||||
|             'description': 'md5:2c362968038d4499f4d79f88458590c1', | ||||
|             'duration': 1595, | ||||
|             'upload_date': '20130610', | ||||
|             'timestamp': 1370893156, | ||||
|             'license': 'by', | ||||
|             'thumbnail': 'https://i.vimeocdn.com/video/440260469-19b0d92fca3bd84066623b53f1eb8aaa3980c6c809e2d67b6b39ab7b4a77a344-d_960', | ||||
|             'view_count': int, | ||||
|             'comment_count': int, | ||||
|             'like_count': int, | ||||
|             'tags': 'count:1', | ||||
|         }, | ||||
|         'params': { | ||||
|             'format': 'best[protocol=https]', | ||||
|         }, | ||||
|     }, { | ||||
|         # password-protected VimeoPro page with Vimeo player embed | ||||
|         'url': 'https://vimeopro.com/cadfem/simulation-conference-mechanische-systeme-in-perfektion', | ||||
|         'info_dict': { | ||||
|             'id': '764543723', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Mechanische Systeme in Perfektion: Realität erfassen, Innovation treiben', | ||||
|             'thumbnail': 'https://i.vimeocdn.com/video/1543784598-a1a750494a485e601110136b9fe11e28c2131942452b3a5d30391cb3800ca8fd-d_1280', | ||||
|             'description': 'md5:2a9d195cd1b0f6f79827107dc88c2420', | ||||
|             'uploader': 'CADFEM', | ||||
|             'uploader_id': 'cadfem', | ||||
|             'uploader_url': 'https://vimeo.com/cadfem', | ||||
|             'duration': 12505, | ||||
|             'chapters': 'count:10', | ||||
|         }, | ||||
|         'params': { | ||||
|             'videopassword': 'Conference2022', | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         display_id, video_id = self._match_valid_url(url).group('slug', 'id') | ||||
|         if video_id: | ||||
|             display_id = video_id | ||||
|         webpage = self._download_webpage(url, display_id) | ||||
| 
 | ||||
|         password_form = self._search_regex( | ||||
|             r'(?is)<form[^>]+?method=["\']post["\'][^>]*>(.+?password.+?)</form>', | ||||
|             webpage, 'password form', default=None) | ||||
|         if password_form: | ||||
|             try: | ||||
|                 webpage = self._download_webpage(url, display_id, data=urlencode_postdata({ | ||||
|                     'password': self._get_video_password(), | ||||
|                     **self._hidden_inputs(password_form), | ||||
|                 }), note='Logging in with video password') | ||||
|             except ExtractorError as e: | ||||
|                 if isinstance(e.cause, urllib.error.HTTPError) and e.cause.code == 418: | ||||
|                     raise ExtractorError('Wrong video password', expected=True) | ||||
|                 raise | ||||
| 
 | ||||
|         description = None | ||||
|         # even if we have video_id, some videos require player URL with portfolio_id query param | ||||
|         # https://github.com/ytdl-org/youtube-dl/issues/20070 | ||||
|         vimeo_url = VimeoIE._extract_url(url, webpage) | ||||
|         if vimeo_url: | ||||
|             description = self._html_search_meta('description', webpage, default=None) | ||||
|         elif video_id: | ||||
|             vimeo_url = f'https://vimeo.com/{video_id}' | ||||
|         else: | ||||
|             raise ExtractorError( | ||||
|                 'No Vimeo embed or video ID could be found in VimeoPro page', expected=True) | ||||
| 
 | ||||
|         return self.url_result(vimeo_url, VimeoIE, video_id, url_transparent=True, | ||||
|                                description=description) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bashonly
					bashonly