Skip to content

Commit ebb53fb

Browse files
authored
Merge pull request #1290 from FineFindus/fix/deobfuscation-function
[YouTube] Fix signature deobfuscation function name extraction
2 parents 1b8864a + 249f8f8 commit ebb53fb

3 files changed

Lines changed: 23 additions & 16 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSignatureUtils.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ final class YoutubeSignatureUtils {
2424

2525
private static final Pattern[] FUNCTION_REGEXES = {
2626
// CHECKSTYLE:OFF
27+
Pattern.compile("\\b(?:[a-zA-Z0-9_$]+)&&\\((?:[a-zA-Z0-9_$]+)=([a-zA-Z0-9_$]{2,})\\(decodeURIComponent\\((?:[a-zA-Z0-9_$]+)\\)\\)"),
2728
Pattern.compile("\\bm=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(h\\.s\\)\\)"),
2829
Pattern.compile("\\bc&&\\(c=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(c\\)\\)"),
2930
Pattern.compile("(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)"),
@@ -36,9 +37,12 @@ final class YoutubeSignatureUtils {
3637
private static final String DEOBF_FUNC_REGEX_START = "(";
3738
private static final String DEOBF_FUNC_REGEX_END = "=function\\([a-zA-Z0-9_]+\\)\\{.+?\\})";
3839

39-
private static final String SIG_DEOBF_HELPER_OBJ_NAME_REGEX = ";([A-Za-z0-9_\\$]{2,})\\...\\(";
40+
// CHECKSTYLE:OFF
41+
private static final String SIG_DEOBF_GLOBAL_ARRAY_REGEX = "(var [A-z]=['\"].*['\"].split\\(\";\"\\))";
42+
private static final String SIG_DEOBF_HELPER_OBJ_NAME_REGEX = ";([A-Za-z0-9_\\$]{2,})\\[..";
4043
private static final String SIG_DEOBF_HELPER_OBJ_REGEX_START = "(var ";
4144
private static final String SIG_DEOBF_HELPER_OBJ_REGEX_END = "=\\{(?>.|\\n)+?\\}\\};)";
45+
// CHECKSTYLE:ON
4246

4347
private YoutubeSignatureUtils() {
4448
}
@@ -87,6 +91,9 @@ static String getDeobfuscationCode(@Nonnull final String javaScriptPlayerCode)
8791
// Assert the extracted deobfuscation function is valid
8892
JavaScript.compileOrThrow(deobfuscationFunction);
8993

94+
final String globalVar =
95+
Parser.matchGroup1(SIG_DEOBF_GLOBAL_ARRAY_REGEX, javaScriptPlayerCode);
96+
9097
final String helperObjectName =
9198
Parser.matchGroup1(SIG_DEOBF_HELPER_OBJ_NAME_REGEX, deobfuscationFunction);
9299

@@ -97,7 +104,7 @@ static String getDeobfuscationCode(@Nonnull final String javaScriptPlayerCode)
97104
+ deobfuscationFunctionName
98105
+ "(a);}";
99106

100-
return helperObject + deobfuscationFunction + ";" + callerFunction;
107+
return globalVar + ";" + helperObject + deobfuscationFunction + ";" + callerFunction;
101108
} catch (final Exception e) {
102109
throw new ParsingException("Could not parse deobfuscation function", e);
103110
}

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/signatures/generated_mock_0.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
"cross-origin"
3636
],
3737
"date": [
38-
"Tue, 11 Feb 2025 21:26:31 GMT"
38+
"Fri, 11 Jul 2025 18:17:45 GMT"
3939
],
4040
"expires": [
41-
"Tue, 11 Feb 2025 21:26:31 GMT"
41+
"Fri, 11 Jul 2025 18:17:45 GMT"
4242
],
4343
"origin-trial": [
4444
"AmhMBR6zCLzDDxpW+HfpP67BqwIknWnyMOXOQGfzYswFmJe+fgaI6XZgAzcxOrzNtP7hEDsOo1jdjFnVr2IdxQ4AAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTc1ODA2NzE5OSwiaXNTdWJkb21haW4iOnRydWV9"
@@ -56,10 +56,10 @@
5656
"ESF"
5757
],
5858
"set-cookie": [
59-
"YSC\u003d_RnQFljRZ7g; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
60-
"VISITOR_INFO1_LIVE\u003dFTq2gAjABPk; Domain\u003d.youtube.com; Expires\u003dSun, 10-Aug-2025 21:26:31 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
61-
"VISITOR_PRIVACY_METADATA\u003dCgJERRIEEgAgMg%3D%3D; Domain\u003d.youtube.com; Expires\u003dSun, 10-Aug-2025 21:26:31 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
62-
"__Secure-ROLLOUT_TOKEN\u003dCKf_-fLDg_2hpwEQz7H508e8iwMYz7H508e8iwM%3D; Domain\u003dyoutube.com; Expires\u003dSun, 10-Aug-2025 21:26:31 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone; Partitioned"
59+
"YSC\u003dmupqqq7Rhmw; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
60+
"VISITOR_INFO1_LIVE\u003d234mLIoJ6gs; Domain\u003d.youtube.com; Expires\u003dWed, 07-Jan-2026 18:17:45 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
61+
"VISITOR_PRIVACY_METADATA\u003dCgJERRIEEgAgKg%3D%3D; Domain\u003d.youtube.com; Expires\u003dWed, 07-Jan-2026 18:17:45 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
62+
"__Secure-ROLLOUT_TOKEN\u003dCLqG97Kf9v3AXxCIlOmctbWOAxiIlOmctbWOAw%3D%3D; Domain\u003dyoutube.com; Expires\u003dWed, 07-Jan-2026 18:17:45 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone; Partitioned"
6363
],
6464
"strict-transport-security": [
6565
"max-age\u003d31536000"
@@ -74,7 +74,7 @@
7474
"0"
7575
]
7676
},
77-
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/af7f576f\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
77+
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/6e20d3a8\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;window[\u0027yt_embedsEnableIframeApiSendFullEmbedUrl\u0027] \u003d true ;window[\u0027yt_embedsEnableAutoplayAndVisibilitySignals\u0027] \u003d true ;window[\u0027yt_embedsEnableIframeApiVideoIdValidation\u0027] \u003d true ;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
7878
"latestUrl": "https://www.youtube.com/iframe_api"
7979
}
8080
}

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/signatures/generated_mock_1.json

Lines changed: 7 additions & 7 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)