mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2026-08-06 17:28:37 +00:00
parent
07591f601e
commit
fdcc954df4
@ -1975,7 +1975,7 @@ The following extractors use this feature:
|
|||||||
* `backend`: Backend API to use for extraction - one of `streaks` (default) or `brightcove` (deprecated)
|
* `backend`: Backend API to use for extraction - one of `streaks` (default) or `brightcove` (deprecated)
|
||||||
|
|
||||||
#### vimeo
|
#### vimeo
|
||||||
* `client`: Client to extract video data from. The currently available clients are `android` and `web`. Only one client can be used. The `web` client is used by default, and only works with account cookies or login credentials. The `android` client only works with previously cached OAuth tokens
|
* `client`: Client to extract video data from. The currently available clients are `android`, `macos_basic`, and `web`. Only one client can be used. The `macos_basic` client is used by default, but the `web` client is used when logged-in. The `web` client only works with account cookies or login credentials. The `android` client only works with previously cached OAuth tokens
|
||||||
* `original_format_policy`: Policy for when to try extracting original formats. One of `always`, `never`, or `auto`. The default `auto` policy tries to avoid exceeding the web client's API rate-limit by only making an extra request when Vimeo publicizes the video's downloadability
|
* `original_format_policy`: Policy for when to try extracting original formats. One of `always`, `never`, or `auto`. The default `auto` policy tries to avoid exceeding the web client's API rate-limit by only making an extra request when Vimeo publicizes the video's downloadability
|
||||||
|
|
||||||
#### zan
|
#### zan
|
||||||
|
|||||||
@ -49,7 +49,7 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
|||||||
'Cannot download embed-only video without embedding URL. Please call yt-dlp '
|
'Cannot download embed-only video without embedding URL. Please call yt-dlp '
|
||||||
'with the URL of the page that embeds this video.')
|
'with the URL of the page that embeds this video.')
|
||||||
|
|
||||||
_DEFAULT_CLIENT = 'web'
|
_DEFAULT_CLIENT = 'macos_basic'
|
||||||
_DEFAULT_AUTHED_CLIENT = 'web'
|
_DEFAULT_AUTHED_CLIENT = 'web'
|
||||||
_CLIENT_HEADERS = {
|
_CLIENT_HEADERS = {
|
||||||
'Accept': 'application/vnd.vimeo.*+json; version=3.4.10',
|
'Accept': 'application/vnd.vimeo.*+json; version=3.4.10',
|
||||||
@ -59,7 +59,6 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
|||||||
'android': {
|
'android': {
|
||||||
'CACHE_KEY': 'oauth-token-android',
|
'CACHE_KEY': 'oauth-token-android',
|
||||||
'CACHE_ONLY': True,
|
'CACHE_ONLY': True,
|
||||||
'VIEWER_JWT': False,
|
|
||||||
'REQUIRES_AUTH': False,
|
'REQUIRES_AUTH': False,
|
||||||
'AUTH': 'NzRmYTg5YjgxMWExY2JiNzUwZDg1MjhkMTYzZjQ4YWYyOGEyZGJlMTp4OGx2NFd3QnNvY1lkamI2UVZsdjdDYlNwSDUrdm50YzdNNThvWDcwN1JrenJGZC9tR1lReUNlRjRSVklZeWhYZVpRS0tBcU9YYzRoTGY2Z1dlVkJFYkdJc0dMRHpoZWFZbU0reDRqZ1dkZ1diZmdIdGUrNUM5RVBySlM0VG1qcw==',
|
'AUTH': 'NzRmYTg5YjgxMWExY2JiNzUwZDg1MjhkMTYzZjQ4YWYyOGEyZGJlMTp4OGx2NFd3QnNvY1lkamI2UVZsdjdDYlNwSDUrdm50YzdNNThvWDcwN1JrenJGZC9tR1lReUNlRjRSVklZeWhYZVpRS0tBcU9YYzRoTGY2Z1dlVkJFYkdJc0dMRHpoZWFZbU0reDRqZ1dkZ1diZmdIdGUrNUM5RVBySlM0VG1qcw==',
|
||||||
'USER_AGENT': 'com.vimeo.android.videoapp (OnePlus, ONEPLUS A6003, OnePlus, Android 14/34 Version 11.8.1) Kotlin VimeoNetworking/3.12.0',
|
'USER_AGENT': 'com.vimeo.android.videoapp (OnePlus, ONEPLUS A6003, OnePlus, Android 14/34 Version 11.8.1) Kotlin VimeoNetworking/3.12.0',
|
||||||
@ -71,9 +70,21 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
|||||||
'resource_key', 'badge', 'upload', 'transcode', 'is_playable', 'has_audio',
|
'resource_key', 'badge', 'upload', 'transcode', 'is_playable', 'has_audio',
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
'macos_basic': {
|
||||||
|
'CACHE_ONLY': False,
|
||||||
|
'REQUIRES_AUTH': False,
|
||||||
|
'AUTH': 'NDc1N2JlN2Y5ZjZmMjU3NzE3NTRkZTg1NmY2YzU2MTI0OTFlNjJiYjpwVUNDWUlBZmZqSHhQcndBYWxGMzgyYys2NkN5d1JrREJZZXdPcEdsU05tdjFlVVo2aE1lYk9GcWE3ZW9KVldlYnFlOWh5Vno5UWtpUGJ5empYZFBpYkFwV0FFTnB5VWV4ZEh3aHZnRUNEL0VySnBzTmFraDdNbS9nMXhWanhIcw==',
|
||||||
|
'USER_AGENT': 'Vimeo/1.6.3 (com.vimeo.mac; build:251121.142637.0; macOS 13.7.8) Alamofire/5.9.0 VimeoNetworking/5.0.0',
|
||||||
|
'VIDEOS_FIELDS': (
|
||||||
|
'uri', 'name', 'description', 'type', 'link', 'player_embed_url', 'duration', 'width',
|
||||||
|
'language', 'height', 'embed', 'created_time', 'modified_time', 'release_time', 'content_rating',
|
||||||
|
'content_rating_class', 'rating_mod_locked', 'license', 'privacy', 'pictures', 'tags', 'stats',
|
||||||
|
'categories', 'uploader', 'metadata', 'user', 'files', 'download', 'app', 'play', 'status',
|
||||||
|
'resource_key', 'badge', 'upload', 'transcode', 'is_playable', 'has_audio',
|
||||||
|
),
|
||||||
|
},
|
||||||
'web': {
|
'web': {
|
||||||
'CACHE_ONLY': False,
|
'CACHE_ONLY': False,
|
||||||
'VIEWER_JWT': True,
|
|
||||||
'REQUIRES_AUTH': True,
|
'REQUIRES_AUTH': True,
|
||||||
'USER_AGENT': None,
|
'USER_AGENT': None,
|
||||||
'VIDEOS_FIELDS': (
|
'VIDEOS_FIELDS': (
|
||||||
@ -151,7 +162,8 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
|||||||
if self._LOGIN_REQUIRED:
|
if self._LOGIN_REQUIRED:
|
||||||
self.raise_login_required()
|
self.raise_login_required()
|
||||||
|
|
||||||
if self._DEFAULT_CLIENT != 'web':
|
# Don't auto-load token from cache if the user has specified a client
|
||||||
|
if self._configuration_arg('client', [None], ie_key=VimeoIE)[0]:
|
||||||
return
|
return
|
||||||
|
|
||||||
for client_name, client_config in self._CLIENT_CONFIGS.items():
|
for client_name, client_config in self._CLIENT_CONFIGS.items():
|
||||||
@ -336,11 +348,14 @@ class VimeoBaseInfoExtractor(InfoExtractor):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def _fetch_oauth_token(self, client):
|
def _fetch_oauth_token(self, client):
|
||||||
client_config = self._CLIENT_CONFIGS[client]
|
base_client, _, variant = client.partition('_')
|
||||||
|
if base_client == 'web':
|
||||||
if client_config['VIEWER_JWT']:
|
|
||||||
return f'jwt {self._fetch_viewer_info()["jwt"]}'
|
return f'jwt {self._fetch_viewer_info()["jwt"]}'
|
||||||
|
|
||||||
|
client_config = self._CLIENT_CONFIGS[client]
|
||||||
|
if variant == 'basic':
|
||||||
|
return f'Basic {client_config["AUTH"]}'
|
||||||
|
|
||||||
cache_key = client_config['CACHE_KEY']
|
cache_key = client_config['CACHE_KEY']
|
||||||
|
|
||||||
if not self._oauth_tokens.get(cache_key):
|
if not self._oauth_tokens.get(cache_key):
|
||||||
@ -1182,6 +1197,9 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
'If your IP address is located in Europe you could try using a VPN/proxy,',
|
'If your IP address is located in Europe you could try using a VPN/proxy,',
|
||||||
f'or else u{self._login_hint()[1:]}',
|
f'or else u{self._login_hint()[1:]}',
|
||||||
delim=' '), method=None)
|
delim=' '), method=None)
|
||||||
|
# XXX: Temporary while macos_basic is the default client
|
||||||
|
elif e.cause.status == 401 and self._get_requested_client() == 'macos_basic':
|
||||||
|
self.raise_login_required('The Vimeo extractor only works when logged-in')
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@ -1190,6 +1208,10 @@ class VimeoIE(VimeoBaseInfoExtractor):
|
|||||||
else:
|
else:
|
||||||
info = self._parse_api_response(video, video_id, unlisted_hash)
|
info = self._parse_api_response(video, video_id, unlisted_hash)
|
||||||
|
|
||||||
|
# XXX: Temporary while macos_basic is the default client
|
||||||
|
if not info.get('formats') and self._get_requested_client() == 'macos_basic':
|
||||||
|
self.raise_login_required('The Vimeo extractor only works when logged-in')
|
||||||
|
|
||||||
source_format = self._extract_original_format(
|
source_format = self._extract_original_format(
|
||||||
f'https://vimeo.com/{video_id}', video_id, unlisted_hash)
|
f'https://vimeo.com/{video_id}', video_id, unlisted_hash)
|
||||||
if source_format:
|
if source_format:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user