mirror of https://github.com/yt-dlp/yt-dlp.git
[ie/youtube] Fix age-verification workaround (#10610)
Authored by: bashonly, Grub4K Co-authored-by: Simon Sawicki <contact@grub4k.xyz>
This commit is contained in:
parent
011b4a04db
commit
d19fcb9342
|
@ -1767,7 +1767,7 @@ The following extractors use this feature:
|
||||||
#### youtube
|
#### 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
|
* `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
|
* `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. `web_creator`); and `mediaconnect`, `mweb`, `android_producer`, `android_testsuite`, `android_vr`, `web_safari`, `web_embedded`, `tv` and `tv_embedded` with no variants. By default, `ios,web` is used, but `tv_embedded` and `_creator` variants are added as required for age-gated videos. Similarly, the music variants are added for `music.youtube.com` urls. Most `android` clients will be given lowest priority since their formats are broken. You can use `all` to use all the clients, and `default` for the default clients.
|
* `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 `mediaconnect`, `mweb`, `android_producer`, `android_testsuite`, `android_vr`, `web_safari`, `web_embedded`, `tv` and `tv_embedded` with no variants. By default, `ios,web` is used, but `tv_embedded`, `web_creator` and `mediaconnect` are added as required for age-gated videos. Similarly, the music variants are added for `music.youtube.com` urls. Most `android` clients will be given lowest priority since their formats are broken. You can use `all` to use all the clients, and `default` for the default clients.
|
||||||
* `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_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.
|
* `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)
|
* `comment_sort`: `top` or `new` (default) - choose comment sorting mode (on YouTube's side)
|
||||||
|
|
|
@ -3854,14 +3854,28 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
||||||
f[STREAMING_DATA_CLIENT_NAME] = name
|
f[STREAMING_DATA_CLIENT_NAME] = name
|
||||||
prs.append(pr)
|
prs.append(pr)
|
||||||
|
|
||||||
# creator clients can bypass AGE_VERIFICATION_REQUIRED if logged in
|
# tv_embedded can work around age-gate and age-verification IF the video is embeddable
|
||||||
if variant == 'tv_embedded' and self._is_unplayable(pr) and self.is_authenticated:
|
if self._is_agegated(pr) and variant != 'tv_embedded':
|
||||||
append_client(f'{base_client}_creator')
|
|
||||||
elif variant != 'tv_embedded' and self._is_agegated(pr):
|
|
||||||
if self.is_authenticated:
|
|
||||||
append_client(f'{base_client}_creator')
|
|
||||||
append_client(f'tv_embedded.{base_client}')
|
append_client(f'tv_embedded.{base_client}')
|
||||||
|
|
||||||
|
# Unauthenticated users will only get tv_embedded client formats if age-gated
|
||||||
|
if self._is_agegated(pr) and not self.is_authenticated:
|
||||||
|
self.to_screen(
|
||||||
|
f'{video_id}: This video is age-restricted; some formats may be missing '
|
||||||
|
f'without authentication. {self._login_hint()}', only_once=True)
|
||||||
|
|
||||||
|
# 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 embedding is disabled for the video, _is_unplayable() will be truthy for tv_embedded
|
||||||
|
embedding_is_disabled = variant == 'tv_embedded' and self._is_unplayable(pr)
|
||||||
|
if self.is_authenticated and (self._is_agegated(pr) or embedding_is_disabled):
|
||||||
|
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)
|
||||||
|
# web_creator and mediaconnect can work around the age-verification requirement
|
||||||
|
# _producer, _testsuite, & _vr variants can also work around age-verification
|
||||||
|
append_client('web_creator', 'mediaconnect')
|
||||||
|
|
||||||
if skipped_clients:
|
if skipped_clients:
|
||||||
self.report_warning(
|
self.report_warning(
|
||||||
f'Skipping player responses from {"/".join(skipped_clients)} clients '
|
f'Skipping player responses from {"/".join(skipped_clients)} clients '
|
||||||
|
|
Loading…
Reference in New Issue