|
8 | 8 | import javax.annotation.Nonnull; |
9 | 9 | import java.util.HashMap; |
10 | 10 | import java.util.Map; |
| 11 | +import java.util.regex.Matcher; |
11 | 12 | import java.util.regex.Pattern; |
12 | 13 |
|
13 | 14 | /** |
@@ -36,7 +37,7 @@ public class YoutubeThrottlingDecrypter { |
36 | 37 |
|
37 | 38 | private static final Pattern N_PARAM_PATTERN = Pattern.compile("[&?]n=([^&]+)"); |
38 | 39 | private static final Pattern FUNCTION_NAME_PATTERN = Pattern.compile( |
39 | | - "b=a\\.get\\(\"n\"\\)\\)&&\\(b=(\\S+)\\(b\\),a\\.set\\(\"n\",b\\)"); |
| 40 | + "\\.get\\(\"n\"\\)\\)&&\\(b=([a-zA-Z0-9$]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9]\\)"); |
40 | 41 |
|
41 | 42 | private static final Map<String, String> N_PARAMS_CACHE = new HashMap<>(); |
42 | 43 | @SuppressWarnings("StaticVariableName") private static String FUNCTION; |
@@ -97,21 +98,24 @@ public static String apply(final String url, final String videoId) throws Parsin |
97 | 98 |
|
98 | 99 | private static String parseDecodeFunctionName(final String playerJsCode) |
99 | 100 | throws Parser.RegexException { |
100 | | - String functionName = Parser.matchGroup1(FUNCTION_NAME_PATTERN, playerJsCode); |
101 | | - final int arrayStartBrace = functionName.indexOf("["); |
102 | | - |
103 | | - if (arrayStartBrace > 0) { |
104 | | - final String arrayVarName = functionName.substring(0, arrayStartBrace); |
105 | | - final String order = functionName.substring( |
106 | | - arrayStartBrace + 1, functionName.indexOf("]")); |
107 | | - final int arrayNum = Integer.parseInt(order); |
108 | | - final Pattern arrayPattern = Pattern.compile( |
109 | | - String.format("var %s=\\[(.+?)\\];", arrayVarName)); |
110 | | - final String arrayStr = Parser.matchGroup1(arrayPattern, playerJsCode); |
111 | | - final String[] names = arrayStr.split(","); |
112 | | - functionName = names[arrayNum]; |
| 101 | + final Matcher matcher = FUNCTION_NAME_PATTERN.matcher(playerJsCode); |
| 102 | + final boolean foundMatch = matcher.find(); |
| 103 | + if (!foundMatch) { |
| 104 | + throw new Parser.RegexException("Failed to find pattern \"" |
| 105 | + + FUNCTION_NAME_PATTERN + "\""); |
113 | 106 | } |
114 | | - return functionName; |
| 107 | + |
| 108 | + final String functionName = matcher.group(1); |
| 109 | + if (matcher.groupCount() == 1) { |
| 110 | + return functionName; |
| 111 | + } |
| 112 | + |
| 113 | + final int arrayNum = Integer.parseInt(matcher.group(2)); |
| 114 | + final Pattern arrayPattern = Pattern.compile( |
| 115 | + "var " + Pattern.quote(functionName) + "\\s*=\\s*\\[(.+?)];"); |
| 116 | + final String arrayStr = Parser.matchGroup1(arrayPattern, playerJsCode); |
| 117 | + final String[] names = arrayStr.split(","); |
| 118 | + return names[arrayNum]; |
115 | 119 | } |
116 | 120 |
|
117 | 121 | @Nonnull |
|
0 commit comments