Skip to content

Commit 3d64984

Browse files
committed
[YouTube] Simplify pattern for nsig function name extraction
1 parent 9bc8fcf commit 3d64984

File tree

2 files changed

+23
-27
lines changed

2 files changed

+23
-27
lines changed

test/test_youtube_signature.py

+4
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@
206206
'https://www.youtube.com/s/player/3bb1f723/player_ias.vflset/en_US/base.js',
207207
'gK15nzVyaXE9RsMP3z', 'ZFFWFLPWx9DEgQ',
208208
),
209+
(
210+
'https://www.youtube.com/s/player/f8f53e1a/player_ias.vflset/en_US/base.js',
211+
'VTQOUOv0mCIeJ7i8kZB', 'kcfD8wy0sNLyNQ',
212+
),
209213
]
210214

211215

youtube_dl/extractor/youtube.py

+19-27
Original file line numberDiff line numberDiff line change
@@ -1665,37 +1665,29 @@ def _decrypt_nsig(self, n, video_id, player_url):
16651665

16661666
def _extract_n_function_name(self, jscode):
16671667
func_name, idx = self._search_regex(
1668+
# (y=NuD(),Mw(k),q=k.Z[y]||null)&&(q=narray[idx](q),k.set(y,q),k.V||NuD(''))}};
16681669
# (R="nn"[+J.Z],mW(J),N=J.K[R]||null)&&(N=narray[idx](N),J.set(R,N))}};
1669-
# new: (b=String.fromCharCode(110),c=a.get(b))&&c=nfunc[idx](c)
1670-
# or: (b="nn"[+a.D],c=a.get(b))&&(c=nfunc[idx](c)
1671-
# or: (PL(a),b=a.j.n||null)&&(b=nfunc[idx](b)
1670+
# or: (b=String.fromCharCode(110),c=a.get(b))&&c=narray[idx](c)
1671+
# or: (b="nn"[+a.D],c=a.get(b))&&(c=narray[idx](c)
1672+
# or: (PL(a),b=a.j.n||null)&&(b=narray[idx](b)
16721673
# or: (b="nn"[+a.D],vL(a),c=a.j[b]||null)&&(c=narray[idx](c),a.set(b,c),narray.length||nfunc("")
1673-
# old: (b=a.get("n"))&&(b=nfunc[idx](b)(?P<c>[a-z])\s*=\s*[a-z]\s*
1674+
# old: (b=a.get("n"))&&(b=narray[idx](b)(?P<c>[a-z])\s*=\s*[a-z]\s*
16741675
# older: (b=a.get("n"))&&(b=nfunc(b)
16751676
r'''(?x)
1676-
\((?:[\w$()\s]+,)*?\s* # (
1677-
(?P<b>[a-zA-Z])\s*=\s* # b=, R=
1678-
(?:
1679-
(?: # expect ,c=a.get(b) (etc)
1680-
String\s*\.\s*fromCharCode\s*\(\s*110\s*\)|
1681-
"n+"\[\s*\+?s*[\w$.]+\s*]
1682-
)\s*(?:,[\w$()\s]+(?=,))*|
1683-
(?P<old>[\w$]+) # a (old[er])
1684-
)\s*
1685-
(?(old)
1686-
# b.get("n")
1687-
(?:\.\s*[\w$]+\s*|\[\s*[\w$]+\s*]\s*)*?
1688-
(?:\.\s*n|\[\s*"n"\s*]|\.\s*get\s*\(\s*"n"\s*\))
1689-
| # ,c=a.get(b)
1690-
,\s*(?P<c>[a-zA-Z])\s*=\s*[a-zA-Z]\s*
1691-
(?:\.\s*[\w$]+\s*|\[\s*[\w$]+\s*]\s*)*?
1692-
(?:\[\s*(?P=b)\s*]|\.\s*get\s*\(\s*(?P=b)\s*\))
1693-
)
1694-
# interstitial junk
1695-
\s*(?:\|\|\s*null\s*)?(?:\)\s*)?&&\s*(?:\(\s*)?
1696-
(?(c)(?P=c)|(?P=b))\s*=\s* # [c|b]=
1697-
# nfunc|nfunc[idx]
1698-
(?P<nfunc>[a-zA-Z_$][\w$]*)(?:\s*\[(?P<idx>\d+)\])?\s*\(\s*[\w$]+\s*\)
1677+
# (expr, ...,
1678+
\((?:(?:\s*[\w$]+\s*=)?(?:[\w$"+\.\s(\[]+(?:[)\]]\s*)?),)*
1679+
# b=...
1680+
(?P<b>[\w$]+)\s*=\s*(?!(?P=b)[^\w$])[\w$]+\s*(?:(?:
1681+
\.\s*[\w$]+ |
1682+
\[\s*[\w$]+\s*\] |
1683+
\.\s*get\s*\(\s*[\w$"]+\s*\)
1684+
)\s*){,2}(?:\s*\|\|\s*null(?=\s*\)))?\s*
1685+
\)\s*&&\s*\( # ...)&&(
1686+
# b = nfunc, b = narray[idx]
1687+
(?P=b)\s*=\s*(?P<nfunc>[\w$]+)\s*
1688+
(?:\[\s*(?P<idx>[\w$]+)\s*\]\s*)?
1689+
# (...)
1690+
\(\s*[\w$]+\s*\)
16991691
''', jscode, 'Initial JS player n function name', group=('nfunc', 'idx'),
17001692
default=(None, None))
17011693
# thx bashonly: yt-dlp/yt-dlp/pull/10611

0 commit comments

Comments
 (0)