mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-12-06 06:45:00 +01:00
[ie/youtube] Add use_ad_playback_context extractor-arg (#15220)
Closes #15144 Authored by: WhatAmISupposedToPutHere
This commit is contained in:
parent
017d76edcf
commit
f7acf3c1f4
3 changed files with 24 additions and 5 deletions
|
|
@ -1871,6 +1871,7 @@ The following extractors use this feature:
|
||||||
* `pot_trace`: Enable debug logging for PO Token fetching. Either `true` or `false` (default)
|
* `pot_trace`: Enable debug logging for PO Token fetching. Either `true` or `false` (default)
|
||||||
* `fetch_pot`: Policy to use for fetching a PO Token from providers. One of `always` (always try fetch a PO Token regardless if the client requires one for the given context), `never` (never fetch a PO Token), or `auto` (default; only fetch a PO Token if the client requires one for the given context)
|
* `fetch_pot`: Policy to use for fetching a PO Token from providers. One of `always` (always try fetch a PO Token regardless if the client requires one for the given context), `never` (never fetch a PO Token), or `auto` (default; only fetch a PO Token if the client requires one for the given context)
|
||||||
* `jsc_trace`: Enable debug logging for JS Challenge fetching. Either `true` or `false` (default)
|
* `jsc_trace`: Enable debug logging for JS Challenge fetching. Either `true` or `false` (default)
|
||||||
|
* `use_ad_playback_context`: Skip preroll ads to eliminate the mandatory wait period before download. Do NOT use this when passing premium account cookies to yt-dlp, as it will result in a loss of premium formats. Only effective with the `web`, `web_safari`, `web_music` and `mweb` player clients. Either `true` or `false` (default)
|
||||||
|
|
||||||
#### youtube-ejs
|
#### youtube-ejs
|
||||||
* `jitless`: Run suported Javascript engines in JIT-less mode. Supported runtimes are `deno`, `node` and `bun`. Provides better security at the cost of performance/speed. Do note that `node` and `bun` are still considered unsecure. Either `true` or `false` (default)
|
* `jitless`: Run suported Javascript engines in JIT-less mode. Supported runtimes are `deno`, `node` and `bun`. Provides better security at the cost of performance/speed. Do note that `node` and `bun` are still considered unsecure. Either `true` or `false` (default)
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@ INNERTUBE_CLIENTS = {
|
||||||
},
|
},
|
||||||
'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
|
'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
|
||||||
'SUPPORTS_COOKIES': True,
|
'SUPPORTS_COOKIES': True,
|
||||||
|
'SUPPORTS_AD_PLAYBACK_CONTEXT': True,
|
||||||
**WEB_PO_TOKEN_POLICIES,
|
**WEB_PO_TOKEN_POLICIES,
|
||||||
},
|
},
|
||||||
# Safari UA returns pre-merged video+audio 144p/240p/360p/720p/1080p HLS formats
|
# Safari UA returns pre-merged video+audio 144p/240p/360p/720p/1080p HLS formats
|
||||||
|
|
@ -117,6 +118,7 @@ INNERTUBE_CLIENTS = {
|
||||||
},
|
},
|
||||||
'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
|
'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
|
||||||
'SUPPORTS_COOKIES': True,
|
'SUPPORTS_COOKIES': True,
|
||||||
|
'SUPPORTS_AD_PLAYBACK_CONTEXT': True,
|
||||||
**WEB_PO_TOKEN_POLICIES,
|
**WEB_PO_TOKEN_POLICIES,
|
||||||
},
|
},
|
||||||
'web_embedded': {
|
'web_embedded': {
|
||||||
|
|
@ -157,6 +159,7 @@ INNERTUBE_CLIENTS = {
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
'SUPPORTS_COOKIES': True,
|
'SUPPORTS_COOKIES': True,
|
||||||
|
'SUPPORTS_AD_PLAYBACK_CONTEXT': True,
|
||||||
},
|
},
|
||||||
# This client now requires sign-in for every video
|
# This client now requires sign-in for every video
|
||||||
'web_creator': {
|
'web_creator': {
|
||||||
|
|
@ -313,6 +316,7 @@ INNERTUBE_CLIENTS = {
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
'SUPPORTS_COOKIES': True,
|
'SUPPORTS_COOKIES': True,
|
||||||
|
'SUPPORTS_AD_PLAYBACK_CONTEXT': True,
|
||||||
},
|
},
|
||||||
'tv': {
|
'tv': {
|
||||||
'INNERTUBE_CONTEXT': {
|
'INNERTUBE_CONTEXT': {
|
||||||
|
|
@ -412,6 +416,7 @@ def build_innertube_clients():
|
||||||
ytcfg.setdefault('SUBS_PO_TOKEN_POLICY', SubsPoTokenPolicy())
|
ytcfg.setdefault('SUBS_PO_TOKEN_POLICY', SubsPoTokenPolicy())
|
||||||
ytcfg.setdefault('REQUIRE_AUTH', False)
|
ytcfg.setdefault('REQUIRE_AUTH', False)
|
||||||
ytcfg.setdefault('SUPPORTS_COOKIES', False)
|
ytcfg.setdefault('SUPPORTS_COOKIES', False)
|
||||||
|
ytcfg.setdefault('SUPPORTS_AD_PLAYBACK_CONTEXT', False)
|
||||||
ytcfg.setdefault('PLAYER_PARAMS', None)
|
ytcfg.setdefault('PLAYER_PARAMS', None)
|
||||||
ytcfg.setdefault('AUTHENTICATED_USER_AGENT', None)
|
ytcfg.setdefault('AUTHENTICATED_USER_AGENT', None)
|
||||||
ytcfg['INNERTUBE_CONTEXT']['client'].setdefault('hl', 'en')
|
ytcfg['INNERTUBE_CONTEXT']['client'].setdefault('hl', 'en')
|
||||||
|
|
|
||||||
|
|
@ -2629,16 +2629,23 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
||||||
return {'contentCheckOk': True, 'racyCheckOk': True}
|
return {'contentCheckOk': True, 'racyCheckOk': True}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _generate_player_context(cls, sts=None):
|
def _generate_player_context(cls, sts=None, use_ad_playback_context=False):
|
||||||
context = {
|
context = {
|
||||||
'html5Preference': 'HTML5_PREF_WANTS',
|
'html5Preference': 'HTML5_PREF_WANTS',
|
||||||
}
|
}
|
||||||
if sts is not None:
|
if sts is not None:
|
||||||
context['signatureTimestamp'] = sts
|
context['signatureTimestamp'] = sts
|
||||||
return {
|
|
||||||
'playbackContext': {
|
playback_context = {
|
||||||
'contentPlaybackContext': context,
|
'contentPlaybackContext': context,
|
||||||
},
|
}
|
||||||
|
if use_ad_playback_context:
|
||||||
|
playback_context['adPlaybackContext'] = {
|
||||||
|
'pyv': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
'playbackContext': playback_context,
|
||||||
**cls._get_checkok_params(),
|
**cls._get_checkok_params(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2866,7 +2873,13 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
||||||
yt_query['serviceIntegrityDimensions'] = {'poToken': po_token}
|
yt_query['serviceIntegrityDimensions'] = {'poToken': po_token}
|
||||||
|
|
||||||
sts = self._extract_signature_timestamp(video_id, player_url, webpage_ytcfg, fatal=False) if player_url else None
|
sts = self._extract_signature_timestamp(video_id, player_url, webpage_ytcfg, fatal=False) if player_url else None
|
||||||
yt_query.update(self._generate_player_context(sts))
|
|
||||||
|
use_ad_playback_context = (
|
||||||
|
self._configuration_arg('use_ad_playback_context', ['false'])[0] != 'false'
|
||||||
|
and traverse_obj(INNERTUBE_CLIENTS, (client, 'SUPPORTS_AD_PLAYBACK_CONTEXT', {bool})))
|
||||||
|
|
||||||
|
yt_query.update(self._generate_player_context(sts, use_ad_playback_context))
|
||||||
|
|
||||||
return self._extract_response(
|
return self._extract_response(
|
||||||
item_id=video_id, ep='player', query=yt_query,
|
item_id=video_id, ep='player', query=yt_query,
|
||||||
ytcfg=player_ytcfg, headers=headers, fatal=True,
|
ytcfg=player_ytcfg, headers=headers, fatal=True,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue