Skip to content

Commit 65129e6

Browse files
authored
Merge pull request TeamNewPipe#785 from AbduAmeen/regex_error
Regex error when parsing the Youtube JavaScript code
2 parents a4399fd + 047d75a commit 65129e6

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)