@@ -36,7 +36,7 @@ public class YoutubeThrottlingDecrypter {
3636
3737 private static final Pattern N_PARAM_PATTERN = Pattern .compile ("[&?]n=([^&]+)" );
3838 private static final Pattern FUNCTION_NAME_PATTERN = Pattern .compile (
39- "b=a\\ .get\\ (\" n\" \\ )\\ )&&\\ (b=(\\ w +)\\ (b\\ ),a\\ .set\\ (\" n\" ,b\\ )" );
39+ "b=a\\ .get\\ (\" n\" \\ )\\ )&&\\ (b=(\\ S +)\\ (b\\ ),a\\ .set\\ (\" n\" ,b\\ )" );
4040
4141 private static final Map <String , String > nParams = new HashMap <>();
4242
@@ -66,7 +66,21 @@ public YoutubeThrottlingDecrypter() throws ParsingException {
6666
6767 private String parseDecodeFunctionName (final String playerJsCode )
6868 throws Parser .RegexException {
69- return Parser .matchGroup1 (FUNCTION_NAME_PATTERN , playerJsCode );
69+ String functionName = Parser .matchGroup1 (FUNCTION_NAME_PATTERN , playerJsCode );
70+ final int arrayStartBrace = functionName .indexOf ("[" );
71+
72+ if (arrayStartBrace > 0 ) {
73+ final String arrayVarName = functionName .substring (0 , arrayStartBrace );
74+ final String order = functionName .substring (
75+ arrayStartBrace + 1 , functionName .indexOf ("]" ));
76+ final int arrayNum = Integer .parseInt (order );
77+ final Pattern arrayPattern = Pattern .compile (
78+ String .format ("var %s=\\ [(.+?)\\ ];" , arrayVarName ));
79+ final String arrayStr = Parser .matchGroup1 (arrayPattern , playerJsCode );
80+ final String [] names = arrayStr .split ("," );
81+ functionName = names [arrayNum ];
82+ }
83+ return functionName ;
7084 }
7185
7286 @ Nonnull
@@ -87,15 +101,15 @@ private String parseWithParenthesisMatching(final String playerJsCode, final Str
87101
88102 @ Nonnull
89103 private String parseWithRegex (final String playerJsCode , final String functionName ) throws Parser .RegexException {
90- Pattern functionPattern = Pattern .compile (functionName + "=function(.*?}};)\n " ,
104+ final Pattern functionPattern = Pattern .compile (functionName + "=function(.*?}};)\n " ,
91105 Pattern .DOTALL );
92106 return "function " + functionName + Parser .matchGroup1 (functionPattern , playerJsCode );
93107 }
94108
95109 public String apply (final String url ) throws Parser .RegexException {
96110 if (containsNParam (url )) {
97- String oldNParam = parseNParam (url );
98- String newNParam = decryptNParam (oldNParam );
111+ final String oldNParam = parseNParam (url );
112+ final String newNParam = decryptNParam (oldNParam );
99113 return replaceNParam (url , oldNParam , newNParam );
100114 } else {
101115 return url ;
0 commit comments