aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbashonly <88596187+bashonly@users.noreply.github.com>2025-01-25 10:18:15 -0600
committerGitHub <noreply@github.com>2025-01-25 16:18:15 +0000
commitf0d4b8a5d6354b294bc9631cf15a7160b7bad5de (patch)
treec89d32352c6640cf719bc1c883b8c78f3ca81645
parent6b91d232e316efa406035915532eb126fbaeea38 (diff)
[ie/youtube] Restore convenience workarounds (#12181)
Authored by: bashonly
-rw-r--r--README.md2
-rw-r--r--yt_dlp/extractor/youtube.py13
2 files changed, 14 insertions, 1 deletions
diff --git a/README.md b/README.md
index dca3fe8d0..fd5547d36 100644
--- a/README.md
+++ b/README.md
@@ -1769,7 +1769,7 @@ The following extractors use this feature:
#### youtube
* `lang`: Prefer translated metadata (`title`, `description` etc) of this language code (case-sensitive). By default, the video primary language metadata is preferred, with a fallback to `en` translated. See [youtube.py](https://github.com/yt-dlp/yt-dlp/blob/c26f9b991a0681fd3ea548d535919cec1fbbd430/yt_dlp/extractor/youtube.py#L381-L390) for list of supported content language codes
* `skip`: One or more of `hls`, `dash` or `translated_subs` to skip extraction of the m3u8 manifests, dash manifests and [auto-translated subtitles](https://github.com/yt-dlp/yt-dlp/issues/4090#issuecomment-1158102032) respectively
-* `player_client`: Clients to extract video data from. The main clients are `web`, `ios` and `android`, with variants `_music` and `_creator` (e.g. `ios_creator`); and `mweb`, `android_vr`, `web_safari`, `web_embedded`, `tv` and `tv_embedded` with no variants. By default, `tv,ios,web` is used, or `tv,web` is used when authenticating with cookies. The `_music` variants may be added for `music.youtube.com` URLs. Some clients, such as `web` and `android`, require a `po_token` for their formats to be downloadable. Some clients, such as the `_creator` variants, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
+* `player_client`: Clients to extract video data from. The main clients are `web`, `ios` and `android`, with variants `_music` and `_creator` (e.g. `ios_creator`); and `mweb`, `android_vr`, `web_safari`, `web_embedded`, `tv` and `tv_embedded` with no variants. By default, `tv,ios,web` is used, or `tv,web` is used when authenticating with cookies. The `web_music` client is added for `music.youtube.com` URLs when logged-in cookies are used. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` and `web_music`, require a `po_token` for their formats to be downloadable. Some clients, such as the `_creator` variants, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
* `player_skip`: Skip some network requests that are generally needed for robust extraction. One or more of `configs` (skip client configs), `webpage` (skip initial webpage), `js` (skip js player). While these options can help reduce the number of requests needed or avoid some rate-limiting, they could cause some issues. See [#860](https://github.com/yt-dlp/yt-dlp/pull/860) for more details
* `player_params`: YouTube player parameters to use for player requests. Will overwrite any default ones set by yt-dlp.
* `comment_sort`: `top` or `new` (default) - choose comment sorting mode (on YouTube's side)
diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index 69db2b1ac..d84e8df33 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -4030,6 +4030,9 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
raise ExtractorError('No player clients have been requested', expected=True)
if self.is_authenticated:
+ if (smuggled_data.get('is_music_url') or self.is_music_url(url)) and 'web_music' not in requested_clients:
+ requested_clients.append('web_music')
+
unsupported_clients = [
client for client in requested_clients if not INNERTUBE_CLIENTS[client]['SUPPORTS_COOKIES']
]
@@ -4169,6 +4172,16 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
else:
prs.append(pr)
+ # EU countries require age-verification for accounts to access age-restricted videos
+ # If account is not age-verified, _is_agegated() will be truthy for non-embedded clients
+ if self.is_authenticated and self._is_agegated(pr):
+ self.to_screen(
+ f'{video_id}: This video is age-restricted and YouTube is requiring '
+ 'account age-verification; some formats may be missing', only_once=True)
+ # tv_embedded can work around the age-verification requirement for embeddable videos
+ # web_creator may work around age-verification for all videos but requires PO token
+ append_client('tv_embedded', 'web_creator')
+
prs.extend(deprioritized_prs)
if skipped_clients: