aboutsummaryrefslogtreecommitdiffhomepage
path: root/youtube_dl
diff options
context:
space:
mode:
authordirkf <[email protected]>2024-08-06 20:59:09 +0100
committerdirkf <[email protected]>2024-08-06 20:59:09 +0100
commitc5098961b04ce83f4615f2a846c84f803b072639 (patch)
treee899e417756b70266dd82ee5e18002aeef060b16 /youtube_dl
parentdbc08fba83a0e6c5215e8cec97eb4076f85eee5f (diff)
downloadyoutube-dl-c5098961b04ce83f4615f2a846c84f803b072639.tar.gz
youtube-dl-c5098961b04ce83f4615f2a846c84f803b072639.zip
[Youtube] Rework n function extraction pattern
Now also succeeds with player b12cc44b
Diffstat (limited to 'youtube_dl')
-rw-r--r--youtube_dl/extractor/youtube.py43
1 files changed, 26 insertions, 17 deletions
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index 509e374a4..6fe520e9a 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -1661,23 +1661,33 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
# new: (b=String.fromCharCode(110),c=a.get(b))&&c=nfunc[idx](c)
# or: (b="nn"[+a.D],c=a.get(b))&&(c=nfunc[idx](c)
# or: (PL(a),b=a.j.n||null)&&(b=nfunc[idx](b)
- # old: .get("n"))&&(b=nfunc[idx](b)
- # older: .get("n"))&&(b=nfunc(b)
+ # or: (b="nn"[+a.D],vL(a),c=a.j[b]||null)&&(c=narray[idx](c),a.set(b,c),narray.length||nfunc("")
+ # old: (b=a.get("n"))&&(b=nfunc[idx](b)(?P<c>[a-z])\s*=\s*[a-z]\s*
+ # older: (b=a.get("n"))&&(b=nfunc(b)
r'''(?x)
- (?:\((?:[\w$()\s]+,)*?\s*(?P<b>[a-z])\s*=\s*(?:
- String\s*\.\s*fromCharCode\s*\(\s*110\s*\)|
- "n+"\[\s*\+?s*[\w$.]+\s*]|
- (?P<b1>(?:[\w$]+\s*\.\s*)+n\b(?:(?!&&).)+\))
- )\s*
- (?(b1)
- &&\s*\(\s*(?P=b)|
- (?:
- ,(?P<c>[a-z])\s*=\s*[a-z]\s*)?
- \.\s*get\s*\(\s*(?(b)(?P=b)|"n{1,2}")(?:\s*\)){2}\s*
- &&\s*\(\s*(?(c)(?P=c)|(?P=b))
- )
- )\s*=\s*
- (?P<nfunc>[a-zA-Z_$][\w$]*)(?:\s*\[(?P<idx>\d+)\])?\s*\(\s*[\w$]+\s*\)
+ \((?:[\w$()\s]+,)*?\s* # (
+ (?P<b>[a-z])\s*=\s* # b=
+ (?:
+ (?: # expect ,c=a.get(b) (etc)
+ String\s*\.\s*fromCharCode\s*\(\s*110\s*\)|
+ "n+"\[\s*\+?s*[\w$.]+\s*]
+ )\s*(?:,[\w$()\s]+(?=,))*|
+ (?P<old>[\w$]+) # a (old[er])
+ )\s*
+ (?(old)
+ # b.get("n")
+ (?:\.\s*[\w$]+\s*|\[\s*[\w$]+\s*]\s*)*?
+ (?:\.\s*n|\[\s*"n"\s*]|\.\s*get\s*\(\s*"n"\s*\))
+ | # ,c=a.get(b)
+ ,\s*(?P<c>[a-z])\s*=\s*[a-z]\s*
+ (?:\.\s*[\w$]+\s*|\[\s*[\w$]+\s*]\s*)*?
+ (?:\[\s*(?P=b)\s*]|\.\s*get\s*\(\s*(?P=b)\s*\))
+ )
+ # interstitial junk
+ \s*(?:\|\|\s*null\s*)?(?:\)\s*)?&&\s*(?:\(\s*)?
+ (?(c)(?P=c)|(?P=b))\s*=\s* # [c|b]=
+ # nfunc|nfunc[idx]
+ (?P<nfunc>[a-zA-Z_$][\w$]*)(?:\s*\[(?P<idx>\d+)\])?\s*\(\s*[\w$]+\s*\)
''', jscode, 'Initial JS player n function name', group=('nfunc', 'idx'),
default=(None, None))
# thx bashonly: yt-dlp/yt-dlp/pull/10611
@@ -1690,7 +1700,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
\s*\{(?:(?!};).)+?["']enhanced_except_
''', jscode, 'Initial JS player n function name', group='name')
if not idx:
- self.report_warning('Falling back to generic n function search')
return func_name
return self._parse_json(self._search_regex(