mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-12-23 02:26:37 -05: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:
parent
3b021eacef
commit
7ff2fafe47
@ -2096,6 +2096,7 @@ from .vimeo import (
|
|||||||
VimeoGroupsIE,
|
VimeoGroupsIE,
|
||||||
VimeoLikesIE,
|
VimeoLikesIE,
|
||||||
VimeoOndemandIE,
|
VimeoOndemandIE,
|
||||||
|
VimeoProIE,
|
||||||
VimeoReviewIE,
|
VimeoReviewIE,
|
||||||
VimeoUserIE,
|
VimeoUserIE,
|
||||||
VimeoWatchLaterIE,
|
VimeoWatchLaterIE,
|
||||||
|
@ -2,6 +2,7 @@ import base64
|
|||||||
import functools
|
import functools
|
||||||
import re
|
import re
|
||||||
import itertools
|
import itertools
|
||||||
|
import urllib.error
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..compat import (
|
from ..compat import (
|
||||||
@ -311,7 +312,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
)
|
)
|
||||||
\.
|
\.
|
||||||
)?
|
)?
|
||||||
vimeo(?:pro)?\.com/
|
vimeo\.com/
|
||||||
(?!(?:channels|album|showcase)/[^/?#]+/?(?:$|[?#])|[^/]+/review/|ondemand/)
|
(?!(?:channels|album|showcase)/[^/?#]+/?(?:$|[?#])|[^/]+/review/|ondemand/)
|
||||||
(?:[^/]+/)*?
|
(?:[^/]+/)*?
|
||||||
(?:
|
(?:
|
||||||
@ -355,31 +356,6 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
},
|
},
|
||||||
'skip': 'No longer available'
|
'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',
|
'url': 'http://player.vimeo.com/video/54469442',
|
||||||
'md5': 'b3e7f4d2cbb53bd7dc3bb6ff4ed5cfbd',
|
'md5': 'b3e7f4d2cbb53bd7dc3bb6ff4ed5cfbd',
|
||||||
@ -837,15 +813,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
if unlisted_hash:
|
if unlisted_hash:
|
||||||
return self._extract_from_api(video_id, unlisted_hash)
|
return self._extract_from_api(video_id, unlisted_hash)
|
||||||
|
|
||||||
orig_url = url
|
if any(p in url for p in ('play_redirect_hls', 'moogaloop.swf')):
|
||||||
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')):
|
|
||||||
url = 'https://vimeo.com/' + video_id
|
url = 'https://vimeo.com/' + video_id
|
||||||
|
|
||||||
self._try_album_password(url)
|
self._try_album_password(url)
|
||||||
@ -947,14 +915,6 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
video_description = self._html_search_meta(
|
video_description = self._html_search_meta(
|
||||||
['description', 'og:description', 'twitter:description'],
|
['description', 'og:description', 'twitter:description'],
|
||||||
webpage, default=None)
|
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:
|
if not video_description:
|
||||||
self.report_warning('Cannot find video description')
|
self.report_warning('Cannot find video description')
|
||||||
|
|
||||||
@ -1393,3 +1353,89 @@ class VHXEmbedIE(VimeoBaseInfoExtractor):
|
|||||||
info = self._parse_config(config, video_id)
|
info = self._parse_config(config, video_id)
|
||||||
info['id'] = video_id
|
info['id'] = video_id
|
||||||
return info
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user