mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-23 02:25:11 +00:00
[vimeo] Fix extraction for VimeoReview videos
This commit is contained in:
parent
c5edd147d1
commit
531a74968c
1 changed files with 83 additions and 64 deletions
|
@ -66,6 +66,69 @@ def _extract_xsrft_and_vuid(self, webpage):
|
||||||
def _set_vimeo_cookie(self, name, value):
|
def _set_vimeo_cookie(self, name, value):
|
||||||
self._set_cookie('vimeo.com', name, value)
|
self._set_cookie('vimeo.com', name, value)
|
||||||
|
|
||||||
|
def _vimeo_sort_formats(self, formats):
|
||||||
|
# Bitrates are completely broken. Single m3u8 may contain entries in kbps and bps
|
||||||
|
# at the same time without actual units specified. This lead to wrong sorting.
|
||||||
|
self._sort_formats(formats, field_preference=('preference', 'height', 'width', 'fps', 'format_id'))
|
||||||
|
|
||||||
|
def _parse_config(self, config, video_id):
|
||||||
|
# Extract title
|
||||||
|
video_title = config['video']['title']
|
||||||
|
|
||||||
|
# Extract uploader, uploader_url and uploader_id
|
||||||
|
video_uploader = config['video'].get('owner', {}).get('name')
|
||||||
|
video_uploader_url = config['video'].get('owner', {}).get('url')
|
||||||
|
video_uploader_id = video_uploader_url.split('/')[-1] if video_uploader_url else None
|
||||||
|
|
||||||
|
# Extract video thumbnail
|
||||||
|
video_thumbnail = config['video'].get('thumbnail')
|
||||||
|
if video_thumbnail is None:
|
||||||
|
video_thumbs = config['video'].get('thumbs')
|
||||||
|
if video_thumbs and isinstance(video_thumbs, dict):
|
||||||
|
_, video_thumbnail = sorted((int(width if width.isdigit() else 0), t_url) for (width, t_url) in video_thumbs.items())[-1]
|
||||||
|
|
||||||
|
# Extract video duration
|
||||||
|
video_duration = int_or_none(config['video'].get('duration'))
|
||||||
|
|
||||||
|
formats = []
|
||||||
|
config_files = config['video'].get('files') or config['request'].get('files', {})
|
||||||
|
for f in config_files.get('progressive', []):
|
||||||
|
video_url = f.get('url')
|
||||||
|
if not video_url:
|
||||||
|
continue
|
||||||
|
formats.append({
|
||||||
|
'url': video_url,
|
||||||
|
'format_id': 'http-%s' % f.get('quality'),
|
||||||
|
'width': int_or_none(f.get('width')),
|
||||||
|
'height': int_or_none(f.get('height')),
|
||||||
|
'fps': int_or_none(f.get('fps')),
|
||||||
|
'tbr': int_or_none(f.get('bitrate')),
|
||||||
|
})
|
||||||
|
m3u8_url = config_files.get('hls', {}).get('url')
|
||||||
|
if m3u8_url:
|
||||||
|
formats.extend(self._extract_m3u8_formats(
|
||||||
|
m3u8_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=False))
|
||||||
|
|
||||||
|
subtitles = {}
|
||||||
|
text_tracks = config['request'].get('text_tracks')
|
||||||
|
if text_tracks:
|
||||||
|
for tt in text_tracks:
|
||||||
|
subtitles[tt['lang']] = [{
|
||||||
|
'ext': 'vtt',
|
||||||
|
'url': 'https://vimeo.com' + tt['url'],
|
||||||
|
}]
|
||||||
|
|
||||||
|
return {
|
||||||
|
'title': video_title,
|
||||||
|
'uploader': video_uploader,
|
||||||
|
'uploader_id': video_uploader_id,
|
||||||
|
'uploader_url': video_uploader_url,
|
||||||
|
'thumbnail': video_thumbnail,
|
||||||
|
'duration': video_duration,
|
||||||
|
'formats': formats,
|
||||||
|
'subtitles': subtitles,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class VimeoIE(VimeoBaseInfoExtractor):
|
class VimeoIE(VimeoBaseInfoExtractor):
|
||||||
"""Information extractor for vimeo.com."""
|
"""Information extractor for vimeo.com."""
|
||||||
|
@ -153,7 +216,7 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
||||||
'uploader_id': 'user18948128',
|
'uploader_id': 'user18948128',
|
||||||
'uploader': 'Jaime Marquínez Ferrándiz',
|
'uploader': 'Jaime Marquínez Ferrándiz',
|
||||||
'duration': 10,
|
'duration': 10,
|
||||||
'description': 'This is "youtube-dl password protected test video" by Jaime Marquínez Ferrándiz on Vimeo, the home for high quality videos and the people\u2026',
|
'description': 'This is "youtube-dl password protected test video" by on Vimeo, the home for high quality videos and the people who love them.',
|
||||||
},
|
},
|
||||||
'params': {
|
'params': {
|
||||||
'videopassword': 'youtube-dl',
|
'videopassword': 'youtube-dl',
|
||||||
|
@ -389,21 +452,6 @@ def _real_extract(self, url):
|
||||||
'https://player.vimeo.com/player/%s' % feature_id,
|
'https://player.vimeo.com/player/%s' % feature_id,
|
||||||
{'force_feature_id': True}), 'Vimeo')
|
{'force_feature_id': True}), 'Vimeo')
|
||||||
|
|
||||||
# Extract title
|
|
||||||
video_title = config['video']['title']
|
|
||||||
|
|
||||||
# Extract uploader, uploader_url and uploader_id
|
|
||||||
video_uploader = config['video'].get('owner', {}).get('name')
|
|
||||||
video_uploader_url = config['video'].get('owner', {}).get('url')
|
|
||||||
video_uploader_id = video_uploader_url.split('/')[-1] if video_uploader_url else None
|
|
||||||
|
|
||||||
# Extract video thumbnail
|
|
||||||
video_thumbnail = config['video'].get('thumbnail')
|
|
||||||
if video_thumbnail is None:
|
|
||||||
video_thumbs = config['video'].get('thumbs')
|
|
||||||
if video_thumbs and isinstance(video_thumbs, dict):
|
|
||||||
_, video_thumbnail = sorted((int(width if width.isdigit() else 0), t_url) for (width, t_url) in video_thumbs.items())[-1]
|
|
||||||
|
|
||||||
# Extract video description
|
# Extract video description
|
||||||
|
|
||||||
video_description = self._html_search_regex(
|
video_description = self._html_search_regex(
|
||||||
|
@ -423,9 +471,6 @@ def _real_extract(self, url):
|
||||||
if not video_description and not mobj.group('player'):
|
if not video_description and not mobj.group('player'):
|
||||||
self._downloader.report_warning('Cannot find video description')
|
self._downloader.report_warning('Cannot find video description')
|
||||||
|
|
||||||
# Extract video duration
|
|
||||||
video_duration = int_or_none(config['video'].get('duration'))
|
|
||||||
|
|
||||||
# Extract upload date
|
# Extract upload date
|
||||||
video_upload_date = None
|
video_upload_date = None
|
||||||
mobj = re.search(r'<time[^>]+datetime="([^"]+)"', webpage)
|
mobj = re.search(r'<time[^>]+datetime="([^"]+)"', webpage)
|
||||||
|
@ -463,53 +508,22 @@ def _real_extract(self, url):
|
||||||
'format_id': source_name,
|
'format_id': source_name,
|
||||||
'preference': 1,
|
'preference': 1,
|
||||||
})
|
})
|
||||||
config_files = config['video'].get('files') or config['request'].get('files', {})
|
|
||||||
for f in config_files.get('progressive', []):
|
|
||||||
video_url = f.get('url')
|
|
||||||
if not video_url:
|
|
||||||
continue
|
|
||||||
formats.append({
|
|
||||||
'url': video_url,
|
|
||||||
'format_id': 'http-%s' % f.get('quality'),
|
|
||||||
'width': int_or_none(f.get('width')),
|
|
||||||
'height': int_or_none(f.get('height')),
|
|
||||||
'fps': int_or_none(f.get('fps')),
|
|
||||||
'tbr': int_or_none(f.get('bitrate')),
|
|
||||||
})
|
|
||||||
m3u8_url = config_files.get('hls', {}).get('url')
|
|
||||||
if m3u8_url:
|
|
||||||
formats.extend(self._extract_m3u8_formats(
|
|
||||||
m3u8_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=False))
|
|
||||||
# Bitrates are completely broken. Single m3u8 may contain entries in kbps and bps
|
|
||||||
# at the same time without actual units specified. This lead to wrong sorting.
|
|
||||||
self._sort_formats(formats, field_preference=('preference', 'height', 'width', 'fps', 'format_id'))
|
|
||||||
|
|
||||||
subtitles = {}
|
info_dict = self._parse_config(config, video_id)
|
||||||
text_tracks = config['request'].get('text_tracks')
|
formats.extend(info_dict['formats'])
|
||||||
if text_tracks:
|
self._vimeo_sort_formats(formats)
|
||||||
for tt in text_tracks:
|
info_dict.update({
|
||||||
subtitles[tt['lang']] = [{
|
|
||||||
'ext': 'vtt',
|
|
||||||
'url': 'https://vimeo.com' + tt['url'],
|
|
||||||
}]
|
|
||||||
|
|
||||||
return {
|
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
'uploader': video_uploader,
|
|
||||||
'uploader_url': video_uploader_url,
|
|
||||||
'uploader_id': video_uploader_id,
|
|
||||||
'upload_date': video_upload_date,
|
|
||||||
'title': video_title,
|
|
||||||
'thumbnail': video_thumbnail,
|
|
||||||
'description': video_description,
|
|
||||||
'duration': video_duration,
|
|
||||||
'formats': formats,
|
'formats': formats,
|
||||||
|
'upload_date': video_upload_date,
|
||||||
|
'description': video_description,
|
||||||
'webpage_url': url,
|
'webpage_url': url,
|
||||||
'view_count': view_count,
|
'view_count': view_count,
|
||||||
'like_count': like_count,
|
'like_count': like_count,
|
||||||
'comment_count': comment_count,
|
'comment_count': comment_count,
|
||||||
'subtitles': subtitles,
|
})
|
||||||
}
|
|
||||||
|
return info_dict
|
||||||
|
|
||||||
|
|
||||||
class VimeoOndemandIE(VimeoBaseInfoExtractor):
|
class VimeoOndemandIE(VimeoBaseInfoExtractor):
|
||||||
|
@ -692,7 +706,7 @@ def _real_extract(self, url):
|
||||||
return self._extract_videos(name, 'https://vimeo.com/groups/%s' % name)
|
return self._extract_videos(name, 'https://vimeo.com/groups/%s' % name)
|
||||||
|
|
||||||
|
|
||||||
class VimeoReviewIE(InfoExtractor):
|
class VimeoReviewIE(VimeoBaseInfoExtractor):
|
||||||
IE_NAME = 'vimeo:review'
|
IE_NAME = 'vimeo:review'
|
||||||
IE_DESC = 'Review pages on vimeo'
|
IE_DESC = 'Review pages on vimeo'
|
||||||
_VALID_URL = r'https://vimeo\.com/[^/]+/review/(?P<id>[^/]+)'
|
_VALID_URL = r'https://vimeo\.com/[^/]+/review/(?P<id>[^/]+)'
|
||||||
|
@ -704,6 +718,7 @@ class VimeoReviewIE(InfoExtractor):
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': "DICK HARDWICK 'Comedian'",
|
'title': "DICK HARDWICK 'Comedian'",
|
||||||
'uploader': 'Richard Hardwick',
|
'uploader': 'Richard Hardwick',
|
||||||
|
'uploader_id': 'user21297594',
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
'note': 'video player needs Referer',
|
'note': 'video player needs Referer',
|
||||||
|
@ -716,14 +731,18 @@ class VimeoReviewIE(InfoExtractor):
|
||||||
'uploader': 'DevWeek Events',
|
'uploader': 'DevWeek Events',
|
||||||
'duration': 2773,
|
'duration': 2773,
|
||||||
'thumbnail': 're:^https?://.*\.jpg$',
|
'thumbnail': 're:^https?://.*\.jpg$',
|
||||||
|
'uploader_id': 'user22258446',
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
mobj = re.match(self._VALID_URL, url)
|
video_id = self._match_id(url)
|
||||||
video_id = mobj.group('id')
|
config = self._download_json(
|
||||||
player_url = 'https://player.vimeo.com/player/' + video_id
|
'https://player.vimeo.com/video/%s/config' % video_id, video_id)
|
||||||
return self.url_result(player_url, 'Vimeo', video_id)
|
info_dict = self._parse_config(config, video_id)
|
||||||
|
self._vimeo_sort_formats(info_dict['formats'])
|
||||||
|
info_dict['id'] = video_id
|
||||||
|
return info_dict
|
||||||
|
|
||||||
|
|
||||||
class VimeoWatchLaterIE(VimeoChannelIE):
|
class VimeoWatchLaterIE(VimeoChannelIE):
|
||||||
|
|
Loading…
Reference in a new issue