aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2025-11-04 20:51:08 +0000
committerdirkf <fieldhouse@gmx.net>2025-11-21 01:52:11 +0000
commitc55ace3c503c7bddb9c25112bd19bea282bbae59 (patch)
treecbb2a3ec5f241e3a2e9728079d6932b0f1609b1c
parent43e3121020c95b6b31e8fe629ef170b448c2ff70 (diff)
[YouTube] Use insertion-order-preserving dict for InnerTube client data
-rw-r--r--youtube_dl/extractor/youtube.py45
1 files changed, 30 insertions, 15 deletions
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index c045bc8bc..ce23b39bb 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -17,6 +17,8 @@ from ..compat import (
compat_chr,
compat_HTTPError,
compat_map as map,
+ compat_dict as o_dict,
+ compat_dict_items as dict_items,
compat_str,
compat_urllib_parse,
compat_urllib_parse_parse_qs as compat_parse_qs,
@@ -86,8 +88,9 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
_PLAYLIST_ID_RE = r'(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM)'
- _INNERTUBE_CLIENTS = {
- 'ios': {
+ # priority order for now
+ _INNERTUBE_CLIENTS = o_dict((
+ ('ios', {
'INNERTUBE_CONTEXT': {
'client': {
'clientName': 'IOS',
@@ -100,12 +103,13 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
},
},
'INNERTUBE_CONTEXT_CLIENT_NAME': 5,
- 'REQUIRE_PO_TOKEN': False,
+ 'REQUIRE_PO_TOKEN': True,
'REQUIRE_JS_PLAYER': False,
- },
+ 'WITH_COOKIES': False,
+ }),
# mweb has 'ultralow' formats
# See: https://github.com/yt-dlp/yt-dlp/pull/557
- 'mweb': {
+ ('mweb', {
'INNERTUBE_CONTEXT': {
'client': {
'clientName': 'MWEB',
@@ -117,8 +121,8 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
'INNERTUBE_CONTEXT_CLIENT_NAME': 2,
'REQUIRE_PO_TOKEN': True,
'SUPPORTS_COOKIES': True,
- },
- 'tv': {
+ }),
+ ('tv', {
'INNERTUBE_CONTEXT': {
'client': {
'clientName': 'TVHTML5',
@@ -128,10 +132,8 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
},
},
'INNERTUBE_CONTEXT_CLIENT_NAME': 7,
- 'SUPPORTS_COOKIES': True,
- },
-
- 'web': {
+ }),
+ ('web', {
'INNERTUBE_CONTEXT': {
'client': {
'clientName': 'WEB',
@@ -141,10 +143,20 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
},
'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
'REQUIRE_PO_TOKEN': True,
+ }),
+ ('web_embedded', {
+ 'INNERTUBE_CONTEXT': {
+ 'client': {
+ 'clientName': 'WEB_EMBEDDED_PLAYER',
+ 'clientVersion': '1.20250923.21.00',
+ 'embedUrl': 'https://www.youtube.com/', # Can be any valid URL
+ },
+ },
+ 'INNERTUBE_CONTEXT_CLIENT_NAME': 56,
'SUPPORTS_COOKIES': True,
- },
+ }),
# Safari UA returns pre-merged video+audio 144p/240p/360p/720p/1080p HLS formats
- 'web_safari': {
+ ('web_safari', {
'INNERTUBE_CONTEXT': {
'client': {
'clientName': 'WEB',
@@ -152,8 +164,11 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15,gzip(gfe)',
},
},
- },
- }
+ 'INNERTUBE_CONTEXT_CLIENT_NAME': 1,
+ 'SUPPORTS_COOKIES': True,
+ 'REQUIRE_PO': True,
+ }),
+ ))
def _login(self):
"""